一.Hibernate
1.Hibernate是一个轻量级的JavaEE应用的持久层框架,它用于实现DAO,是一个关系型数据库ORM框架
2.ORM(Object Relational Mapping):对象关系映射,ORM就是通过java对象映射到数据库表(二维关系表),通过操作java对象,就可以完成对数据库表的操作.
3.Hibernate就是让程序员通过操作对象的方式来操作数据库中的表.
4.POJO(Plain Ordinary Java Object)简单的java对象,定义了属性及其getter和setter方法,没有业务逻辑.
5.编写hbm映射文件,通常一个表对应一个hbm映射文件,hbm文件中定义了POJO类和表的映射关系.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zjl.domain">
<class name="CstCustomer" table="cst_customer">
<id name="custId" column="cust_id">
<generator class="native"></generator>
</id>
<property name="custName" column="cust_name"></property>
<property name="custSource" column="cust_source"></property>
<property name="custIndustry" column="cust_industry"></property>
<property name="custLevel" column="cust_level"></property>
<property name="custAddress" column="cust_address"></property>
<property name="custZip" column="cust_zip"></property>
<property name="custPhone" column="cust_phone"></property>
<property name="custFax" column="cust_fax"></property>
<property name="custWebsite" column="cust_website"></property>
<property name="custCorporation" column="cust_corporation"></property>
<property name="custMemo" column="cust_memo"></property>
</class>
</hibernate-mapping>
6.编写主配置文件:hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 第一部分:数据库基本配置 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/crm_hibernate_test
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- 配置数据库方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--第二部分: hibernate基本配置 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 自动生成DDL
根据映射产生表结构的类型:
create-drop:没有表结构创建,下次启动时删除重新创建。适合学习阶段
create:只做创建
update:探测表结构够的变化,对于数据库没有的,进行更新操作。适合学习阶段
validate:对比与数据库的结构
none:什么都不会做
数据库必须自己手动创建,hibernate不会创建 -->
<property name="hibernate.hbm2ddl.auto">none</property>
<!--第三部分:映射配置 -->
<mapping resource="com/zjl/domain/CstCustomer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
二.XML文件的配置方式
1.连接数据库的基本信息与方言
*hibernate.dialect ---配置数据库的方言
*hibernate.connection.driver_class --连接数据库的驱动程序
*hibernate connection.url --连接数据库的URL
*hibernate.connection.username ---连接数据库的用户名
*hibernate connection password ---连接数据库的密码
2.可选属性
*hibernate.show_sql --控制台上输出sql语句
*hibernate.format_sql --格式化控制台上输出的sql 语句
*hibernate hbm2ddl.auto --生成DDL的策略
*create --每次都会创建一个新的表(测试的时候)
*create-drop --每次都会创建一个新的表,每次执行结束的时候,就会把这个表删除(测试的时候);
*update --如果没有表,就会创建一个新表,如果有了表,就会更新表结构,
*validate
--校验映射和表中的字段是否一致,如果不一致就会报错
(实际开发中用update 和 validate )
3.映射文件的加载:
*<mapping resource="映射文价的路径"/>
三.加载配置文件/获取工厂类和session类
1.加载配置文件
Configuration cfg = new Configuration(); cfg.configure();
2.生成工厂类:SessionFactory factory = cfg.buildSessionFactory();
3.生成session:Session session = factory.getSession();
4.开启事务: Transaction tran = session.beginTransaction();
四.Hibernate的执行流程:
五.Hibernate相关API
1.Configuration:配置对象,用来加载配置文件
*作用:用来加载配置文件,默然只会加载类的根路径下的配置文件
*常用方法:
*默认构造方法:默认只会加载类的根路径下的hibernate.properties文件,不会加载xml文件.
*configure:该方法会加载类的根路径下的hibernate.cfg.xml配置文件
*addClass:手动指定类的字节码文件,目的也是指定映射文件
*手动指定映射文件的位置
要求:映射文件命名必须符合规范:实体类名称.hbm.xml
2.SessionFactory类
*作用;就是用来生产session对象的,SessionFactory的是由configuration来生成的
*常用方法:
*openSession():每次打开一个新的session对象
*openCurrentSession():从当前线程上获取一个session对象
*说明:
*该对象维护着应用中所有的映射文件信息;
*它还维护了一些预定义的SQL语句,(全字段插入,全字段更新,根据id查询,查询所有)
*维护着连接数据库的信息,hibernate的基本配置
*维护着hibernate中的二级缓存
*所有由该工厂生产的session,共享工厂中的数据
*
.SessionFactory是线程安全的,
*.使用原则:
hibernate是一个重量级的对象,里面维护了很多信息,不应该随意的创建和销毁,一个应用最好只有一个SessionFactory
3.Session连接对象
*作用:对数据库进行增删改查和开启事务的操作,是我们使用频率最高的一个对象
*常用方法:
*save() --保存一个对象
*persist() --保存一个对象,是由JPA提供,
*update() --更新一个对象
*saveOrUpdate() --保存或者更新一个对象
*delete() --删除一个对象
*merge() --合并两个对象
*get()/load() --根据主键查询
*createQuery() --
HQL查询
*createSQLQuery() --数据库操作对象
*createCriteria() --条件查询
*close() --关闭连接
*clear() --清除以及缓存
*evict(Object entity) --清除以及缓存中的指定对象
*refresh(Object entity) --使用数据库中的数据更新以及缓存中指定的实体
*flush() --清除一级缓存,并用缓存中的数据去更新数据库中的数据
*session使用原则:保证一个线程只有一个session
*说明:
*session对象是一个轻量级的,绝大多数信息是由SessionFactory来维护的,
*它的创建和销毁不会消耗太多的资源
*session对象不是线程安全的
*session维护者hibernate中的一级缓存
4.Transaction:事务
*作用:针对事务的控制
*常用方法:
*commit() --提交事务
*rollback() --回滚事务
*hibernate的事务是默认不自动提交的
5.Query:查询
Query执行HQL语句:
// 1.查询所有记录
/*Query query = session.createQuery("from CstCustomer");
List<Customer> list = query.list();
System.out.println(list);*/
// 2.条件查询:
/*Query query = session.createQuery("from Customer where custName = ?");
query.setString(0, "小郑");
List<Customer> list = query.list();
System.out.println(list);*/
// 3.条件查询:
/*Query query = session.createQuery("from Customer where custName = : custName and age = :custAge");
query.setString("custName", "小郑");
query.setInteger("custAge", 25);
List<Customer> list = query.list();
System.out.println(list);*/
// 4.分页查询:
Query query = session.createQuery("from Customer");
query.setFirstResult(3);
query.setMaxResults(3);
List<Customer> list = query.list();
System.out.println(list);
六.知识点
1.实体类
不要用
final
修饰
,
如果将实体类
用
final
修饰将无法生成代理对象
2.hibernate中的OID:
在hibernate中区分两个对象是不是同一个:靠的是对象唯一标示符(OID)
3.主键生成策略:
*自然主键:具有业务含义的字段作为主键
*代理主键:不具有业务含义的字段作为主键
七.一级缓存
1.hibernate框架中共有两级缓存:Session级别的缓存属于一级缓存,SessionFactory级别的缓存是二级缓存
2.缓存:就是将数据库或者硬盘中的数据存入到内存中,当下次使用的时候可以从内存中获取,减少对数据库的访问次数.(在优化方面)
3.快照机制:在事务提交的时候,执行快照机制,用缓存和快照进行比较,如果不一致,使用缓存更新数据库中的数据,同时刷新缓存和快照,
保证数据库中的数据和一级缓存中的数据一致
八.持久化对象的四中状态:
1.瞬时状态(Transient) 持久状态(Persistent) 脱管状态(Detached) 删除状态(Delete)
2.常说的hibernate的三种状态
*临时状态:用new语句创建
,标识:OID为null,没有和session建立关系
*持久化状态:标识:OID不为null,建立了和session的关系
*脱管状态:OID不为null,没有和session建立关系
3.Session对象的生命周期与本地线程的绑定
在hibernate.hbm.xml中配置:
<property name="hibernate.current_session_context_class">thread</property>
*hibernate中提供sessionFactory.getCurrentSession()创建一个session和threadLocal绑定方法