MyBatis的关联关系补充 多对多 继承
多对多 一个学生有多个课程 一个课程有多个学生
思路分析 :使用一个中间表 用学生表和课程表的主键作为中间表的联合主键
1数据库表的设计
课程表

学生表

中间表

2/实体类的设计
课程类
public class Course {
private int cid;
private String cname;
private List<Student> students;
public int getCid() {
return cid;
}
public void setCid(int 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;
}
@Override
public String toString() {
return "Course [cid=" + cid + ", cname=" + cname + "]";
}
}
学生类
public class Student {
private int sid;
private String sname;
private List<Course> courses;
public int getSid() {
return sid;
}
public void setSid(int 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;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", courses="
+ courses + "]";
}
}
3对应的mapper接口 和mapper.xml配置文件
1. API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
public interface StudentMapper {
/**
* 根据ID 查询学生
* @param id
* @return
*方法名必须和配置文件中的方法名保持一致
*/
public Student findStuById(int id);
/**
* 查询学生时 把该学生所选的课程一并查出
* @param id
* @return
*/
public Student findStuAndCou(int id);
}
StudentMapper.xml
自定义返回结果集 双向多对多有两种映射方式
方式1:嵌套结果 使用嵌套结果映射来处理重复的联合结果的子集 封装联表查询的数据(去除重复的数据)
方式2:嵌套查询 通过执行另外一个SQL映射语句来返回预期的复杂类型
<?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="com.szjx.mapper.StudentMapper">
<!-- 根据ID查询学生 -->
<select id="findStuById" parameterType="int" resultType="Student">
select * from student where sid=#{id}
</select> <!-- 嵌套结果 根据ID查询学生 并将学生所选课程一并查询出 -->
<select id="findStuAndCou" parameterType="int" resultMap="stuAndCou">
select s.* ,c.* from student s
left outer join student_course sc on sc.sid=s.sid
left outer join course c on sc.cid=c.cid
where s.sid=#{id}
</select>
<!-- 自定义返回结果集 -->
<resultMap type="Student" id="stuAndCou">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<!-- 实体类中的属性值是一个集合 所以使用Collection -->
<collection property="courses" ofType="Course">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</collection>
</resultMap>
</mapper>
4测试文件
public class Many2Many {
private SqlSession sqlSession;
private StudentMapper mapper;
@Before
public void before(){
//获取session
sqlSession=DBTools.getSession();
mapper=sqlSession.getMapper(StudentMapper.class);
}
@After
public void after(){
//提交事务
sqlSession.commit();
}
@Test
//根据ID查询一个学生
public void findStudentById(){
Student stu=mapper.findStuById(1);
System.out.println(stu);
}
@Test
//根据id查询学生并查询出学生所选课程
public void findStuAndCou(){
Student stu=mapper.findStuAndCou(1);
System.out.println(stu);
}
}
继承关系
这也是在网上学习刚看到的,应该属于MyBatis动态Sql的范畴吧
最简单的例子,宠物。
MyBatis有关继承的映射示例
1数据库表的设计

2.实体类的创建
父类 宠物类
public class PetBean implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
子类 猫类
public class CatBean extends PetBean{
private int fish;
public int getFish() {
return fish;
}
public void setFish(int fish) {
this.fish = fish;
}
}
子类 狗类
public class DogBean extends PetBean{
private int bone;
public int getBone() {
return bone;
}
public void setBone(int bone) {
this.bone = bone;
}
}
3 mapper接口 和mapper.xml配置文件
PetMapper
public interface PetMapper {
//保存一只猫
public int saveCat(CatBean cat);
//添加一直狗
public int saveDog(DogBean dog);
//查询所有的宠物
public List<PetBean> findAllPet();
//查询所有的宠物猫
public List<CatBean> findAllCat();
}
PetMapper.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="com.szjx.mapper.PetMapper"> <!-- 保存一直猫 -->
<insert id="saveCat" parameterType="CatBean">
insert into pet(name,type,fish) values(#{name},'cat',#{fish})
</insert>
<!-- 保存一只狗 -->
<insert id="saveDog" parameterType="DogBean">
insert into pet(name,type,bone) values(#{name},'dog',#{bone})
</insert> <!-- 查询所有动物 -->
<select id="findAllPet" resultMap="petMap">
select * from pet
</select>
<!-- 查询所有猫 -->
<select id="findAllCat" resultMap="petMap">
select * from pet where type='cat'
</select>
<!-- 自定义返回结果集 -->
<resultMap type="PetBean" id="petMap">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!--discriminator:根据结果值决定使用哪个resultMap
case:判断条件
它的表现很像 Java 语言中的 switch 语句。
定义鉴别器指定了 column 和 javaType 属性
-->
<discriminator javaType="String" column="type">
<case value="cat" resultType="CatBean">
<result property="fish" column="fish" javaType="int"/>
</case>
<case value="dog" resultType="DogBean">
<result property="bone" column="bone" javaType="int"/>
</case>
</discriminator>
</resultMap>
</mapper>
4测试类
public class Extends {
private SqlSession sqlSession;
private PetMapper mapper;
@Before
public void before(){
//获取session
sqlSession=DBTools.getSession();
mapper=sqlSession.getMapper(PetMapper.class);
}
@After
public void after(){
//提交事务
sqlSession.commit();
}
@Test
public void saveCat(){
//批量添加猫
for (int i = 0; i < 10; i++) {
CatBean cat=new CatBean();
cat.setFish(1);
cat.setName("加菲"+i);
mapper.saveCat(cat);
}
}
@Test
public void saveDog(){
//批量添加狗
for (int i = 0; i <10; i++) {
DogBean dog=new DogBean();
dog.setBone(2);
dog.setName("哈士奇"+i);
mapper.saveDog(dog);
}
}
@Test
public void findAllCat(){
//查询所有的猫
List<CatBean> cList=mapper.findAllCat();
System.out.println(cList.size());
}
@Test
public void findAllPet(){
//查询所有的宠物
List<PetBean> pList=mapper.findAllPet();
System.out.println(pList.size());
}
}
MyBatis的关联关系补充 多对多 继承的更多相关文章
- Mybatis之关联关系(一对多、多对多)
目的: Mybatis关系映射之一对多 Mybatis关系映射之多对多 Mybatis关系映射之一对多 一对多 (订单对应多个订单项) 多对一 (订单项对应一个订单) 其是映射关系的基层思维是一样的 ...
- Java基础-SSM之mybatis一对多和多对一关系映射
Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建customers表: ...
- mybatis之关联关系
前言:在我们之前的hibernate中我们是学过了关联关系的,所以我们在本章给讲一讲mybatis的关联关系. mybatis的关联关系一对多的测试1.通过逆向工程生成Hbook,HbookCateg ...
- mybatis一对一关联关系映射
mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加&qu ...
- MyBatis一对多和多对多xml配置
MyBatis一对多和多对多xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ma ...
- Mybatis 多表实现多对多查询、添加操作
Mybatis 多表实现多对多查询.添加操作 学习内容: 1. 多对多之添加操作 1.1.需求 1.2.数据库表(多对多数据库设计需要设计中间表) 1.3.类设计 1.4.Mapper 接口和 Map ...
- Mybatis 多表实现多对一查询、添加操作
Mybatis 多表实现多对一查询.添加操作 学习内容: 1. 多对一之添加操作 1.1.需求 1.2.数据库表(多对一或一对多,数据库外键都是设置在多的一方) 1.3.类设计 1.4.Mapper ...
- hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系
hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...
- MyBatis的关联关系 一对一 一对多 多对多
一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...
随机推荐
- java基础(十一章)
一.理解什么是类和对象 万事万物皆对象 1.属性--对象具有的特征(特点) 2.方法--对象可执行的操作(能干什么事) 3.对象的定义: 是一个客观存在的,看的见或摸得着的 ...
- mysql之 mysql 5.6不停机双主一从搭建(活跃双主一从基于日志点复制)
环境说明:版本 version 5.6.25-log 主1库ip: 10.219.24.25主2库ip: 10.219.24.22从1库ip:10.219.24.26os 版本: centos 6.7 ...
- BOM API
原文链接http://www.jb51.net/article/55851.htm 我们都知道, javascript 有三部分构成,ECMAScript,DOM和BOM,根据宿主(浏览器)的不同,具 ...
- R语言重要数据集分析研究——搞清数据的由来
搞清数据的由来 作者:李雪丽 资料来源:百度百科
- [iOS]从零开始开发一个即时通讯APP
前言 这是我的毕业设计.刚开始确定这个课题的时候是因为以前有稍微研究过一些XMPP协议,在这个基础上做起来应该不难.然后开始选技术的时候还有半年,我想为什么不从更底层做起呢!那就不用XMPP,当时接触 ...
- Hadoop 笔记1 (原理和HDFS分布式搭建)
1. hadoop 是什么 以及解决的问题 (自行百度) 2.基本概念的讲解 1. NodeName master 节点(NN) 主节点 保存了metaData(元数据信息) 包括文件的owener ...
- VMware-VCSA-6.5安装过程
1.新建虚拟机 2.选择从OVF或OVA文件导入 3.给虚拟机命名,并选择OVF文件. 4.选择虚拟机的存储位置.这里没有配置共享存储宿,这里选择的宿主机的存储. 5.许可协议同意就OK了. 6.部署 ...
- javascript中apply,call,bind区别,bind兼容等问题总结
1 三者的相似之处: (1).都是用来改变函数的this对象的指向的 (2).都是用第一个参数来做this对象的指向 (3).都可以传参数进去 那么,具体到它们有什么区别呢?请看下面的例子: 两个对象 ...
- jQuery.merge( first, second )返回: Array
jQuery.merge( first, second )返回: Array描述: 合并两个数组内容到第一个数组.first类型: Array第一个用于合并的数组,其中将会包含合并后的第二个数组的内容 ...
- Visual Studio 中指定自定义生成事件
自定义生成事件打开方式 通过指定自定义生成事件,可以在生成开始之前或在它完成之后自动运行命令.在Visual Studio中通过右键项目->属性 进入项目属性菜单. 自定义生成事件的语法 生成事 ...