Java从入门到放弃-学习笔记-Hibernate - Go语言中文社区

Java从入门到放弃-学习笔记-Hibernate


个人博客 https://raptor1998.top/

概述

主要是学习Hibernate框架的主要基础知识,以及其结构体系和运行过程,核心组件及其应用。

Hibernate

简介

Hibernate对JDBC进行了轻量级的封装,简单来说,我们在Dao层写代码时对数据库操作就是讲Javabean进行拆分,拼装sql;查询数据时,变将数据库中数据组合,拼装成Javabean。Hibernate就是实现Javabean和数据库列之间的映射关系,从而简化开发。

两个重要概念

数据持久化

数据持久化就是把内存中的数据(对象)永久保存到数据库中,即实现:保存、更新、、删除、查询、加载。
为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID)。

ORM

ORM的全称是Object/Relation Mapping,即对象/关系映射,是一种数据持久化技术,其基本思想是把对象模型(例如:JavaBean对象)与关系数据库的表建立映射关系。

结构体系

结构体系

核心组件

核心组件

运行过程

运行过程

开发环境

插件安装

https://blog.csdn.net/wyy_1208/article/details/78434919

jar包

http://www.hibernate.org/

配置文件

Hibernate配置文件主要用来设置访问数据库所需要的参数。

基于jdbc链接的模板

见文章末仓库地址

c3p0模板

见文章末仓库地址

映射文件

Hibernate的映射文件把一个PO类和一个数据表联系起来。通常一个PO类对应一个映射文件。命名规范:PO类名称.hbm.xml,且与PO类在同一包下。

模板

安装插件后可自动生成

<hibernate-mapping>
    <class name="实体类PO所在的包路径名及类" table="对应数据库中的数据表名">
        <id name="类属性id" type="属性类型">
            <column name="对应表的主键字段" />
            <generator class="生成主键的策略" />
        </id>
        <property name="类属性名" type="该属性的类型">
            <column name="对应该属性在数据表中的字段名" />
        </property>
       <-- 其它类各属性与数据表字段之间的映射关系-->
    </class>
</hibernate-mapping>

hibernate高级特性

Hibernate的Query By Criteria查询

Hibernate把查询条件封装为一个Criteria对象,基于Criteria对象实现查询——Query By Criteria查询(QBC查询)。
基于QBC的查询,其查询基本过程是:

  1. 获取Hibernate的Session对象(假设该对象为session)。
  2. 使用Session实例对象的createCriteria()方法创建Criteria对象。
    语句格式为:
    Criteria对象名=session.createCriteria(Class entityClass);
  3. 把具体的“查询条件对象”,通过Criteria的add()方法加入到Criteria对象中,组合形成查询条件。
  4. 使用Criteria对象的list()方法执行查询,返回查询结果。

QBC_Demo:Vip_Member

Scanner cin = new Scanner(System.in);
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction transaction = null;
		Configuration configuration = new Configuration().configure();
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(configuration.getProperties()).build();
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();

		// (1)创建查询条件的查询对象cr
		Criteria cr = session.createCriteria(Vip_Member.class);
		//条件查询
		//cr.add(Restrictions.like("name", "蜘蛛%"));
		//条件查询
		//cr.add(Restrictions.eq("name", "蜘蛛侠"));
		
		//条件查询+名称排序
		cr.add(Restrictions.like("name", "蜘%"));
		cr.addOrder(Order.asc("name"));
		List<Vip_Member> list = cr.list();
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i).getName());
		}
		
		transaction.commit();
		session.close();
		sessionFactory.close();

QBC查询常用方法

QBC查询常用方法

Native SQL

Native SQL_Demo:Vip_Member

  1. 利用SQLQuery的方法addEntity(),传入实体类。
  2. 若SQL语句是查询语句,则调用SQLQuery的方法list()实现查询。
  3. 若SQL语句是添加、修改、删除语句,则调用SQLQuery的方法 executeUpdate()实现更新操作。
    更新语句格式如下,返回值是更新记录的条数:
    int 返回值变量= SQLQuery的对象.executeUpdate();
String sql="insert into vip_member(name,playUrl,description,score,secondInfo,imageUrl) values('asd','qwe','12',2.2,'333','444')";
		SQLQuery sqlQuery = session.createSQLQuery(sql);
		int flag=sqlQuery.executeUpdate();
		//查询更新内容
		String sql2="select * from vip_member where name = 'asd'";
		sqlQuery = session.createSQLQuery(sql2);
		List<Vip_Member> list =null;
		sqlQuery.addEntity(Vip_Member.class);
		list=sqlQuery.list();
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i).getId());
		}

hibernate实体关联关系映射

应用于班级与学生的信息管理。
文章地址:

hibernate实现对电影信息的操作

基于爬取的爱奇艺电影信息做增删改查。
文章地址:
点我进入

目录

工程目录

HibernateUtil

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public final class HibernateUtil {
	private static SessionFactory sessionFactory;
	private static ThreadLocal<Session> session = new ThreadLocal<Session>();

	private HibernateUtil() {
	}

	static {
		// 第一步:读取Hibernate的配置文件 hibernamte.cfg.xml文件
		Configuration configuration = new Configuration().configure();
		// 第二步:创建服务注册构建器对象,通过配置对象中加载所有的配置信息
		StandardServiceRegistryBuilder regbulider = new StandardServiceRegistryBuilder()
				.applySettings(configuration.getProperties());
		// 创建注册服务
		ServiceRegistry serviceRegistry = regbulider.build();
		// 第三步:创建会话工厂
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);

	}

	public static Session getThreadLocalSession() {
		Session s = (Session) session.get();
		if (s == null) {
			s = sessionFactory.openSession();
			session.set(s);
		}
		return s;
	}	

	public static void closeSession() {
		Session s = (Session) session.get();
		if (s != null) {
			s.close();
			session.set(null);
		}
	}

}

IBaseDao

import java.util.List;

public interface IBaseDao<T> {
	public int insert(T o); // 将对象o,添加到数据库内

	public int insertList(List<T> list); // 将对象集合,添加到数据库内

	public int update(T o); // 利用对象o,修改当前记录

	public int deleteList(Class<T> c, int... ids); // 利用id的集合,删除该集合中对应id的记录。

	public int delete(T o);// 从数据库中删除一个记录o

	public int delete(Class<T> c, int id);// 利用关键字id 从数据库中删除一个记录

	public T findById(Class<T> c, int id); // 利用id,查找一条记录

	public T findOne(String hql, String[] param); // 查询单条记录

	public List<T> find(String hql, String[] param); // 按条件查找多条记录

	public List<T> findPage(String hql, String[] param, int page, int size); // 分页查找所有对象

	public int getCount(String hql, String[] pras);// 返回数据个数

	public List<T> findByFields(String hql, String fields[],String condition); //单字段模糊查找满足条件的所有对象

}

DaoHibernate

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.raptor.db_util.HibernateUtil;

public class DaoHibernate<T> implements IBaseDao<T> {

	@Override
	public int insert(T o) {
		Session s = null;
		Transaction tx = null;
		int result = 0;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.save(o);
			tx.commit();
			result=1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滚
			}
		} finally {
			HibernateUtil.closeSession();
		}		
		return result;
	}

	@Override
	public int insertList(List<T> list) {
		for (T t : list) {
			insert(t);
		}
		return list.size();
	}

	@Override
	public int update(T o) {
		Session s = null;
		int result = 0;
		Transaction tx = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.update(o);
			tx.commit();
			result = 1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滚
			}
		} finally {
			HibernateUtil.closeSession();
		}
		return result;
	}

	@Override
	public int deleteList(Class<T> c, int... ids) {
		for (int id : ids) {
			delete(c, id);
		}
		return ids.length;
	}

	@Override
	public int delete(T o) {
		Session s = null;
		Transaction tx = null;
		int result = 0;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.delete(o);
			tx.commit();
			result = 1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滚
			}
		} finally {
			HibernateUtil.closeSession();
		}
		return result;
	}

	@Override
	public int delete(Class<T> c, int id) {
		Session s = null;
		Transaction tx = null;
		int result = 0;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.delete(s.load(c, id));
			tx.commit();
			result = 1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滚
			}
		} finally {
			HibernateUtil.closeSession();
		}
		return result;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findById(Class<T> c, int id) {
		Session s = null;
		T t = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			t = (T)s.get(c, id);
		} finally {
			HibernateUtil.closeSession();
		}
		return t;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findOne(String hql, String[] param) { // 查询单条记录
		T t = null;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query query = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					query.setParameter(i, param[i]);
				}				
			}
			t = (T) query.uniqueResult();
		} finally {
			HibernateUtil.closeSession();
		}
		return t;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> find(String hql, String[] param) {
		List<T> list = null;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query query = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					query.setParameter(i, param[i]);
				}				
			}
			list = query.list();
		} finally {
			HibernateUtil.closeSession();
		}
		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> findPage(String hql, String[] param, int page, int size) { // 分页查找所有对象
		List<T> list = null;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query query = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					query.setParameter(i, param[i]);
				}
			}
			// 筛选条数
			query.setFirstResult((page - 1) * size);
			query.setMaxResults(size);
			list = query.list();
		} finally {
			HibernateUtil.closeSession();
		}
		return list;
	}

	@Override
	public int getCount(String hql, String[] param) {// 返回数据个数
		int resu = 0;
		Session s = null;
		try
                        
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/C18854805113/article/details/103875053
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢