欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis多对多映射初识教程

程序员文章站 2024-03-31 21:09:46
mybatis是一个支持普通sql查询,存储过程和高级映射的优秀持久层框架。mybatis消除了几乎所有的jdbc代码和参数的手工设置以及对结果集的检索封装。mybatis...

mybatis是一个支持普通sql查询,存储过程和高级映射的优秀持久层框架。mybatis消除了几乎所有的jdbc代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的xml或注解用于配置和原始映射,将接口和java的pojo(plain old java objects,普通的java对象)映射成数据库中的记录。

在上篇文章给大家介绍mybatis一对一映射初识教程

下面给大家说下mybatis多对多映射知识,具体详情如下所示:

多对多的例子也不少,比如课程与学生之间的关系,一个课程可以有多个学生选修,而一个学生也可以选修多门学科。老师与学生之间的关系,一个老师有多个学生,一个学生有多个老师。
以学生和课程之间的关系为例。

我们建立数据表的时候有两种方案:

第一种:

在建立student数据表的时候,存放一个课程的外键字段,

在建立course数据表的时候,存放一个学生的外键字段。

但是这样是有很大弊端的,那就是如果我要删student表,却有course表的外键字段,

同理,我想删除course表的时候,却有student表的外键字段,哎,不好办啊。

第二种:

我们建立student和course表,在两张表中分别存放各自的字段和记录,

再常见一个student_course表,作为中间表,存放student和course的外键。

这样我们删除字表的时候很方便哦,所以采用这样方案。

数据库脚本

-- 多对多映射
-- 删除数据库
drop database if exists mybatis;
-- 创建数据库
create database if not exists mybatis default character set utf8;
-- 选择数据库
use mybatis;
-- 删除数据表
drop table if exists student;
drop table if exists course;
drop table if exists student_course;
-- 创建数据表
create table student(
sid int(255),
sname varchar(32),
constraint pk_sid primary key (sid)
);
create table course(
cid int(255),
cname varchar(32),
constraint pk_cid primary key (cid)
);
create table student_course(
sid int(255),
cid int(255),
constraint pk_sid_cid primary key(sid,cid),
constraint fk_sid foreign key (sid) references student(sid),
constraint fk_cid foreign key (cid) references course(cid) 
);
-- 测试数据
insert into student (sid,sname) values (1,'哈哈');
insert into student (sid,sname) values (2,'呵呵');
insert into course (cid,cname) values (1,'java');
insert into course (cid,cname) values (2,'.net');
insert into student_course (sid,cid) values (1,1);
insert into student_course (sid,cid) values (1,2);
insert into student_course (sid,cid) values (2,1);
insert into student_course (sid,cid) values (2,2);

MyBatis多对多映射初识教程

MyBatis多对多映射初识教程

新建many2many.course.java类

package many2many;
import java.io.serializable;
import java.util.arraylist;
import java.util.list;
/**
* 课程
* @author administrator
*
*/
@suppresswarnings("serial")
public class course implements serializable{
private integer cid;
private string cname;
private list<student> students = new arraylist<student>();
public integer getcid() {
return cid;
}
public void setcid(integer cid) {
this.cid = cid;
}
public string getcname() {
return cname;
}
public void setcname(string cname) {
this.cname = cname;
}
public list<student> getstudents() {
return students;
}
public void setstudents(list<student> students) {
this.students = students;
}
}

新建many2many.student.java类

package many2many;
import java.io.serializable;
import java.util.arraylist;
import java.util.list;
/**
* 学生类
* @author administrator
*
*/
@suppresswarnings("serial")
public class student implements serializable {
private integer sid;
private string sname;
private list<course> courses = new arraylist<course>();
public integer getsid() {
return sid;
}
public void setsid(integer sid) {
this.sid = sid;
}
public string getsname() {
return sname;
}
public void setsname(string sname) {
this.sname = sname;
}
public list<course> getcourses() {
return courses;
}
public void setcourses(list<course> courses) {
this.courses = courses;
}
}

新建studentmapper.xml文件和coursemapper.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="studentmapper">
<resultmap type="many2many.student" id="studentmap">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</resultmap>
</mapper>
<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="coursenamespace">
<resultmap type="many2many.course" id="coursemap">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</resultmap>
<!-- 查询“哈哈”选修了那几门课程 -->
<select id="findallbyname" parametertype="string" resultmap="coursemap">
select c.cname,c.cid
from student s,course c,student_course sc
where s.sid = sc.sid and c.cid = sc.cid and s.sname = #{sname};
</select>
</mapper>

新建持久层类studentcoursedao.java类

package many2many;
import java.util.iterator;
import java.util.list;
import one2many.student;
import org.apache.ibatis.session.sqlsession;
import org.junit.test;
import util.mybatisutil;
public class studentcoursedao {
/**
* 查询“哈哈”选修了那几门课程
* @param name 学生的姓名
* @return
* @throws exception
*/
public list<course> findallbyname(string name) throws exception{
sqlsession sqlsession = null;
try {
sqlsession = mybatisutil.getsqlsession();
return sqlsession.selectlist("coursenamespace.findallbyname", name);
} catch (exception e) {
e.printstacktrace();
throw e;
}finally{
mybatisutil.closesqlsession();
}
}
@test
public void testfindallbyname() throws exception{
studentcoursedao dao = new studentcoursedao();
list<course> courses = dao.findallbyname("哈哈");
for (course course : courses) {
system.out.println(course.getcid()+":"+course.getcname());
}
}
}

在mybatis.cfg.xml文件中加载配置文件

<!-- 加载映射文件 -->
<mappers>
<mapper resource="one2one/cardmapper.xml"/>
<mapper resource="one2one/studentmapper.xml"/>
<mapper resource="one2many/grademapper.xml"/>
<mapper resource="one2many/studentmapper.xml"/>
<mapper resource="many2many/studentmapper.xml"/>
<mapper resource="many2many/coursemapper.xml"/>
</mappers>

以上所述是小编给大家介绍的mybatis多对多映射初识教程,希望对大家有所帮助