今天我们做一个多表查询。
1首先准备两张表,一张是学生信息表,一张是课程表。建表语句:
CREATE TABLE `test`.`classinfo` (
`classname` varchar(20) NOT NULL DEFAULT '',
`classid` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`classid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULTCHARSET=gbk;
CREATE TABLE `test`.`student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`classid` int(11) DEFAULT NULL,
`name` varchar(45) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULTCHARSET=gbk;
这是量表的表表结构。我们知道这两张表具有关联关系。他们具有相同的classid。
那么如何利用hibernate实现对2表的查询呢?
实现代码如下:
第一建两张表的映射类分别是:
packagecom.fish.domain;
public class Classinfo {
public String classname;
public int classid;
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
}
第二个类:
packagecom.fish.domain;
public class Student {
public int id;
public int classid;
public String name ;
public Classinfo classinfo;//这里做一个和上面表的的关联。
publicClassinfo getClassinfo() {
return classinfo;
}
public void setClassinfo(Classinfo classinfo) {
this.classinfo = classinfo;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
publicString getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
下面写两个关与表和类关联的类的xml
第一个xml。
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.domain.Classinfo"table="classinfo">
<id name="classid">
<column name="classid"></column>
<type name="java.lang.Integer"></type>
</id>
<property name="classname" column="classname"type="java.lang.String"></property>
</class>
</hibernate-mapping>
第二个xml
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.domain.Student"table="student">
<id name="id">
<column name="id"></column>
<type name="java.lang.Integer"></type>
</id>
<property name="classid" column="classid"type="java.lang.Integer"></property>
<property name="name" column="name"type="java.lang.String"></property>
<many-to-one name="classinfo"column="classid" update="false"
insert="false"></many-to-one>//首先要明白多个学生可以选一个课程。所以是多对一的关系,classid是两个表共同属性。在做关联的时候,对表示不允许插入和修改的所以为false
</class>
</hibernate-mapping>
最后做一个和数据关联的xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">330127</property>
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="show_sql">false</property>
<mapping resource="com/fish/domain/student.hbm.xml"/>//注册student已经关联上了
<mapping resource="com/fish/domain/classinfo.hbm.xml"/>//同理
</session-factory>
</hibernate-configuration>
下面做一个测试类
packagecom.fish.domain;
importjava.util.ArrayList;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
public class Test {
public static void main(String[] args) {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactory factory =configuration.buildSessionFactory();
Sessionsession= factory.openSession();
Queryquery= session.createQuery("from Student");//利用插学生表就可以拖带课程表
ArrayList<Student> list= (ArrayList<Student>)query.list();
for(int i=0;i<list.size();i++){
System.out.println( list.get(i).getName()+"****"+list.get(i).getClassinfo().getClassname());//这句话的list.get(i).getClassinfo().getClassname()如果能调用出来显示就说明,关联成功!
}
}
}
总结:利用这个方法我们可以查询出多表的信息但是有缺点的,这样我查询一个表,就等于查询了多个表的信息,这样就会导致性能下降!!!