Hibernate中的高级特性
来源:互联网 发布:天津工业大学网络教学 编辑:程序博客网 时间:2024/05/18 00:03
Hibernate的核心配置文件
在src下创建一个hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?><hibernate-configuration> <session-factory> <!-- 必须去配置的属性 --> <!-- 配置数据库连接的基本信息: --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate3_day01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <!-- Hibernate的方言 --> <!-- 生成底层SQL不同的 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 可选的属性 --> <!-- 显示SQL --> <property name="hibernate.show_sql">true</property> <!-- 格式化SQL --> <property name="hibernate.format_sql">true</property> <!-- hbm:映射 to DDL: create drop alter --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 通知Hibernate加载那些映射文件 --> <mapping resource="cn/itcast/hibernate3/demo1/Customer.hbm.xml"/> <!--可选的配置: hibernate.show_sql true 在控制台上输出SQL语句 hibernate.format_sql true 格式化控制台输出的SQL语句 hibernate.connection.autocommit true 事务是否自动提交 hibernate.hbm2ddl.auto create/create-drop/update/validate * create :每次执行的时候,创建一个新的表.(如果以前有该表,将该表删除重新创建.) 一般测试的时候的使用. * create-drop :每次执行的时候,创建一个新的表,程序执行结束后将这个表,删除掉了. 一般测试的时候使用. * update :如果数据库中没有表,创建一个新的表,如果有了,直接使用这个表.可以更新表的结构. * validate :会使用原有的表.完成校验.校验映射文件与表中配置的字段是否一致.不一致报错.--> <!--在Hibernate中使用c3p0连接池: * 引入c3p0的jar包 * 在核心配置中添加一段配置: <!-- C3P0连接池设定--> <!-- 使用c3po连接池 配置连接池提供的供应商--> <!--<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property> <!--在连接池中可用的数据库连接的最少数目 --> <!--<property name="c3p0.min_size">5</property> <!--在连接池中所有数据库连接的最大数目 --> <!--<property name="c3p0.max_size">20</property> <!--设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 --> <!--<property name="c3p0.timeout">120</property> <!--每3000秒检查所有连接池中的空闲连接 以秒为单位--> <!--<property name="c3p0.idle_test_period">3000</property>--> </session-factory> </hibernate-configuration>
创建ORM的映射文件
映射文件只要是一个XML格式文件就可以.名字任意.
* 通常情况下名称规范:
* 实体类名称.hbm.xml
<?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> <!-- 建立类与表的映射 --> <!-- class标签:用于映射类与表的关系 name :类的全路径 table:表名称 --> <class name="cn.itcast.hibernate3.demo1.Customer" table="customer"> <!-- 建立类中属性与表中的字段映射 --> <!-- 唯一标识 --> <!-- 使用id的标签 配置唯一属性 --> <!-- 在<id>标签中配置一个主键的生成策略. --> <id name="id" column="id"> <generator class="native"/> </id> <!-- 普通属性 --> <!-- property标签:映射类中的普通属性 name:类中的属性名称, column:表中字段名称 --> <!-- type:三种写法 * Java类型 :java.lang.String * Hibernate类型 :string * SQL类型 :不能直接使用type属性,需要子标签<column> * <column name="name" sql-type="varchar(20)"/> --> <property name="name" column="name" type="string"/> <property name="age" column="age"/> </class> </hibernate-mapping>
使用Demo
//向数据库中插入一条记录@Test // 向数据库中插入一条记录 public void demo1(){ // 1.Hiberante框架加载核心配置文件(有数据库连接信息) Configuration configuration = new Configuration().configure(); // 2.创建一个SessionFactory.(获得Session--相当连接对象) SessionFactory sessionFactory = configuration.buildSessionFactory(); // 3.获得Session对象. Session session = sessionFactory.openSession(); // 4.默认的情况下,事务是不自动提交. Transaction tx = session.beginTransaction(); // 5.业务逻辑操作 // 向数据库中插入一条记录: Customer customer = new Customer(); customer.setName("任童"); customer.setAge(28); session.save(customer); // 6.事务提交 tx.commit(); // 7.释放资源 session.close(); sessionFactory.close(); }
CRUD操作
保存记录
session.save(customer);
根据主键进行查询
Customer customer = (Customer)session.get(Customer.class ,1);Customer customer = (Customer)session.load(Customer.class,1);
修改记录
session.update(customer);//修改有两种方式 :// 5.1手动创建对象的方式Customer customer = new Customer();customer.setId(2);customer.setName("苍老师");session.update(customer);//这种方式如果没有设置的属性,将这个属性的默认值存入了.(不好.)//先查询在修改的方式(推荐方式)Customer customer = (Customer) session.get(Customer.class, 1);customer.setName("凤姐");session.update(customer);
删除记录
session.delete(customer);删除记录有两种方式://手动创建对象的方式Customer customer = new Customer();customer.setId(2);session.delete(customer);//先查询再删除的方式Customer customer = (Customer)session.get(Customer.class, 1);session.delete(customer);
查询所有
HQL:HQL:Hibernate Query Language.面向对象的写法:Query query = session.createQuery("from Customer where name = ?");query.setParameter(0, "苍老师");Query.list();QBC:Query By Criteria.(条件查询)Criteria criteria = session.createCriteria(Customer.class);criteria.add(Restrictions.eq("name", "凤姐"));List<Customer> list = criteria.list();SQL:SQLQuery query = session.createSQLQuery("select * from customer");List<Object[]> list = query.list();SQLQuery query = session.createSQLQuery("select * from customer");query.addEntity(Customer.class);List<Customer> list = query.list();
Hibernate的抓取策略
从一的一方关联多的一方:
<set>
- fetch:控制sql语句的类型
- join :发送迫切左外连接的SQL查询关联对象.fetch=”join”那么lazy被忽略了.
- select :默认值,发送多条SQL查询关联对象.
subselect :发送子查询查询关联对象.(需要使用Query接口测试)
lazy:控制关联对象的检索是否采用延迟.
- true :默认值, 查询关联对象的时候使用延迟检索
- false :查询关联对象的时候不使用延迟检索.
- extra :及其懒惰.
* 如果fetch是join的情况,lazy属性将会忽略.
在多的一方关联一的一方:
<many-to-one>
- fetch:控制SQL语句发送格式
- join :发送一个迫切左外连接查询关联对象.fetch=”join”,lay属性会被忽略.
- select :发送多条SQL检索关联对象.
- lazy:关联对象检索的时候,是否采用延迟
- false :不延迟
- proxy :使用代理.检索订单额时候,是否马上检索客户 由Customer对象的映射文件中上lazy属性来决定.
- no-proxy :不使用代理
获取线程绑定的session
- 在Hibernate.cfg.xml中配置一个:
thread - 使用SessionFactory中的getCurrentSession();方法.
- 底层就是ThreadLocal.
- 当前线程中的session不需要进行关闭,线程结束后自动关闭!
Hibernate一级缓存
一级缓存中快照区
向一级缓存存入数据的时候,放入一级缓存区和一级缓存快照区,当更新了一级缓存的数据的时候,事务一旦提交,比对一级缓存和快照区,如果数据一致,不更新,如果数据不一致,自动更新数据库
管理一级缓存
一级缓存是与session的生命周期相关的.session生命周期结束,一级缓存销毁了.
* clear()/evict()/flush()/refresh()管理一级缓存.
* clear() :清空一级缓存中所有的对象.
* evict(Object obj) :清空一级缓存中某个对象.
* flush() :刷出缓存.
* refresh(Object obj):将快照区的数据重新覆盖了一级缓存的数据.
Hibernate二级缓存
二级缓存分区
1、类级别二级缓存区域
2、集合级别二级缓存区域
3、时间戳缓存区域
适合放入二级缓存中的数据:
- 很少被修改
- 不是很重要的数据, 允许出现偶尔的并发问题
不适合放入二级缓存中的数据:
- 经常被修改
- 财务数据, 绝对不允许出现并发问题
- 与其他应用数据共享的数据
配置Ehcache缓存
1、拷贝ehcache-1.5.0.jar到当前工程的lib目录下,依赖 backport-util-concurrent 和 commons-logging
2、开启二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
3、指定缓存的供应商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property
4、配置缓存哪些实体类
在hibernate.cfg.xml文件中配置(建议)
<class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/><class-cache class="cn.itcast.c3p0.Order" usage="read-write"/><!-- 配置集合级别的二级缓存 --><collection-cache collection="cn.itcast.c3p0.Customer.orders" usage="read-write"/>
5、配置ehcache默认的配置文件ehcache.xml(名字固定)(放在类路径下)
<diskStore path="D:\cache" /><cache name="" maxElementsInMemory="10000" eternal="true" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpriyThreadIntervalSeconds="120" /></ehcache>
cache元素的属性
name:设置缓存的名字,它的取值为类的全限定名或类的集合的名字
maxElementsInMemory :设置基于内存的缓存中可存放的对象最大数目
eternal:设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false
timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。
timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值
overflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
diskPersistent 当jvm结束时是否持久化对象 true false 默认是false
diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
Hibernate查询缓存
查询缓存依赖于二级缓存
查询缓存可以缓存属性!!!!
对于希望启用查询缓存的查询语句, 调用 Query 的 setCacheable(true) 方法
hibernate 配置文件中启用查询缓存
<property name=“hibernate.cache.use_query_cache">true</property>
- Hibernate中的高级特性
- hibernate高级特性_1
- Hibernate高级特性
- Hibernate一些高级特性
- Hibernate基本特性和高级特性
- Django中的Python高级特性
- GCD中的一些高级特性
- GCD中的一些高级特性
- Hibernate学习笔记之高级特性
- Hibernate高级特性以及性能优化
- Hibernate高级特性的随堂笔记
- javascript中的高级特性及特别对象
- Java中的枚举类型-2:高级特性
- smarty中的高级特性(-) 对象的使用
- Python中的列表生成器与高级特性
- Hibernate关联操作、查询操作、高级特性、并发处理机制
- hibernate中的update方法的特性
- 高级特性
- concat(),concat_ws()与group_concat()函数
- Spring导出可以运行的jar包
- 记一次使用Okhttp遇到的坑!!!
- RBAC权限设计实例
- EditText文字输入飞入效果
- Hibernate中的高级特性
- Jackcess
- android developer tiny share-20160817
- PHP知识点
- 冒泡排序及其优化
- Mysql数据库的优化方法
- 疯狂Android讲义-----第一章 Android应用的基本组件介绍
- 文本特征选择之互信息和卡方
- HTTP协议理解