多对多 一个学生有多个课程 一个课程有多个学生
思路分析 :使用一个中间表 用学生表和课程表的主键作为中间表的联合主键
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的关联关系补充 多对多 继承的更多相关文章

  1. Mybatis之关联关系(一对多、多对多)

    目的: Mybatis关系映射之一对多 Mybatis关系映射之多对多 Mybatis关系映射之一对多 一对多 (订单对应多个订单项) 多对一  (订单项对应一个订单) 其是映射关系的基层思维是一样的 ...

  2. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

  3. mybatis之关联关系

    前言:在我们之前的hibernate中我们是学过了关联关系的,所以我们在本章给讲一讲mybatis的关联关系. mybatis的关联关系一对多的测试1.通过逆向工程生成Hbook,HbookCateg ...

  4. mybatis一对一关联关系映射

    mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加&qu ...

  5. MyBatis一对多和多对多xml配置

    MyBatis一对多和多对多xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ma ...

  6. Mybatis 多表实现多对多查询、添加操作

    Mybatis 多表实现多对多查询.添加操作 学习内容: 1. 多对多之添加操作 1.1.需求 1.2.数据库表(多对多数据库设计需要设计中间表) 1.3.类设计 1.4.Mapper 接口和 Map ...

  7. Mybatis 多表实现多对一查询、添加操作

    Mybatis 多表实现多对一查询.添加操作 学习内容: 1. 多对一之添加操作 1.1.需求 1.2.数据库表(多对一或一对多,数据库外键都是设置在多的一方) 1.3.类设计 1.4.Mapper ...

  8. hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

    hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...

  9. MyBatis的关联关系 一对一 一对多 多对多

    一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...

随机推荐

  1. ThinkPHP5.0版本和ThinkPHP3.2版本的区别

    5.0版本和之前版本的差异较大,本篇对熟悉3.2版本的用户给出了一些5.0的主要区别. URL和路由 5.0的URL访问不再支持普通URL模式,路由也不支持正则路由定义,而是全部改为规则路由配合变量规 ...

  2. CSS小技巧-怎样让每行多余的文字显示文省略号?

    1.white-space:nowrap 如果是中文,则需要设置行末不断行 2.overflow:hidden 设置超出控件范围隐藏 3.text-overflow:ellipsis

  3. 一天搞定HTML----标签的嵌套规则06

    标签的嵌套规则 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  4. javaSE_08Java中static、继承、重写

    一.Static 学习静态这个关键字,关键是抓住两个点: 1,关注其语法特点 2,关注其使用场景 案例讲解: 我们先从静态变量开始,当一个成员变量加上static修饰之后,会是一个什么效果? 比如创建 ...

  5. ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...

  6. D语言需要大公司支持

    Facebook开源flint:一个用D语言编写的C++静态代码分析器 http://www.csdn.net/article/2014-02-27/2818565-Building-and-open ...

  7. chip-seq数据分析中peak-calling软件-------MACS的安装

    1.下载MACS软件安装包(作者的系统为Ubuntu) 网址链接:http://liulab.dfci.harvard.edu/MACS/ 2.解压文件: tar -zxvf MACS**.tar.g ...

  8. 写JS自执行函数时要注意的

    JS是非强类型语言,且IDE也不够智能,所以经常会在语句结束时漏写了分号,一般情况下这是不影响运行的, 但如果后面跟上的是一段自执行的函数,就会报出 "..... is not functi ...

  9. 初识webpack——webpack四个基础概念

    前面的话 webpack是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.当webpack处理应用程序时,它会递归地构建一个依赖关系图表 ...

  10. 自己动手写一个自动登录脚本gg

    1.下载一个sshpass工具 2.安装sshpass,安装到tools文件夹 3.把tools文件夹的路径加入到/etc/bashrc vim   /etc/bashrc 最后一行  : expor ...