Hibernate总结

xiaoxiao2021-02-28  11

hibernate总结:

(1)hibernate(orm)入门(实体类+映射文件+核心配置文件)

a>orm的理解

orm(object relation mapping ) 对象的名字 表名 对象的属性名称 列名 对象属性类型 列的类型

b>hibernate工程搭建步骤:(一个实体+一个映射文件+一个核心配置文件)

-->导入/lib/required/目录下的jar+mysql连接驱动+日志相关jar -->创建实体customer(类不能加上final+有主键+提供get/set方法+无参构造) -->创建实体映射文件Customer.hbm.xml(hibernate-mapping/class/id+property) -->创建核心配置文件Hibernate.cfg.xml(hibernate-configuration/session-factory/property) *注意:xml文件头信息需要手动复制一下,解决xml红色圈圈以及提示需要手动在本地引入约束文件

c>测试操作数据

Configuration-->Sessionfactory-->Session(get/get,save,update,delete) 增加:save(customer); 修改:update(customer); 删除:delete(customer); 查询:get(xx.class,1l)+load(xx.class,1l); *注意: 1. get方法采用的是立即加载;load是延迟加载 get方法执行到该行代码的时候,马上发送SQL语句进行查询。 load只有真正使用这个对象的时候(使用这个对象的普通属性的时候)才会发送SQL语句。 2. get方法查询之后返回的是真实对象本身;load方法返回的是该实体对象的代理对象 3. get方法查询一个找不到的对象返回null;load方法查询不到的对象会出现一个exception。

(2)详细讲解:映射文件+核心配置文件

映射文件Customer.hbm.xml: <hibernate-mapping> <class> <id name="" column=""> <generator class="native/sequence/increment"/> </id> <property name="" column=""></property> </class> <hibernate-mapping> 核心配置文件hibernate.cfg.xml: <hibernate-configuration> <session-factory> <property name="" column=""></property> <mapping resource=""/> </session-factory> <hibernate-configuration> *注意:hibernate核心配置文件中hibernate.hbm2ddl.auto=create/update 1. create: 不管数据库表是否存在,每次只要加载配置文件(大家在执行一次test测试方法的时候不就是每次去加载配置文件么), 都会创建一个新的表,执行完表操作之后,都会看到表中数据变化。但是下次再去执行测试方法(即又加载了配置文件)又会重新创建表; 2. update: 数据库中没有表,就创建表;有表看表中结构和我们定义的实体映射文件表结构是否一致,不一致就做alter table操作;

(3)hibernate核心类(Configuration+SessionFactory+Session+Trasaction,首先理解,然后再去操作怎么得到该对象)

a>Configuration(加载配置文件的配置)

//默认去加载src下面的hibernate.cfg.xml文件,在加载核心配置文件的时候要保证加载实体映射文件 Configuration configure=new Configuration().configure(); 注意:不需要去记住该对象,该对象负责记载hibernate的核心配置文件

b>SessionFactory(生产Session的工厂)

sessionFactory=configuration.buildSessionFactory(); 注意:对该SessionFacotry的理解就是封装了连接数据库信息的对象。

c>Session(操作数据库的Session会话)

session是一个非线程安全的对象 与线程绑定 造成线程不安全问题=多线程+全局变量 使用ThreadLocal 仅仅是其中一种解决方案 Session session=sessionFactory.openSession();// 操作完数据库之后需要手动关闭session Session session=sessionFactory.getCurrentSession(); // 从当前线程中获取session,session操作完数据库之后,不需要手动关闭session 注意:session对象是hibernate框架非常重要得一个对象,该对象可以完成增删改查+事务创建+各种查询对象的创建。 session对象是jdbc中的connection对象的封装。

d>Transaction(操作数据库的事务)

// 开启事务,获取的事务对象 Transaction transaction=session.beginTransaction(); *注意:session操作就是一个事务,hibernate默认是hibernate.connection.autocommit=false也即并非自动提交事务 注意:在写save()/update()/delete(),官方建议手动书写session.beginTransaction(),session.commit()/session.rollback();

(4)hibernate常见的查询类型

a>Query(hql查询接口)

1. HQL:hibernate的query语言(面向对象的角度去设计这个类似于sql的查询化语言) HQL语句中根本看不到跟表相关任何信息 select from where group by having order by 2. HQL语句书写 *HQL语句1:from Customer *HQL语句2:select name,address from Customer; 部分对象属性封装 *HQL语句3:from Customer where name=? 过滤 where Query query =session.createQuery(hql); 3. Query对象常见的方法 *查询所有:list() 通用 *分页查询:setFirstResult(),setMaxResults() limit (pageNum-1)*pageSize,pageSize *占位符赋值:setParameter(0,给第1个参数赋值) *获取唯一对象:uniqueResult() 通用 4. 数据封装 *通过List<Object[]>,这里Object[]封装了name和address值 *通过投影的方式 new Customer(name,address) 在Customer对象中需要提供该有参构造

b>SQLQuery(sql查询也叫做本地sql查询)

1. sql语句 select from where group by having order by limit SQLQuery sqlQuery=session.createSQLQuery(sql); 注意:SqlQuery对象继承了Query对象 2. SqlQuery对象常用的方法 *查询所有:list() *占位符赋值:setParameter(0,给第1个参数赋值) *获取唯一对象:uniqueResult() *分页查询:setFirstResult(),setMaxResults() 3. 数据封装 select * from t_customer *使用List<Object[]> 所有列的值封装到了一个Object[]中了 *封装成对象:sqlQuery.addEntity(Customer.class);去封装查询数据

c>Criteria(条件条件接口QBC)掌握

1. QBC查询 Criteria criteria=session.createCriteria(Customer.class); 2. Restrictions 条件有关都封装进去了 Restrictions是对where后面连接符号的封装(>,<,between,and,or,in,not等封装) Projects是对聚合函数的封装 Order是对排序的封装# 欢迎使用Markdown编辑器写博客
转载请注明原文地址: https://www.6miu.com/read-2650356.html

最新回复(0)