hibernate 查询、二级缓存、连接池
查询:
1) 主键查询
Dept dept = (Dept) session.get(Dept.class, 12);
Dept dept = (Dept) session.load(Dept.class, 12);
2) 对象导航查询
Dept dept = (Dept) session.get(Dept.class, 12);
System.out.println(dept.getDeptName());
System.out.println(dept.getEmps());
3) HQL查询
注意:使用hql查询的时候 auto-import="true" 要设置true,
如果是false,写hql的时候,要指定类的全名
Query q = session.createQuery("from Dept");
System.out.println(q.list());
a. 查询全部列
Query q = session.createQuery("from Dept"); OK
Query q = session.createQuery("select * from Dept"); NOK, 错误,不支持*
Query q = session.createQuery("select d from Dept d"); OK
System.out.println(q.list());
b. 查询指定的列 【返回对象数据Object[] 】
Query q = session.createQuery("select d.deptId,d.deptName from Dept d");
System.out.println(q.list());
c. 查询指定的列, 自动封装为对象 【必须要提供带参数构造器】
Query q = session.createQuery("select new Dept(d.deptId,d.deptName) from Dept d");
System.out.println(q.list());
d. 条件查询: 一个条件/多个条件and or/between and/模糊查询
条件查询: 占位符
Query q = session.createQuery("from Dept d where deptName=?");
q.setString(0, "财务部");
q.setParameter(0, "财务部");
System.out.println(q.list());
条件查询: 命名参数
Query q = session.createQuery("from Dept d where deptId=:myId or deptName=:name");
q.setParameter("myId", 12);
q.setParameter("name", "财务部");
System.out.println(q.list());
范围
Query q = session.createQuery("from Dept d where deptId between ? and ?");
q.setParameter(0, 1);
q.setParameter(1, 20);
System.out.println(q.list());
模糊
Query q = session.createQuery("from Dept d where deptName like ?");
q.setString(0, "%部%");
System.out.println(q.list());
e. 聚合函数统计
Query q = session.createQuery("select count(*) from Dept");
Long num = (Long) q.uniqueResult();
System.out.println(num);
f. 分组查询
-- 统计t_employee表中,每个部门的人数
数据库写法:SELECT dept_id,COUNT(*) FROM t_employee GROUP BY dept_id;
HQL写法
Query q = session.createQuery("select e.dept, count(*) from Employee e group by e.dept");
System.out.println(q.list());
连接查询
1) 内连接 【映射已经配置好了关系,关联的时候,直接写对象的属性即可】
Query q = session.createQuery("from Dept d inner join d.emps");
2) 左外连接
Query q = session.createQuery("from Dept d left join d.emps");
3) 右外连接
Query q = session.createQuery("from Employee e right join e.dept");
q.list();
迫切内连接 【使用fetch, 会把右表的数据,填充到左表对象中!】
Query q = session.createQuery("from Dept d inner join fetch d.emps");
q.list();
2) 迫切左外连接
Query q = session.createQuery("from Dept d left join fetch d.emps");
q.list();
HQL 放到映射文件中
Query q = session.getNamedQuery("getAllDept");
q.setParameter(0, 10);
分页查询:
// 从记录数
ScrollableResults scroll = q.scroll(); // 得到滚动的结果集
scroll.last(); // 滚动到最后一行
int totalCount = scroll.getRowNumber() + 1;// 得到滚到的记录数,即总记录数
// 设置分页参数
q.setFirstResult(0);
q.setMaxResults(3);
用线程的方式创建session
//getCurrentSession 创建或者获取session
// 线程的方式创建session
// 一定要配置:
<property name="hibernate.current_session_context_class">thread</property>
Session session3 = sf.getCurrentSession();// 创建session,绑定到线程
Session session4 = sf.getCurrentSession();// 从当前访问线程获取session
【Hbm对C3P0连接池支持】
#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
【Hbm对C3P0连接池支持, 核心类】
告诉hib使用的是哪一个连接池技术。
#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
二级缓存:
#hibernate.cache.use_second_level_cache false【二级缓存默认不开启,需要手动开启】
#hibernate.cache.use_query_cache true 【开启查询缓存】
## choose a cache implementation 【二级缓存框架的实现】
二级缓存,使用步骤
1) 开启二级缓存
2)指定缓存框架
3)指定那些类加入二级缓存
<class-cache usage="read-only"/> 放入二级缓存的对象,只读;
<class-cache usage="nonstrict-read-write"/> 非严格的读写
<class-cache usage="read-write"/> 读写; 放入二级缓存的对象可以读、写;
<!--****************** 【二级缓存配置】****************** -->
<!-- a. 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- b. 指定使用哪一个缓存框架(默认提供的) -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- c. 指定哪一些类,需要加入二级缓存 -->
<class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/>
<class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/>
<!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] -->
<collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>