ibatis多对多映射

ibatis的多对多映射配置方法和多对一映射配置方法差不多,不同的是,多对多映射,数据库设计上需要一个记录两个类关系的中间表,本文以学生-老师为例,在ibatis的sqlmap中配置多对多关系。

1,建表。数据库中三个表,分别为:

 CREATE TABLE [student] (
 [id] [int] IDENTITY (1, 1) NOT NULL ,
 [name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [birthday] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 CONSTRAINT [PK_student] PRIMARY KEY  CLUSTERED
 (
  [id]
 )  ON [PRIMARY]
) ON [PRIMARY]
GO
--------------------------------------------------
CREATE TABLE [teacher] (
 [id] [int] IDENTITY (1, 1) NOT NULL ,
 [name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [subject] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 CONSTRAINT [PK_teacher] PRIMARY KEY  CLUSTERED
 (
  [id]
 )  ON [PRIMARY]
) ON [PRIMARY]
GO
---------------------------------------------------
CREATE TABLE [student_teacher] (
 [studentid] [int] NOT NULL ,
 [teacherid] [int] NOT NULL ,
 CONSTRAINT [PK_student_teacher] PRIMARY KEY  CLUSTERED
 (
  [studentid],
  [teacherid]
 )  ON [PRIMARY]
) ON [PRIMARY]
GO

2,准备数据

insert into student(name,birthday) values('张三','1982-01-01')
insert into student(name,birthday) values('李四','1983-02-02')
insert into student(name,birthday) values('王五','1984-03-03')

insert into student(name,birthday) values('赵六','1985-04-04')
insert into teacher(name,subject) values('Jerry','语文')
insert into teacher(name,subject) values('Tom','数学')

insert into teacher(name,subject) values('Steven','英语')
insert into student_teacher(studentid,teacherid) values(1,1)
insert into student_teacher(studentid,teacherid) values(1,2)
insert into student_teacher(studentid,teacherid) values(2,1)
insert into student_teacher(studentid,teacherid) values(3,2)

3,properties文件内容如下:
 driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
 url=jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=ibatistest
 username=sa
 password=000

4,总配置文件SqlMapConfig.xml内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

 <properties resource="com/lsm/cfg/jdbc.properties" />
 <transactionManager type="JDBC">
  <dataSource type="SIMPLE">
   <property value="${driver}" name="JDBC.Driver" />
   <property value="${url}" name="JDBC.ConnectionURL" />
   <property value="${username}" name="JDBC.Username" />
   <property value="${password}" name="JDBC.Password" />
  </dataSource>
 </transactionManager>
 <sqlMap resource="com/lsm/domain/Student.xml" />
 <sqlMap resource="com/lsm/domain/Teacher.xml" />

</sqlMapConfig>
   

5,domain对象两个,Student 和 Teacher,如下:

 //Teacher.java
package com.lsm.domain;
import java.util.List;
public class Teacher
{
 private int id;
 private String name;
 private String subject;
 private List students; //注意这里有个List类型的students,表示一个老师对应多个学生
 
 public List getStudents()
 {
  return students;
 }
 public void setStudents(List students)
 {
  this.students = students;
 }
 //省略掉其他的getter and setter
}

//Student.java
package com.lsm.domain;

import java.util.List;

public class Student
{
 private int id;
 private String name;
 private String birthday;
 private List teachers; //这里有一个list类型的teachers,表示一个学生有多个老师
 
 public List getTeachers()
 {
  return teachers;
 }
 public void setTeachers(List teachers)
 {
  this.teachers = teachers;
 }
 //省略掉其他的getter and setter
}

6,sqlmap配置文件

Teacher.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
   
    <sqlMap namespace="teacher">
        <typeAlias alias="Teacher" type="com.lsm.domain.Teacher" />
  <typeAlias alias="Student" type="com.lsm.domain.Student" />
  
  <resultMap class="Teacher" id="teacherBasicResultMap">
   <result property="id" column="id"/>
   <result property="name" column="name"/>
   <result property="subject" column="subject"/>
  </resultMap>
  <!-- 下面这个resultMap中有个students属性,这个结果映射继承自上面的结果映射
   由于有了继承,结果映射可以任意扩展-->
  <resultMap class="Teacher" id="teacherWithTeacherResultMap" extends="teacherBasicResultMap">
   <result property="students" column="id" select="getStudentsByTeacherId"/>
  </resultMap>
  <!-- 这个查询中使用到了上面定义的结果映射,从而决定了查询出来的Teacher中关联出相关的students,在student.xml中配置相似,不再注释。-->
  <select id="getTeachers" resultMap="teacherWithTeacherResultMap">
   <!--[CDATA[
    select * from teacher
   ]]>
  </select>
  
  <select id="getStudentsByTeacherId" resultClass="Student">
   <![CDATA[
    select s.* from student s,student_teacher st where s.id=st.studentid and st.teacherid=#value#   ]]-->
  </select>
       
    </sqlMap>

Student.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
   
    <sqlMap namespace="student">
        <typeAlias alias="Student" type="com.lsm.domain.Student" />
  <typeAlias alias="Teacher" type="com.lsm.domain.Teacher" />
  
  <resultMap class="Student" id="studentBasicResultMap">
   <result property="id" column="id"/>
   <result property="name" column="name"/>
   <result property="birthday" column="birthday"/>
  </resultMap>
  
  <resultMap class="Student" id="studentWithTeacherResultMap" extends="studentBasicResultMap">
   <result property="teachers" column="id" select="getTeachersByStudentId"/>
  </resultMap>
  
  <select id="getStudents" resultMap="studentWithTeacherResultMap">
   <!--[CDATA[
    select * from student
   ]]>
  </select>
  
  <select id="getTeachersByStudentId" resultClass="Teacher">
   <![CDATA[
    select t.* from teacher t,student_teacher st where t.id=st.teacherid and st.studentid=#value#   ]]-->
  </select>
       
    </sqlMap>

7,测试

 package com.lsm.test;

import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.lsm.domain.Student;
import com.lsm.domain.Teacher;

public class Many2Many
{

 private static SqlMapClient sqlMapClient = null;
 static
 {
  try
  {
   Reader reader = Resources.getResourceAsReader("com/lsm/cfg/SqlMapConfig.xml");
   sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 /**
  * @param args
  */
 public static void main(String[] args)
 {
  Many2Many m2m = new Many2Many();
  List studentlist = null;
  studentlist = m2m.getStudentInfo();
  for(int i=0;i<studentlist.size();i++)
  {
   Student s = new Student();
   s = (Student) studentlist.get(i);
   System.out.println("name:"+s.getName() + "/t" + "birthday:"+s.getBirthday());
   List tlist = s.getTeachers();
   if(tlist!=null)
   {
    System.out.println("his teachers as follows:");
    {
     for(int ti=0;ti<tlist.size();ti++)
     {
      Teacher t = new Teacher();
      t = (Teacher) tlist.get(ti);
      System.out.println("teacher name:" + t.getName());
     }
    }
   }
  }
  
  List teacherlist = null;
  teacherlist = m2m.getTeacherInfo();
  for(int i=0;i<teacherlist.size();i++)
  {
   Teacher t = new Teacher();
   t = (Teacher) teacherlist.get(i);
   System.out.println("name:"+t.getName() + "/t" + "subject:" + t.getSubject());
   List slist = t.getStudents();
   if(slist!=null)
   {
    System.out.println("his students as follows:");
    for(int si=0;si<slist.size();si++)
    {
     Student s = new Student();
     s = (Student) slist.get(si);
     System.out.println("student name:"+s.getName());
    }
   }
  }
 }
 
 // 获取学生信息
 public List getStudentInfo()
 {
  List studentList = null;
  try
  {
   System.out.println("学生信息如下:");
   studentList = sqlMapClient.queryForList("getStudents");
  }
  catch (SQLException e)
  {
   e.printStackTrace();
  }
  return studentList;
 }
 
 // 获取老师信息
//  获取学生信息
 public List getTeacherInfo()
 {
  List studentList = null;
  try
  {
   System.out.println("老师信息如下:");
   studentList = sqlMapClient.queryForList("getTeachers");
  }
  catch (SQLException e)
  {
   e.printStackTrace();
  }
  return studentList;
 }

}

8,输出

学生信息如下:
name:张三 birthday:1982-01-01
his teachers as follows:
teacher name:Jerry
teacher name:Tom
name:李四 birthday:1983-02-02
his teachers as follows:
teacher name:Jerry
name:王五 birthday:1984-03-03
his teachers as follows:
teacher name:Tom
name:赵六 birthday:1985-04-04
his teachers as follows:
老师信息如下:
name:Jerry subject:语文
his students as follows:
student name:张三
student name:李四
name:Tom subject:数学
his students as follows:
student name:张三
student name:王五
name:Steven subject:英语
his students as follows:

 

查询学生时带出老师信息,查询老师时带出学生信息,说明多对多映射成功。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值