hql 查询
内连接:
from Entity inner join [fetch] Entity.property忽略fetch 关键字,我们得到的结果集中,每行数据都是一个Object 数组fetch表名表明”右表”对象读出后立即填充到对应的“左表”对象中。左外连接:from Entity left join [fetch] Entity.propertysession.createQuery("from District d left join fetch d.streets s");Hibernate的右外联接语法如下from Entity right join [fetch] Entity.propertyfrom 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)读取并解析映射文件,创建SessionFactorySessionFactory sf = conf.buildSessionFactory();(3)打开SessionSession session = sf.openSession();(4)开始一个事务(增删改必须,查询操作可选)Transaction tx = session.beginTransaction();(5)数据库操作。session.save(user);//或者其他操作session.save(tea);(6)提交事务(回滚事务)tx.commit();//tx.rollback();(7)关闭sessionsession.close();
持久化:
我们以面向对象的方式组织程序,瞬时的数据也以对象的形式存在,而持久的数据多保存在关系型数据库中。所以,在通常情况下,持久化要完成的操作就是把对象保存到关系型数据库中,或者把关系型数据库中的数据读取出来以对象的形式封装。模块测试:添加junit需要的jar包在测试方法的上方写入@TestOutline视图选择要执行的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/saveAndUpdateinverse 是否由one方主动管理外键 true 由多方管理外键
查询
全部 得到对象 一列 得到(字符串)集合 多列 得到对象数组集合 得到对象条件查询 占位 数字从 0 开始 命名参数绑定 封装参数绑定 setproperties()