• hibernate 查询、二级缓存、连接池


    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"/>

                       

  • 相关阅读:
    关于fill_parent ,wrap_content ,match_parent区别
    开发第六天
    开发第五天
    关于Android创建虚拟机出现Failed to allocate memory: 8解决办法
    第十一周总结
    开发第四天
    开发第三天
    开发第二天
    开发第一天
    用户场景分析
  • 原文地址:https://www.cnblogs.com/core404/p/5863137.html
Copyright © 2020-2023  润新知