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实体 ...
随机推荐
- zookeeper的安装与配置
本文将通过三个zookeeper的节点去配置 1.首先去官网下载zookeeper的包 zookeeper-3.4.10.tar.gz 2.用FTP文上传到/usr/local下 3.解压文件tar ...
- php优化代码技巧
1. 如果一个方法可静态化,就对它做静态声明.速率可提升至 4 倍. 2. echo 比 print 快. 3. 使用 echo 的多重参数(译注:指用逗号而不是句点)代替字符串连接. 4. 在执行 ...
- sql备份(.mdf文件备份)
第一步: 右键需要备份的数据库(这里以MyDB为例),选择“属性”. 第二步: 选择“文件”,复制路径 第三步: 打开文件所在目录,复制MyDB.mdf和MyDB_log.ldf 第四步: 把数据库停 ...
- 搭建免费wifi,嗅探接入该wifi的所有网络信息
环境: 1: create_ap , 搭建免费wifi. 2: wireshark , 嗅探网络信息. 搭建热点 搭建热点: git clone https://github.com/oblique/ ...
- 如何使用wait(), notify() and notifyAll() – Java
Java多线程是个很复杂的问题,尤其在多线程在任何给定的时间访问共享资源需要更加注意.Java 5引入了一些类比如BlockingQueue 和Executors 类提供了易于使用的API,避免了一些 ...
- Linux版微信
一.到github上下载https://github.com/geeeeeeeeek/electronic-wechat/releases下载linux-x64.tar.gz,具体根据操作系统是32位 ...
- JS读写浏览器cookie及读取页面参数
JS读写浏览器cookie及读取页面参数 var zbrowser = { //设置浏览器cookie,exdays是cookie有效时间 setCookie: function (c_name, v ...
- VisualSVN 5.1.7破译License Key
前面手敲一些简要的软件说明:visualSVN server大家都不陌生,服务器上的版本控制系统,一般配套Tortoisesvn(小乌龟)使用.本次介绍的这个visualsvn属于VisualStud ...
- .NET C#到Java没那么难,Servlet篇
前言 .NET C#到Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都 ...
- linux 权限字母含义
查看某一文件夹下所有文件夹的权限情况:ls -l分别是:所有者(user)-所有者(user)-其他人(other)r 表示文件可以被读(read)w 表示文件可以被写(write)x 表示文件可以被 ...