博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java知识总结-7
阅读量:4982 次
发布时间:2019-06-12

本文共 3797 字,大约阅读时间需要 12 分钟。

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()

转载于:https://www.cnblogs.com/flytwosky/p/6955069.html

你可能感兴趣的文章
《Java程序设计实验》 软件工程18-1,3 OO实验2
查看>>
【Herding HDU - 4709 】【数学(利用叉乘计算三角形面积)】
查看>>
OPENSSL使用方法
查看>>
开发WINDOWS服务程序
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
centos iptables
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
JS验证图片格式和大小并预览
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>