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实体 ...
随机推荐
- 红包项目总结---MVC版
起因: 针对传统版的明显缺陷做优化.主要是提升可维护性. 效果 线上: 未发布 线下:http://10.27.5.1/svn/FED/code/hongbao/year-end hb-fac ...
- 关于MS12-020一次简单尝试
由于之前着重于web漏洞,主机漏洞这块比较薄弱.也没有用过metasploit,对于很多系统漏洞还不熟悉,正好这几天不忙,就想着慢慢学习,再写点简单的东西,进行总结记录. 这次尝试的是MS12-020 ...
- 最新Hadoop Shell完全讲解
本文为原创博客,转载请注明出处:http://www.cnblogs.com/MrFee/p/4683953.html 1.appendToFile 功能:将一个或多个源文件系统的内容追加至 ...
- Windows下用Composer引入官方GitHub扩展包
Windows下用Composer引入官方GitHub扩展包 1. 当你打开威武RC4版本的链接的时候,往下拉你可以看到这个,然后你要做的就是想到,百度Composer,看看是个什么鬼,别想太多,跟着 ...
- 腾讯AlloyTeam发布AlloyLever - 开发调试发布错误监控上报用户问题定位尽在1kb代码
AlloyLever [官网][Giuhub] 1kb(gzip)代码搞定开发调试发布,错误监控上报,用户问题定位. 支持错误监控和上报 支持 vConsole错误展示 支持开发阶段使用 vConso ...
- java中static关键字的作用
java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...
- epclise设置tomcat方法(步骤)(菜鸟巧记二)
epclise设置tomcat 1.打开epclise→window→preferences 2.输入server,打开server→runtime environments→选择add新建 3.打开 ...
- Bash函数
一.什么是Bash函数 Bash不支持goto语句,可以用function实现程序流程跳转.当前shell中一组组织在一起并被命名的命令.比脚本的效率高,一旦定义,就成为shell内存的一部分,可以随 ...
- Java 9 揭秘(5. 实现服务)
Tips做一个终身学习的人. Implementing Services 在这章中,主要介绍如下内容: 什么服务,服务接口,服务提供者: 在 JDK 9之前和在JDK 9中如何实现服务 如何使用Jav ...
- 原生js二级联动
今天说的这个是原生js的二级联动,在空白页面里动态添加并作出相对应的效果. 1 //创建两个下拉列表 select标签 是下拉列表 var sel = document.createElement(& ...