今天我们做一个多表查询。
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()如果能调用出来显示就说明,关联成功!
}
}
}
总结:利用这个方法我们可以查询出多表的信息但是有缺点的,这样我查询一个表,就等于查询了多个表的信息,这样就会导致性能下降!!!
分享到:
相关推荐
hibernate多表联合查询实例,很经典的查询语句和总结.
hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的
Hibernate连表查询 Hibernate连表查询
该源代码配了了解释,针对hibernate中多表查询的多种形式进行了总结,很有价值,有Object[]形式的查询,也有对象方式的查询 也有集合list形式的查询,
Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页
Hibernate多对多关联添加及查询示例
NULL 博文链接:https://gaoquanyang.iteye.com/blog/1213765
Hibernate 多表映射关系配置 如,一对一 多对一 多对多等
使用Struts2+Hibernate实现对部门表、员工表两张表的增删改查。
hibernate实现动态表查询的多种解决方案.自行整理的动太实现方案,总有一个适合你.
NULL 博文链接:https://08284008.iteye.com/blog/1456476
Hibernate中使用Criteria Query各种QBC查询
Hibernate多表查询.txt
利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
Hibernate_QBC查询
Hibernate_query查询数据表中的一个字段.
struts2+hibernate+spring多表操作
Hibernate中的关联查询实际上生成的是数据库表连接查询的SQL语句
hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL