Mybatis多表模型

2023-11-03

多表模型:
  • 多表模型分类 一对一:在任意一方建立外键,关联对方的主键。
  • 一对多:在多的一方建立外键,关联一的一方的主键。
  • 多对多:借助中间表,中间表至少两个字段,分别关联两张表的主键。
多表模型一对一操作:
  1. sql语句准备
CREATE TABLE person(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT
);
INSERT INTO person VALUES (NULL,'张三',23);
INSERT INTO person VALUES (NULL,'李四',24);
INSERT INTO person VALUES (NULL,'王五',25);

CREATE TABLE card(
	id INT PRIMARY KEY AUTO_INCREMENT,
	number VARCHAR(30),
	pid INT,
	CONSTRAINT cp_fk FOREIGN KEY (pid) REFERENCES person(id)
);
INSERT INTO card VALUES (NULL,'12345',1);
INSERT INTO card VALUES (NULL,'23456',2);
INSERT INTO card VALUES (NULL,'34567',3);
  1. 配置文件
<?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.duobiao.table.One">
<!--
<resultMap>:配置字段和实体对象属性的映射关系标签。
id 属性:唯一标识
type 属性:实体对象类型

<id>:配置主键映射关系标签。
<result>:配置非主键映射关系标签。
    column 属性:表中字段名称
    property 属性: 实体对象变量名称
<association>:配置被包含对象的映射关系标签。
	property 属性:被包含对象的变量名
    javaType 属性:被包含对象的数据类型
-->
    <!--配置字段和实体对象属性的映射关系-->
    <resultMap id="oneToOne" type="card">
        <id column="cid" property="id" />
        <result column="number" property="number" />
        <association property="p" javaType="person">
            <id column="pid" property="id" />
            <result column="name" property="name" />
            <result column="age" property="age" />
        </association>
    </resultMap>

    <select id="selectAll" resultMap="oneToOne">
        SELECT c.id cid,number,pid,NAME,age FROM card c,person p WHERE c.pid=p.id
    </select>
</mapper>

核心配置文件

    <!--起别名-->
    <typeAliases>
        <package name="com.duobiao.bean"/>
    </typeAliases>   
 
<!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="OneToOneMapper.xml"/>
    </mappers>
  1. bean包
public class Person {
    private Integer id;
    private String name;
    private Integer age;
}

public class Card {
    // 主键id
    private Integer id;
    // 身份证号
    private String number;
    // 所属人对象
    private Person p;
}
  1. 接口:
public interface OneToOneMapper {
    // 查询全部
    List<Card> selectAll();
}
  1. 测试类
 @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取OneToOneMapper接口的实现类对象
        OneToOneMapper mapper = sqlSession.getMapper(OneToOneMapper.class);

        //5.调用实现类的方法,接收结果
        List<Card> list = mapper.selectAll();

        //6.处理结果
        for (Card c : list) {
            System.out.println(c);
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }
一对多:

sql数据:

CREATE TABLE classes(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
INSERT INTO classes VALUES (NULL,'一班');
INSERT INTO classes VALUES (NULL,'二班');


CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	cid INT,
	CONSTRAINT cs_fk FOREIGN KEY (cid) REFERENCES classes(id)
);
INSERT INTO student VALUES (NULL,'张三',23,1);
INSERT INTO student VALUES (NULL,'李四',24,1);
INSERT INTO student VALUES (NULL,'王五',25,2);
INSERT INTO student VALUES (NULL,'赵六',26,2);

bean:

public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

public class Classes {
    // 主键id
    private Integer id;
    // 班级名
    private String name;
    // 班级中所有的学生
    private List<Student> students;
}

配置文件:

<?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.table.OneToManyMapper">
    <resultMap id="oneToMany" type="classes">
        <id column="cid" property="id"/>
        <result column="cname" property="name"/>
        <!--
            collection:配置被包含的集合对象映射关系
            property:被包含对象的变量名
            ofType:被包含对象的实际数据类型
        -->
        <collection property="students" ofType="student">
            <id column="sid" property="id"/>
            <result column="sname" property="name"/>
            <result column="sage" property="age"/>
        </collection>
    </resultMap>
    <select id="selectAll" resultMap="oneToMany">
        SELECT c.id cid,c.name cname,s.id sid,s.name sname,s.age sage FROM classes c,student s WHERE c.id=s.cid
    </select>
</mapper>

测试:

    @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取OneToManyMapper接口的实现类对象
        OneToManyMapper mapper = sqlSession.getMapper(OneToManyMapper.class);

        //5.调用实现类的方法,接收结果
        List<Classes> classes = mapper.selectAll();

        //6.处理结果
        for (Classes cls : classes) {
            System.out.println(cls.getId() + "," + cls.getName());
            List<Student> students = cls.getStudents();
            for (Student student : students) {
                System.out.println("\t" + student);
            }
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }
多对多:

sql语句:

CREATE TABLE course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
INSERT INTO course VALUES (NULL,'语文');
INSERT INTO course VALUES (NULL,'数学');


CREATE TABLE stu_cr(
	id INT PRIMARY KEY AUTO_INCREMENT,
	sid INT,
	cid INT,
	CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id),
	CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id)
);
INSERT INTO stu_cr VALUES (NULL,1,1);
INSERT INTO stu_cr VALUES (NULL,1,2);
INSERT INTO stu_cr VALUES (NULL,2,1);
INSERT INTO stu_cr VALUES (NULL,2,2);

配置文件:

<?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.tableManyToManyMapper">
    <resultMap id="manyToMany" type="student">
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="sage" property="age"/>

        <collection property="courses" ofType="course">
            <id column="cid" property="id"/>
            <result column="cname" property="name"/>
        </collection>
    </resultMap>
    <select id="selectAll" resultMap="manyToMany">
        SELECT sc.sid,s.name sname,s.age sage,sc.cid,c.name cname FROM student s,course c,stu_cr sc WHERE sc.sid=s.id AND sc.cid=c.id
    </select>
</mapper>

测试:

 @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取ManyToManyMapper接口的实现类对象
        ManyToManyMapper mapper = sqlSession.getMapper(ManyToManyMapper.class);

        //5.调用实现类的方法,接收结果
        List<Student> students = mapper.selectAll();

        //6.处理结果
        for (Student student : students) {
            System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
            List<Course> courses = student.getCourses();
            for (Course cours : courses) {
                System.out.println("\t" + cours);
            }
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }
标签解释:
<resultMap>:配置字段和对象属性的映射关系标签。
    id 属性:唯一标识
    type 属性:实体对象类型

<id>:配置主键映射关系标签。

<result>:配置非主键映射关系标签。
	column 属性:表中字段名称
	property 属性: 实体对象变量名称

<association>:配置被包含对象的映射关系标签。
	property 属性:被包含对象的变量名
	javaType 属性:被包含对象的数据类型

<collection>:配置被包含集合对象的映射关系标签。
	property 属性:被包含集合对象的变量名
	ofType 属性:集合中保存的对象数据类型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis多表模型 的相关文章

随机推荐

  • nagios check_mysql uptime_nagios使用check_mysql监控mysql

    如果没有check mysql插件 需要安装Mysql数据库 1 建立专用数据库 root svr3 mysql u root p Enter password Welcome to the MySQL monitor Commands e
  • SpringMVC事务控制(xml文件配置和注解配置)

    事务的定义 事务应该具有4个属性 原子性 一致性 隔离性 持久性 这四个属性通常称为ACID特性 原子性 atomicity 一个事务是一个不可分割的工作单位 事务中包括的操作要么都做 要么都不做 一致性 consistency 事务必须是
  • python之字符串替换

    方法一 str replace old new max old 将被替换的子字符串 new 新字符串 用于替换old子字符串 max 可选字符串 替换不超过 max 次 temp str this is a test print temp
  • jquery保留一位小数_青岛版数学,4年级上册,动物世界——小数意义和性质,干货分享...

    各位家长 同学们 大家好 这里是玖振学堂学习分享课堂 今天给大家分享的内容是青岛版数学四年级上册中动物世界 小数的意义和性质这一单元的知识点 小数的意义 仿照整数的写法 写在整数的右面 用圆点隔开 用来表示十分之几 百分之几 千分之几 的数
  • 程序员开发遇见chrome浏览器访问异常 ie 火狐正常访问 快速解决办法(80以上版本chrome有重大变化)

    近期有部分程序员开发遇见的chrome80以上版本url访问异常等 针对相同操作系统 相同浏览器 相同的url所展示的异常现象 网上找了很多方法尝试js调试 后台跨域等 然而并没有什么卵用 大家也别浪费时间测试了 本人尝试过以上所有方法 结
  • 实验六—基本数据管理(三)

    实验6 基本数据管理 三 实验目的 综合应用数据框的多种操作 进行综合实验 掌握小提琴图的绘制方法 实验内容 1 计算2的1 50次方 以及1 50的平方 找出这两个序列有哪些元素是相等的 显示出来 x lt NULL y lt NULL
  • 服务器被攻击的处理方法

    一 服务器被攻击怎么办 处理步骤 1 切断网络 所有的攻击都来自于网络 因此 在得知系统正遭受黑客的攻击后 首先要做的就是断开服务器的网络连接 这样除了能切断攻击源之外 也能保护服务器所在网络的其他主机 2 查找攻击源 可以通过分析系统日志
  • 基于人工蜂群算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • Yarn常用命令

    Yarn常用命令 文章目录 1 yarn application 查看任务 2 yarn logs 查看日志 3 yarn applicationattempt 查看尝试运行的任务 4 yarn container查看容器 5 yarn n
  • 无线打印机服务器说明书,无线打印机服务器

    无线打印机服务器 内容精选 换一换 假定某个Flink业务每秒就会收到1个消息记录 基于某些业务要求 开发的Flink应用程序实现功能 实时输出带有前缀的消息内容 Flink样例工程的数据存储在Kafka组件中 Flink向Kafka组件发
  • 生命在于学习——业务逻辑漏洞

    声明 只是用于学习交流 笔记记录 不可用作违规用途 一 业务逻辑漏洞简介 简单理解 就是编程人员的思维逻辑不够严谨导致攻击者有机可乘的漏洞 逻辑漏洞还是一种虽然没有在owasp top10中提及到 但是往往会存在的漏洞 并且在hvv 渗透测
  • 用户和组权限管理笔记

    一 管理用户和组 Linux 是一个多用户 多任务的服务器操作系统 1 Linux用户类型 linux用户和组账户概述 用户和组 系统上的每个进程 运行的程序 都是作为特定用户运行的 每个文件都是由一个特定用户拥有 访问文件和目录受到用户的
  • 疯壳-鸿蒙OS-应用程序监听驱动程序消息

    应用程序监听驱动程序消息 疯壳 出品 在前面课程中 我们通过驱动服务基类成员IDeviceIoService中的Dispatch方法进行用户态应用程序和内核态驱动程序的消息交互 其中涉及到两个HdfSBuf data与reply data
  • python的color函数的参数_Python 函数参数

    参数 我们用函数封装了一个功能 但是希望这个功能可以在不同要求的作用下面得到不同的结果 就需要用到参数 def f color if color green print They re green elif color yellow pri
  • 字符串转换,将前端传过来的json格式的数据转化为以“#”号隔开的格式的数据(replaceAll、substring和数组)

    一 字符串转换 将前端传过来的json格式的数据转化为以 号隔开的格式的数据 需求 在题目新增时 前端传过来的四个选项是json格式的数据 后端存入数据库的格式要求将四个选项以 隔开 例如 将 A 招标人 B 投标人 C 设计单位 D 施工
  • 一篇就够!数据增强方法综述

    作者 太子长琴 整理 NewBeeNLP 数据增强 Data Augmentation DA 缓解了深度学习中数据不足的场景 在图像领域首先得到广泛使用 进而延伸到 NLP 领域 并在许多任务上取得效果 一个主要的方向是增加训练数据的多样性
  • TorchVision Transforms API 大升级,支持目标检测、实例/语义分割及视频类任务

    内容导读 TorchVision Transforms API 扩展升级 现已支持目标检测 实例及语义分割以及视频类任务 新 API 尚处于测试阶段 开发者可以试用体验 本文首发自微信公众号 PyTorch 开发者社区 TorchVisio
  • JDK8的 stream流详解-转载

    本文章 转载自头条网 只是觉得好用很详细 所以自己收集 做下笔记 不做任何商业用途 不收任何费用 不喜勿喷 本文是转载 希望不要涉及到文章版权 只是自己做笔记 这个是最重要的 致敬 头条 程序猿的内心独白 1 Stream初体验 我们先来看
  • 11-1 输入输出流

    1 文件打开方式 打开方式通常有 r w a 三种 分别代表 只读 只写 附加 三种操作加 t 表示以文本文件形式打开 加 b 表示以二进制文件形式打开 什么都不加的情况下 默认打开文本文件 二进制文件和文本文件的区别 1 在 window
  • Mybatis多表模型

    多表模型 多表模型分类 一对一 在任意一方建立外键 关联对方的主键 一对多 在多的一方建立外键 关联一的一方的主键 多对多 借助中间表 中间表至少两个字段 分别关联两张表的主键 多表模型一对一操作 sql语句准备 CREATE TABLE