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编辑器写博客