zoukankan      html  css  js  c++  java
  • Hibernate 命名查询

       1.定义

      Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式被称为命名查询。

     2.创建表结构并添加测试数据

    create table `student` (
    
    
    `id` double ,
    
    
        `age` double ,
    
    
        `name` varchar (96)
    
    
    );
    
    
    insert into `student` (`id`, `age`, `name`) values('1','20','张三');
    
    
    insert into `student` (`id`, `age`, `name`) values('2','21','李四');
    
    
    insert into `student` (`id`, `age`, `name`) values('3','21','李四');
    
    
    insert into `student` (`id`, `age`, `name`) values('4','22','王五');

      3.建立持久化类和配置文件

           3.1hibernate.cfg.xml配置文件

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!-- 方言类 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="connection.url">
                jdbc:mysql://localhost:3306/test
            </property>
            <!--连接MySQL的用户名 -->
            <property name="connection.username">root</property>
            <!--连接MySQL的密码 -->
            <property name="connection.password">root</property>
            <!--连接MySQL的驱动类名 -->
            <property name="connection.driver_class">
                com.mysql.jdbc.Driver
            </property>
            <property name="current_session_context_class">thread</property>
            <!--以格式良好的方式显示SQL语句 -->
            <property name="format_sql">true</property>
            <!--显示SQL语句 -->
            <property name="show_sql">true</property>
            <!-- 表结构更新机制 -->
            <property name="hbm2ddl.auto">update</property>
            <mapping resource="cn/entity/student.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

          3.2student.hbm.xml配置文件

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- package Student实体类所在的包 -->
    <hibernate-mapping package="cn.entity">
    <!-- name:包名 table:表名 -->
    <class name="Student" table="STUDENT">
    <!-- name:stuNo对应 表中的一列,一般是主键列-->
    <id name="id">
      <generator class="native" />
    </id>
    <property name="age"  column="age" />
    <property name="name" column="name"/>
    </class>
    <!-- 命名查询(named query查询);
    根据学生编号查询学生信息
     -->
     <query name="byIdFindStu1">
         <!-- hql语句形式的 -->
        <![CDATA[
            from Student s where s.id=:id
        ]]>
     </query>
     <sql-query name="byIdFindStu2">
        <!-- 本地化sql的形式 -->
        <![CDATA[
          select {stu.*}  from Student  stu where stu.id=? 
        ]]>
        <!-- 指定别名让stu和实体有所关联 -->
        <return alias="stu" class="cn.entity.Student" />
     </sql-query>
    </hibernate-mapping>

    4.HibernateUtis工具类

    /**
     * 工具类
     * @author happy
     *
     */
    public class HibernateUtils {
        //getCurrentSession()底层实现原理
        //ThreadLocal变量
        public static final ThreadLocal<Session> threadTL=new ThreadLocal<Session>();
        
       //我想直接调用一个方法,获取Session
       //定义一个sessionFactory对象
        private static SessionFactory factory;
        private static Configuration cfg;
        static{
            cfg=new Configuration().configure();
            factory=cfg.buildSessionFactory();
        }
        //提供一个静态方法
        public static Session currentSession(){
            Session session=threadTL.get();
            if(session==null){  //当前线程中没有session对象
                session=factory.openSession();
                threadTL.set(session);
            }
            return session;
            
        }
        //关闭session
        public static void closeSession(){
            //获取线程中的session
            Session session = threadTL.get();
            if (session!=null) {
                threadTL.set(null);
                session.close();
            }
        }
        
    }

    5.测试类

    /**
     * 学生的测试类
     * @author hyj
     *
     */
    public class StudentTest {
       
        /*
         * Hql形式的命名查询
         */
       @Test
       public void HqlNamedQuery(){
           //01.通过HibernateUtils工具类的currentSession方法获取和当前线程绑定的session
           Session session = HibernateUtils.currentSession();
           //02.通过命名查询的方式创建query对象
           Query query = session.getNamedQuery("byIdFindStu1");
           //03.传递参数,获取结果
           Student stu=(Student)query.setParameter("id",4).list().get(0);
           System.out.println("学生编号:"+stu.getId()+",学生年龄:"+stu.getAge()+",学生姓名:"+stu.getName()+"");
           //04.关闭sessiong
           HibernateUtils.closeSession();
       }
       /**
        *  本地SQL命名查询
        */
       @Test
       public void SqlNameQuery(){//01.通过HibernateUtils工具类的currentSession方法获取和当前线程绑定的session
       Session session = HibernateUtils.currentSession();
       //02.通过命名查询的方式创建query对象
       Query query = session.getNamedQuery("byIdFindStu2");
       //03.传递参数,获取结果
       Student stu=(Student)query.setParameter(0,4).list().get(0);
       System.out.println("学生编号:"+stu.getId()+",学生年龄:"+stu.getAge()+",学生姓名:"+stu.getName()+"");
       //04.关闭sessiong
       HibernateUtils.closeSession();
       }
      
    }

    6.测试结果

    DB端

     

    客户端

     

  • 相关阅读:
    支付功能测试用例设计要点
    接口测试用例设计实践总结
    如何高效学习
    性能测试基础总结和自己的理解
    linux安装AWStats业务数据分析工具
    python3登陆接口测试
    Python2和Python3中urllib库中urlencode的使用注意事项
    运用BT在centos下搭建一个博客论坛
    python环境搭建-requests的简单安装(适合新手)
    web 资源好文
  • 原文地址:https://www.cnblogs.com/hyjj/p/6249010.html
Copyright © 2011-2022 走看看