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);
新建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多对多映射初识教程,希望对大家有所帮助