1.定义
Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式被称为命名查询。
2.创建表结构并添加测试数据
create table `student` ( `id` double , `age` double , `name` ) ); ','张三'); ','李四'); ','李四'); ','王五');
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端
客户端