首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate HQL示范一:基本配置及测试查询

2012-11-08 
Hibernate HQL示例一:基本配置及测试查询Hibernate Hql查询:大小写敏感,如:from Student 指的是从Student

Hibernate HQL示例一:基本配置及测试查询

Hibernate Hql查询:

大小写敏感,如:from Student 指的是从Student对象中查询。

示例:

第一步创建数据库hibernate

第二步运行ExportDB.java生成表结构。

第三步运行InitData.java生成数据。

第四步进行其它测试。

?

工具类代码:

package com.bjsxt.hibernate;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;public class ExportDB {public static void main(String[] args) {//读取配置文件Configuration cfg = new Configuration().configure();//创建SchemaExport对象SchemaExport export = new SchemaExport(cfg);//创建数据库表export.create(true,true);}}

?

package com.bjsxt.hibernate;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory factory;private HibernateUtils() {}static {Configuration cfg = new Configuration().configure();factory = cfg.buildSessionFactory();}public static SessionFactory getSessionFactory() {return factory;}public static Session getSession() {return factory.openSession();}public static void closeSession(Session session) {if (session != null) {if (session.isOpen()) {session.close();}}}}

?

package com.bjsxt.hibernate;import java.util.Set;public class Classes {private int id;private String name;private Set students;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set getStudents() {return students;}public void setStudents(Set students) {this.students = students;}}

?

package com.bjsxt.hibernate;import java.util.Date;public class Student {private int id;private String name;    private Date createTime;private Classes classes;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Classes getClasses() {return classes;}public void setClasses(Classes classes) {this.classes = classes;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}}

?

Classes.hbm.xml?

?

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjsxt.hibernate.Classes" table="t_classes"><id name="id"><generator cascade="all" order-by="id"> --> <set name="students" inverse="true"><key column="classid"/><one-to-many name="code"><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjsxt.hibernate.Student" table="t_student"><id name="id"><generator column="classid"/><filter name="idfilter" condition="id &lt; :myid"/></class><query name="searchStudents"><![CDATA[select s from Student s where s.id < ?]]></query><filter-def name="idfilter"><filter-param name="myid" type="integer"/></filter-def></hibernate-mapping>

?

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/hibernate</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">super</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="show_sql">true</property><mapping resource="com/bjsxt/hibernate/Classes.hbm.xml"/><mapping resource="com/bjsxt/hibernate/Student.hbm.xml"/></session-factory></hibernate-configuration>

?上面文件创建完成之后,运行ExportDB.java

数据库中创建两个表格:t_classes,t_student

表结构如下:

mysql> desc t_classes;+-------+--------------+------+-----+---------+----------------+| Field | Type         | Null | Key | Default | Extra          |+-------+--------------+------+-----+---------+----------------+| id    | int(11)      | NO   | PRI | NULL    | auto_increment || name  | varchar(255) | YES  |     | NULL    |                |+-------+--------------+------+-----+---------+----------------+2 rows in set (0.00 sec)mysql> desc t_student;+------------+--------------+------+-----+---------+----------------+| Field      | Type         | Null | Key | Default | Extra          |+------------+--------------+------+-----+---------+----------------+| id         | int(11)      | NO   | PRI | NULL    | auto_increment || name       | varchar(255) | YES  |     | NULL    |                || createTime | datetime     | YES  |     | NULL    |                || classid    | int(11)      | YES  | MUL | NULL    |                |+------------+--------------+------+-----+---------+----------------+4 rows in set (0.00 sec)

?

为了作测试生成数据类InitData.java如下:

package com.bjsxt.hibernate;import java.text.SimpleDateFormat;import java.util.Date;import org.hibernate.Session;public class InitData {public static void main(String[] args) {Session session = HibernateUtils.getSession();try {session.beginTransaction();for(int i=0; i<10; i++){Classes classes = new Classes();classes.setName("班级"+i);session.save(classes);for(int j=0; j<10; j++){Student student = new Student();student.setName("班级"+i+"的学生"+j);student.setCreateTime(randomDate("2007-01-01","2007-03-01"));//在内存中建立由student指向classes的引用student.setClasses(classes);session.save(student);}}for(int i=0; i<5; i++){Classes classes = new Classes();classes.setName("无学生班级"+i);session.save(classes);}for(int i=0; i<10; i++){Student student = new Student();student.setName("无业游民"+i);session.save(student);}session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally{HibernateUtils.closeSession(session);}}/** * 获取随机日期 * @param beginDate 起始日期,格式为:yyyy-MM-dd * @param endDate 结束日期,格式为:yyyy-MM-dd * @return */private static Date randomDate(String beginDate,String endDate){try {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Date start = format.parse(beginDate);Date end = format.parse(endDate);if(start.getTime() >= end.getTime()){return null;}long date = random(start.getTime(),end.getTime());return new Date(date);} catch (Exception e) {e.printStackTrace();}return null;}private static long random(long begin,long end){long rtn = begin + (long)(Math.random() * (end - begin));if(rtn == begin || rtn == end){return random(begin,end);}return rtn;}}

?以下开始做测试:

测试类1:SimpleObjectQueryTest.java

package com.bjsxt.hibernate;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import junit.framework.TestCase;/** * 对象查询的基本测试 * @author Administrator * */public class SimpleObjectQueryTest extends TestCase {public void testQuery1() {Session session = null;try {session = HibernateUtils.getSession();//可以忽略select语句List students = session.createQuery("from Student").list();for (Iterator iter = students.iterator();iter.hasNext();) {//返回值是Student对象Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}}public void testQuery2() {Session session = null;try {session = HibernateUtils.getSession();//可以忽略select语句,表可以加别名List students = session.createQuery("from Student s").list();for (Iterator iter = students.iterator();iter.hasNext();) {//返回值是Student对象Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}}public void testQuery3() {Session session = null;try {session = HibernateUtils.getSession();//可以忽略select语句,表可以加别名List students = session.createQuery("from Student as s").list();for (Iterator iter = students.iterator();iter.hasNext();) {//返回值是Student对象Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}}public void testQuery4() {Session session = null;try {session = HibernateUtils.getSession();//使用select关键字时,必须定义别名List students = session.createQuery("select s from Student s").list();for (Iterator iter = students.iterator();iter.hasNext();) {//返回值是Student对象Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}}public void testQuery5() {Session session = null;try {session = HibernateUtils.getSession();//不支持select * ....这样的HQL查询语句List students = session.createQuery("select * from Student").list();for (Iterator iter = students.iterator();iter.hasNext();) {//返回值是Student对象Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}}}

?

上面测试中得到的结论:

做查询时,可以忽略select语句;表可以加别名;使用select关键字时,必须定义别名;不支持select * ....这样的HQL查询语句

?

?

热点排行