Hibernate学习笔记
1.初识hibernate
-
创建表
User(id,username,password)
-
导入jar包
Hibernatejar包 require下的jar包 Mysql 驱动
-
核心配置文件
<!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:///hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 控制台打印生气了语句 --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- 当SessionFactory调用getCurrentSession方法时需要绑定线程 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 添加映射文件 --> <mapping resource="com/zjb/domain/User.hbm.xml"/> </session-factory> </hibernate-configuration>
-
实体类映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2017-9-11 11:06:56 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping package="com.zjb.domain"> <class name="User" table="user" dynamic-insert="true" dynamic-update="true"> <id name="id" column="id" > <!-- 指定主键生成策略 1、increment:数据库自己维护主键,自动生成先从表中查询最大的id值,再将id值+1,作为新的主键演示案例:新增记录 2、identity:依赖数据库的主键自增功能演示案例:在创建表时需要勾选主键自动增长 3、sequence:序列orcale数据库维护主键的方式 4、hilo:hibernate使用自定义的算法维护主键,了解 5、native:三选一(identity/sequence/hilo) 6、assigned:手动设置,自己维护主键当主键是自然主键时可以使用演示案例:测试时将主键自动增长的勾选去掉,设置主键的值 7、uuid,生成32位的字符串作为主键演示案例:将表中的id设置为32位长度的字符串注意修改持久化类中的属性类型及数据表中的字段 --> <generator class="assigned"></generator> </id> <property name="username" column="username" ></property> <property name="password" column="password"></property> </class> </hibernate-mapping>
-
demo
@Test public void test01() { //加载配置文件 Configuration cfg = new Configuration().configure("hibernate.cfg.xml"); // 创建连接 SessionFactory factory = cfg.buildSessionFactory(); // 获取连接 Session session = factory.openSession(); //开启事务 Transaction tx = session.beginTransaction(); //save //User user = new User(); //user.setUsername("kate"); //user.setPassword("123456"); //session.save(user); //update //User user = session.get(User.class, 7); //user.setPassword("123456"); //session.update(user); //delete User user = session.get(User.class, 1); session.delete(user); //seletc,get是立即执行,load是懒加载 User user = session.get(User.class, 1); System.out.println(user); user = session.load(User.class, 1); System.out.println(user); //提交事务 tx.commit(); // 释放资源 session.close(); factory.close(); }
2.hibernate全局配置文件
-
对上面的补充
-
方言,通知hibernate,当前数据库类型
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
-
hbm2ddl生成数据库表结构策略
- update 存在且结构一直不做修改,否则修改
- create 都创建
- create-drop 运行前创建,运行后删除
- validate 只验证表结构,不通过就报错
<property name="hibernate.hbm2ddl.auto">update</property>
3.实体类映射文件
- 对上面的补充
- 在set中配置
- inverse,放弃维护关系
- 默认为false
- 在谁的映射文件中配置为true,谁就放弃了维护关系的权利
- cascade,级联操作
- save-update级联保存和保存
- delete
- lazy
- proxy,看对方
- fetch
- select
- subselect
- join
- inverse,放弃维护关系
- 在class中配置
- lazy延迟加载
- false关闭
- true开启
- extra及其懒惰,只有count()才会查询所有
- lazy延迟加载
###4.对象状态
- 瞬时,对象刚创建,与session和数据库都没有关系
- 持久,对象与数据库和session都有关系
- 托管,对象与数据库有关系,与session没有关系
5.一级缓存,
- session缓存默认开启
- hql查询不缓存
- hql和原生sql查询所有对象,然后咋查询单个对象发生缓存
6.关联查询
-
一对多配置(实体类映射文件)
-
一的一方配置(用户)
<set name="orders">//customer实体类中有orders属性 <key column="cid"></key>//customer在order表中的外键 <one-to-many class="Order"/> </set>
-
多的一方配置(订单)
<many-to-one name="customer" column="cid" class="Customer" ></many-to-one>
-
-
多对多配置
-
多的一方(学生)
<set name="courses" table="t_student_course"> <key column="sid"></key> <many-to-many class="Course" column="cid"></many-to-many> </set>
-
多的一方(课程)
<set name="students" table="t_student_course"> <key column="cid"></key> <many-to-many class="Student" column="sid"></many-to-many> </set>
-
-
一对一配置
-
一的一方(人)
<one-to-one name="idCard" class="IdCard" property-ref="person"></one-to-one>
-
一的一方(身份证)
<many-to-one name="person" column="pid" class="Person" unique="true"></many-to-one>
-
7.hql查询语句
-
select
List<Customer> list = session.createQuery("from Customer").list(); List<Customer> list2 = session.createQuery("from Customer c").list(); List<Customer> list3 = session.createQuery("select c from Customer c").list();
-
join
-
内连接
Query query = session.createQuery("from Customer c inner join c.orders"); List<Object[]> list = query.list();
-
左外连接
Query query = session.createQuery("from Customer c left outer join c.orders"); List<Object[]> list = query.list();
-
右外连接
Query query = session.createQuery("from Customer c right outer join c.orders"); List<Object[]> list = query.list();
-
8.整合C3P0
-
引入jar包
-
修改全局配置文件
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <!-- 配置连接池参数 #hibernate.c3p0.max_size 2 #hibernate.c3p0.min_size 2 #hibernate.c3p0.timeout 5000 #hibernate.c3p0.max_statements 100 #hibernate.c3p0.idle_test_period 3000 #hibernate.c3p0.acquire_increment 2 #hibernate.c3p0.validate false --> <property name="hibernate.c3p0.max_size">20</property>
9.引入二级缓存
-
导包
-
引入二级缓存配置文件
-
修改全局配置文件
//开启 <property name="hibernate.cache.use_second_level_cache">true</property> //配置缓存提供商 <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> //开启查询缓存 <property name="hibernate.cache.use_query_cache">true</property>