hql 查询
内连接:
from Entity inner join [fetch] Entity.property
忽略fetch 关键字,我们得到的结果集中,每行数据都是一个Object 数组
fetch表名表明”右表”对象读出后立即填充到对应的“左表”对象中。
左外连接:
from Entity left join [fetch] Entity.property
session.createQuery("from District d left join fetch d.streets s");
Hibernate的右外联接语法如下
from Entity right join [fetch] Entity.property
from District d right join fetch d.streets s
查询单个字段:
也就是需要的数据只是实体对象的某个属性,HQL也可以简单的做到
String hql =“select s.name from Street s”;
List.get(0).getClass()
对于实体单个属性的查询,Hibernate返回的对象都是该属性的类型
查询多个字段:
取了id和name的属性内容。返回的List对象中,每个条目都是一个对象数组(Object[]),每个Object数组中依次保存我们所获取的属性数据。
经验:为了使返回的结果更加符合面向对象风格,可以通过在HQL中动态构造对象实例的方法对数据进行封装。
可以采用如下HQL语句:
“select new Street (id,name) from Street“
这样返回的List对象中将保存Street对象。但必须在Street类中添加一个以id和name属性为参数的构造方法
distinct:去重
什么是缓存
在磁盘上的数据放到内存中一份,我们读取的时候先从缓存中读取,没有再去磁盘上找
Hibernate缓存作用
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能
缓存分类
一级缓存(内部缓存)Session:对象
二级缓存:SessionFactory:对象
一级缓存介绍:
一级缓存又称为“Session的缓存”,它是内置的,不能被卸载 在第一级缓存中,采用的是Key-Value的MAP方式来实现的。在缓存实体对象时,对象的主关键字ID是MAP的Key,实体对象就是对象的值。所以说一级缓存是以实体对象为单位进行存储的。由session 自动管理
,使用同一 session 查找同一对象时,只对数据库查询一次--使用 key-value 形式存储对象, key 是 oid ,value 是对象,不能被卸载 (ehcath)
二级缓存作用
二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略 默认关闭 使用第三方插件
sessionFactory 缓存(二级缓存):
hql 查询的 list 方法 : 只会从三级缓存中查询 不会从 1 2 级缓存中查询
iterate 方法 会使用 1 2 缓存 ,不会使用三级缓存 先查询所有ID 用到再查询得到 类
配置二级缓存
1.首先导入ehcache.jar二级缓存包。
2.然后,在 src 下添加ehcache.xml配置,
3.同时,在hibernate.cfg.xml中启用二级缓存
<property name="hibernate.cache.use_second_level_cache"> true</property>
<property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider</property>。
4.:指定使用二级缓存缓存哪种类型的对象,在hbm.xml中添加<cache region="sampleCache1" usage="read-only"/>
Hibernate数据库访问的步骤:
1)读取并解析配置文件
Configuration conf = new Configuration().configure();
(2)读取并解析映射文件,创建SessionFactory
SessionFactory sf = conf.buildSessionFactory();
(3)打开Session
Session session = sf.openSession();
(4)开始一个事务(增删改必须,查询操作可选)
Transaction tx = session.beginTransaction();
(5)数据库操作。
session.save(user);//或者其他操作
session.save(tea);
(6)提交事务(回滚事务)
tx.commit();//tx.rollback();
(7)关闭session
session.close();
持久化:
我们以面向对象的方式组织程序,瞬时的数据也以对象的形式存在,而持久的数据多保存在关系型数据库中。所以,在通常情况下,持久化要完成的操作就是把对象保存到关系型数据库中,或者把关系型数据库中的数据读取出来以对象的形式封装。
模块测试:
添加junit需要的jar包
在测试方法的上方写入@Test
Outline视图选择要执行的Test方法右键run as 选择junit Test
配置文件示例
实体类:
<hibernate-mapping>
<class name="cn.jbit.houserent.bean.User" table="users" schema="jbit">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="password" type="java.lang.String" >
<column name="password" />
</property>
<property name="telephone" type="java.lang.String" >
<column name="telephon” />
</property>
<property name="username" type="java.lang.String" >
<column name="username" />
</property>
</class>
</hibernate-mapping>
总配置文件; 名字必须是 hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test
</property>
<property name="connection.username">root</property>
<property name="connection.password">dgt</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">my</property>
<property name="show_sql">true</property>
<mapping resource="com/bawei/bean/ZUserrole.hbm.xml" />
<mapping resource="com/bawei/bean/ZUser.hbm.xml" />
</session-factory>
</hibernate-configuration>
**********************
lizy 配置对象的加载模式 lizy="true" 即时加载
cascade 是否级联操作 all/delete/none/saveAndUpdate
inverse 是否由one方主动管理外键 true 由多方管理外键
查询
全部 得到对象
一列 得到(字符串)集合
多列 得到对象数组集合 得到对象
条件查询
占位 数字从 0 开始
命名参数绑定
封装参数绑定 setproperties()