多对多 一个学生有多个课程 一个课程有多个学生
思路分析 :使用一个中间表 用学生表和课程表的主键作为中间表的联合主键
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. Lock(二)解决Lock问题

    本文介绍通过Toad.EM及SQL语句来处理数据库产生的锁.在这之前需要对v$lock和v$session这两个数据字典有一定的了解. (一)使用Toad处理锁 (1)使用Toad的session b ...

  2. 微信小程序 支付功能(前端)的实现

    只提供微信小程序端代码: var app = getApp(); Page({ data: {}, onLoad: function (options) { // 页面初始化 options为页面跳转 ...

  3. 将Java Web项目部署到远程主机上

    这里讲的是Java Web项目 第一步:购买主机,如果是大学生可以购买学生机,一个月9.9元,阿里云ECS服务器,自己选择不同的操作系统和镜像 ,我的选择 得到用户名和密码,可以进行ssh远程登录,登 ...

  4. PHP cURL的详细使用手册

    PHP cURL的详细使用手册 PHP cURL可以帮助我们简单有效地去抓取网页内容,帮助我们方便的实现抓取功能.本文主要介绍了PHP cURL的使用方法. AD:2013云计算架构师峰会课程资料下载 ...

  5. Nodejs-express 4.0框架 简单介绍

    http://www.expressjs.com.cn/4x/api.html  这个是express API的中文手册 但是只是翻译了一点 英语比较差比较难受. 1. 关于安装 现在网上查的时候有一 ...

  6. [Leetcode] Binary search, DP--300. Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  7. eclipse tomcat add时提示The Tomcat server configuration at \Servers\Tomcat v6.0 Server at localhost-

    原因为左侧项目中把对于网络应用的servers项目给关闭或删除了,导致相应的localhost-config无法定位,所以才发生的错误. 解决办法:删除servers下的tomcat 重新添加serv ...

  8. 微信支付生成带logo的二维码

    利用到一个qrcode类 比较简洁 原作者没有加入二维码嵌入logo的功能 在这里我进行了小小的修改 可以实现生成微信支付二维码时打上logo 生成png格式的利用到该类中的png方法(我已经改好了) ...

  9. v9 频道页如果有下级栏目跳转到第一个栏目链接

    {if $CATEGORYS[$catid]['child']==1} {php $firstarr = explode(',',$CATEGORYS[$catid]['arrchildid']);} ...

  10. Zabbix 3.2.6安装过程

    以3.2.6版本的Zabbix为例展开说明 1.准备Lnmp环境. 本次准备的环境: Linux:2.6.32-642.el6.x86_64 Nginx:1.12.0 Mariadb:10.2.6 P ...