多对多 一个学生有多个课程 一个课程有多个学生
思路分析 :使用一个中间表 用学生表和课程表的主键作为中间表的联合主键
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. 利刃 MVVMLight

    已经很久没有写系列文章了,上一次是2012年写的HTLM5系列,想想我们应该是较早一批使用HTML5做项目的人. 相比我当时动不动100+的粉丝增长和两天3000+的阅读量,MVVM Light只能算 ...

  2. java基础之位运算

    java中常见的位运算符:&(逻辑与) |(逻辑或) ~(取反) ^(逻辑异或) >>(右移) <<(左移) >>>(无符号右移) &(逻辑与 ...

  3. TreeSet集合排序方式二:定制排序Comparator

    Comparator有两种实现方式: 1,匿名内部类 2,创建一个类用于实现Comparator,该类创建的对象就是比较器 Person类 public class Person implements ...

  4. 新手如何快速入门Python

    学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层.虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如 ...

  5. WPF中用户控件对比自定义控件(UserControl VS CustomControl)

    接着这篇文章(http://www.cnblogs.com/shiyue/archive/2013/02/02/2889907.html)写: 用户控件(组合) 用于在一个项目中使用多次 自定义控件( ...

  6. 获取Skype用户IP地址

    #!/usr/bin/env bash ESC_SEQ="\x1b[" COL_RESET=$ESC_SEQ"39;49;00m" COL_RED=$ESC_S ...

  7. Android界面(1) 使用TextView实现跑马灯效果

    方法一:(只能实现单个TextView的跑马灯效果)在TextView添加以下控件 android:singleLine="true"只能单行,超出的文字显示为"...& ...

  8. Bash扩展顺序

    当进行变量替换.命令替换.数学扩展以及路径扩展时,Bash Shell遵循如下顺序: 1.大括号扩展 $ls f{oo,aa,unble} 2.~扩展 ~cb, ~/doc/working 3.命令参 ...

  9. Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel

    Java NIO SocketChannel Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道.Java NIO相当于Java Networking的sock ...

  10. “前”方有坑,绕道而行(一)-- H5+CSS

    1. 关于  数字.英文 不换行问题: 情景:昨天测试 小程序,输入英文,没有换行,且 下方有横向滚动条: 解决:word-break: word-break:break-all; /*只对英文起作用 ...