hibernate对多表的查询

本文介绍了如何使用Hibernate实现多表查询,通过创建学生信息表和课程表的映射类及XML配置文件,实现了从学生表中查询时关联课程表,从而获取到学生及其对应的课程信息。测试结果显示关联成功,但这种方法可能导致性能下降。
摘要由CSDN通过智能技术生成

今天我们做一个多表查询。

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()如果能调用出来显示就说明,关联成功!

 }

}

}

总结:利用这个方法我们可以查询出多表的信息但是有缺点的,这样我查询一个表,就等于查询了多个表的信息,这样就会导致性能下降!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值