IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 复习整理的DAY28_MyBatis的动态sql与多表 -> 正文阅读

[大数据]复习整理的DAY28_MyBatis的动态sql与多表

通过MyBatis提供的各种标签方法实现动态拼接Sql

(1)select

????????select中where与if标签的引用

<!--if和where标签-->
    <select id="selectByCondition" parameterType="Student" resultMap="studentMap">
        select
            <include refid="studentColumn"></include>
        from
            student
        <where>
            <if test="name!=null and name!='' ">
                and name like concat('%', #{name}, '%')
            </if>
            <if test="age!=null">
                and age=#{age}
            </if>
            <if test="gender!=null and gender!='' ">
                and gender=#{gender}
            </if>
        </where>
    </select>

用了where-if标签后,可以动态地添加where条件,不用思考如何处理and问题,该标签会自动将第一个条件的and去掉

? ? ? ? select中choose-when标签的引用:

   <select id="selectByWhen" parameterType="Student" resultMap="student">
        select <include refid="studentColumn"></include>
        from student
        where
            <choose>
                <when test="name!=null and name!='' ">
                    name like concat('%', #{name}, '%')
                </when>
                <when test="age!=null">
                    age=#{age}
                </when>
                <when test="gender!=null and gender!='' ">
                    gender=#{gender}
                </when>
                <otherwise></otherwise>
            </choose>
    </select>

choose条件与if条件的区别在于前者只会选择满足了条件的一个,后面的不再进行判断选择,后者则会将所有满足if条件的数据都删选出来,可能不止一个

注:concat函数用于连接多个字符串

(2)update中set与if标签的引用

    <update id="updateCondition" parameterType="Student">
        update
            student
        <set>
            <if test="name!=null and name!='' ">
                name=#{name},
            </if>
            <if test="age!=null">
                age=#{age},
            </if>
            <if test="gender!=null and gender!='' ">
                gender=#{gender},
            </if>
        </set>
            where id=#{id}
    </update>

用了set-if标签后,可以动态的添加set设置,该标签可以自动将最后一个的,去掉

(3)delete中foreach标签的引用

传递的参数是Array时,

    <delete id="deleteAllByArray">
        delete from student where id in
            <foreach collection="array" open="(" close=")" separator="," item="id">
                #{id}
            </foreach>
    </delete>

传递的参数是List时,

    <delete id="deleteAllByList">
        delete from student where id in
            <foreach collection="list" open="(" close=")" separator="," item="id">
                #{id}
            </foreach>
    </delete>

在delete中foreach标签可以动态的删除满足数组或者列表的多行数据

(4)在insert中trim与if标签的引用

   <insert id="insertOne" parameterType="Student">
        insert into student
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id!=null">
                id,
            </if>
            <if test="name!=null and name!='' ">
                name,
            </if>
            <if test="age!=null">
                age,
            </if>
            <if test="gender!=null and gender!='' ">
                gender,
            </if>
        </trim>
        <trim prefix=" values(" suffix=")" suffixOverrides=",">
            <if test="id!=null">
                #{id},
            </if>
            <if test="name!=null and name!='' ">
                #{name},
            </if>
            <if test="age!=null">
                #{age},
            </if>
            <if test="gender!=null and gender!='' ">
                #{gender},
            </if>
        </trim>
    </insert>

在insert中利用该标签,可以动态的添加数据

#############################################################################

多表

一对一

MyBatis中使用association标签解决一对一关联查询,association标签可以使用的属性如下:

(1)property:对象属性的名称

(2)javaType:对象以昂属性的类型

(3)column:数据库中字段的名称(也可能是起的别名)

比如,

创建Banji类

public class Banji {
    private Integer id;
    private String name;
    
    public Banji() {
    }

    public Banji(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Banji{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
    <resultMap id="studentMap" type="Student">
        <!--映射主键属性:如果有多个主键字段,则定义多个id-->
        <!--property:自己定义的类的属性名-->
        <!--column:数据库里面表的字段名-->
        <id property="id" column="id"></id>
        <!--result定义普通属性-->
        <result property="name" column="name"></result>
        <result property="age" column="age"></result>
        <result property="gender" column="gender"></result>
        <result property="banjiId" column="banji_id"></result>
        <association property="banji" javaType="Banji">
            <id property="id" column="banjiId"></id>
            <result property="name" column="banjiName"></result>
        </association>
    </resultMap>
    <select id="selectStudentBanjiInfo" resultMap="studentMap">
        select s.id, s.name, s.age, s.gender, b.id as banjiId, b.name as banjiName
        from student as s
                 inner join banji as b on s.banji_id = b.id;
    </select>
    // 一对一关系
    @Test
    public void testSelectStudentBanjiInfo() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        List<Student> list = sqlSession.selectList("student.selectStudentBanjiInfo");
        for (Student student : list) {
            System.out.println(student);
        }
    }

注:需要再创建实体类Banji,添加属性id,与name,并且在Student类中添加Banji属性

这种形式破坏了数据的完整性,我们一般不用

一对多

MyBatis中使用connection标签解决一对多关联查询

比如,

在Banji类中加入数据

public class Banji {
    private Integer id;
    private String name;
    // 一个班级下面有多个学生,表达一对多关系
    private List<Student> list;

    public List<Student> getList() {
        return list;
    }

    public void setList(List<Student> list) {
        this.list = list;
    }

    public Banji() {
    }

    public Banji(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Banji{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

在Banji同级目录下创建一个BanjiMapper.xml文件,在全局配置文件mybatis.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="banji">

    <resultMap id="banjiMap" type="Banji">
        <id property="id" column="id"></id>
        <!--result定义普通属性-->
        <result property="name" column="name"></result>
        <collection property="list" ofType="Student">
            <id property="id" column="studentId"></id>
            <result property="name" column="studentName"></result>
            <result property="age" column="studentAge"></result>
            <result property="gender" column="studentGender"></result>
        </collection>
    </resultMap>

    <select id="selectBanjiStudentInfo" resultMap="banjiMap">
        SELECT b.id, b.name, s.id AS studentId, s.name AS studentName, s.age AS studentAge, s.gender AS studentGender
        FROM banji AS b
                 INNER JOIN student AS s ON b.id = s.banji_id
    </select>
</mapper>

测试select语句:

    /*一对多关系*/
    @Test
    public void testSelectBanjiStudentInfo() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        List<Banji> list = sqlSession.selectList("banji.selectBanjiStudentInfo");
        for (Banji banji : list) {
            System.out.println(banji);
            List<Student> studentList = banji.getList();
            for (Student student : studentList) {
                System.out.println(student);
            }
        }
    }

多对多其实就是分解为两个一对多

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 11:05:11  更:2021-09-05 11:07:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:37:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码