iBATIS的多对多映射配置方法和多对一映射配置方法差不多,不同的是,多对多映射,数据库设计上需要一个记录两个类关系的中间表,本文以学生-老师为例,在iBATIS的sqlmap中配置多对多关系。
iBATIS的多对多映射配置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
iBATIS的多对多映射配置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)
iBATIS的多对多映射配置3,properties文件内容如下:
- driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
- url=jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=ibatistest
- username=sa
- password=000
iBATIS的多对多映射配置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﹥
iBATIS的多对多映射配置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
- }
iBATIS的多对多映射配置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﹥
- tudent.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﹥
iBATIS的多对多映射配置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:
查询学生时带出老师信息,查询老师时带出学生信息,说明多对多映射成功。
iBATIS的多对多映射配置的情况就向你介绍到这里,希望对你有所帮助。
【编辑推荐】