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,输出

  1. 学生信息如下:
  2. name:张三 birthday:1982-01-01
  3. his teachers as follows:
  4. teacher name:Jerry
  5. teacher name:Tom
  6. name:李四 birthday:1983-02-02
  7. his teachers as follows:
  8. teacher name:Jerry
  9. name:王五 birthday:1984-03-03
  10. his teachers as follows:
  11. teacher name:Tom
  12. name:赵六 birthday:1985-04-04
  13. his teachers as follows:
  14. 老师信息如下:
  15. name:Jerry subject:语文
  16. his students as follows:
  17. student name:张三
  18. student name:李四
  19. name:Tom subject:数学
  20. his students as follows:
  21. student name:张三
  22. student name:王五
  23. name:Steven subject:英语
  24. his students as follows:

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

iBATIS的多对多映射配置的情况就向你介绍到这里,希望对你有所帮助。

iBATIS的多对多 数据库设计及实现的更多相关文章

  1. 第二天ci项目规划 数据库设计

    第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...

  2. 优化MySchool数据库设计之【巅峰对决】

    优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...

  3. 优化MySchool数据库设计总结

    数据库的设计   一:什么是数据库设计? 数据库设计就是将数据库中的数据实体以及这些数据实体之间的关系,进行规范和结构化的过程. 二:为什么要实施数据库设计? 1:良好的数据库设计可以有效的解决数据冗 ...

  4. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

  5. 数据库设计与 ER 模型 - 数据库系统原理

    数据库系统生存周期 数据库应用系统的开发是一项软件工程,一般具有信息的采集.组织.加工.抽取.综合.传播等功能,但又有自己的特点,所以称为 数据库工程. 数据库应用系统从开始规划.设计.实现.维护到最 ...

  6. S2--《优化MySchool数据库设计》总结

    第一章    数据库的设计 1.1  数据库设计 数据库中创建的数据库结构的种类,以及在数据实体之间建立的复杂关系是决定数据库系统效率的重要因素. 糟糕的数据库设计表现在以下两个方面: *效率低下 * ...

  7. MySQL 数据库设计 笔记与总结(1)需求分析

    数据库设计的步骤 ① 需求分析 ② 逻辑设计 使用 ER 图对数据库进行逻辑建模 ③ 物理设计 ④ 维护优化 a. 新的需求进行建表 b. 索引优化 c. 大表拆分 [需求分析] ① 了解系统中所要存 ...

  8. MySQL优化技巧之四(数据库设计中的一些技巧)

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  9. SQL Server 数据库设计

    一.数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表与表之间的关系比较复杂,那我们就需要进行规范的数据库设置.如果不经过数据库的设计,我们构建的数据库不 ...

随机推荐

  1. JSTL判断list的size()大小

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ tag ...

  2. IE6下整站的bug详解

    <1>文字不居中:加一个行高: <2>png文件作为背景不显示: <!--[if IE 6]> <script src="js/DD_belated ...

  3. js框架——angular.js(3)

    1. 过滤filter 过滤就是将内容进行筛选或者转换或者两者都有,一般的表示方式就是在变量后面添加"|",然后加上过滤条件,如—— {{name|currency}} 这个cur ...

  4. HDU 4460 Friend Chains(map + spfa)

    Friend Chains Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  5. Override/implements methods 如何添加

    用过Eclipse 的ADT的都知道,要快速添加override或者implements方法,右键---Source---Override/Implements Method... 中文:右键---& ...

  6. spark中groupByKey与reducByKey

    [译]避免使用GroupByKey Scala Spark 技术   by:leotse 原文:Avoid GroupByKey 译文 让我们来看两个wordcount的例子,一个使用了reduceB ...

  7. CodeForces 567B Berland National Library

    Description Berland National Library has recently been built in the capital of Berland. In addition, ...

  8. Telepro工具注册码

    Teleport Pro v1.54 注册码 Teleport Pro v1.54姓名(Name):3ddown.com序列号(Serial):161594593

  9. asp 自我定时删除

    <% if now()>"2008-9-15" thenset myfso=server.CreateObject("scripting.filesystem ...

  10. ThinkPHP3.2.3版本框架could not find driver错误

    ThinkPHP3.2.3版本框架could not find driver错误 在更新ThinkPHP框架 3.2.3 时出现错误 解决方法如下: 修改php.ini文件 extension=php ...