iBATIS的多对多 数据库设计及实现
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的多对多映射配置的情况就向你介绍到这里,希望对你有所帮助。
iBATIS的多对多 数据库设计及实现的更多相关文章
- 第二天ci项目规划 数据库设计
第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...
- 优化MySchool数据库设计之【巅峰对决】
优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...
- 优化MySchool数据库设计总结
数据库的设计 一:什么是数据库设计? 数据库设计就是将数据库中的数据实体以及这些数据实体之间的关系,进行规范和结构化的过程. 二:为什么要实施数据库设计? 1:良好的数据库设计可以有效的解决数据冗 ...
- MySQL 性能优化 30个数据库设计的最佳实践
数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...
- 数据库设计与 ER 模型 - 数据库系统原理
数据库系统生存周期 数据库应用系统的开发是一项软件工程,一般具有信息的采集.组织.加工.抽取.综合.传播等功能,但又有自己的特点,所以称为 数据库工程. 数据库应用系统从开始规划.设计.实现.维护到最 ...
- S2--《优化MySchool数据库设计》总结
第一章 数据库的设计 1.1 数据库设计 数据库中创建的数据库结构的种类,以及在数据实体之间建立的复杂关系是决定数据库系统效率的重要因素. 糟糕的数据库设计表现在以下两个方面: *效率低下 * ...
- MySQL 数据库设计 笔记与总结(1)需求分析
数据库设计的步骤 ① 需求分析 ② 逻辑设计 使用 ER 图对数据库进行逻辑建模 ③ 物理设计 ④ 维护优化 a. 新的需求进行建表 b. 索引优化 c. 大表拆分 [需求分析] ① 了解系统中所要存 ...
- MySQL优化技巧之四(数据库设计中的一些技巧)
1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...
- SQL Server 数据库设计
一.数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表与表之间的关系比较复杂,那我们就需要进行规范的数据库设置.如果不经过数据库的设计,我们构建的数据库不 ...
随机推荐
- 得到root,并且获取密码
第一次使用ubuntu的时候 先使用这个命令 sudo passwd root 然后就可以改密码了
- spice up your desktop
https://wiki.gnome.org/Projects/GnomeShell/CheatSheet windows10用了一段时间,回来看着gnome3-shell是那么的恶心,翻来翻去重新整 ...
- 最短路径问题/Spfa
题目链接 题目描述 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线, 则输出花费最少的. 最后一行是两个数 s,t;起 ...
- PHP 实现定时任务的几种方法
一. 简单直接不顾后果型 <?php ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limi ...
- ALAssetsLibrary 照片相关 浅析
ALAssetsLibrary 提供了访问iOS设备下”照片”应用下所有照片和视频的接口: 从 ALAssetsLibrary 中可读取所有的相册数据,即 ALAssetsGroup 对象列表: 从每 ...
- 基于Sublime Text搭建Python IDE
http://loosky.net/2967.html(包括SublimeREPL插件的安装和设置快捷键) SublimeCodeIntel,智能提示功能,查找自定义函数引用的快捷键--Alt+鼠标左 ...
- HDU 5768 Lucky7 (容斥原理 + 中国剩余定理 + 状态压缩 + 带膜乘法)
题意:……应该不用我说了,看起来就很容斥原理,很中国剩余定理…… 方法:因为题目中的n最大是15,使用状态压缩可以将所有的组合都举出来,然后再拆开成数组,进行中国剩余定理的运算,中国剩余定理能够求出同 ...
- UVALive 2035 The Monocycle(BFS状态处理+优先队列)
这道题目真是非常坎坷啊,WA了很多次,但所有的思路都是奔着广搜去想的,一开始出现了比答案大的数据,才想到了应该是优先队列,再说加上也肯定不会错.一开始我读错了题意,以为旋转并且前行需要的时间跟其他一样 ...
- Java学习之位运算符
位运算符:&,|,^,~,<<,>> & (按位与):只有对应的两个二进制位均为1时,结果才为1.例如,9&5,即00001001&000001 ...
- mysql 查看表的类型(转)
MySQL 数据表主要支持六种类型 ,分别是:BDB.HEAP.ISAM.MERGE.MYISAM.InnoBDB. 这六种又分为两类,一类是”事务安全型”(transaction-safe),包括B ...