zoukankan      html  css  js  c++  java
  • 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"/>

                       

  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/core404/p/5863137.html
Copyright © 2011-2022 走看看