【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL

这篇具有很好参考价值的文章主要介绍了【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、解决Java实体类属性与数据库表字段不一致问题

🌷现象1:显示字段不对应:使用ResultType查询结果为null;

🌷解决办法:字段不对应:使用ResultMap解决。

二、数据库的多表查询

🌷方式1:使用对象user 

🌷方式2:直接写具体的属性

三、动态SQL的使用

🌷1、if标签:单个参数不确定

🌷2、trim标签:多个参数不确定,搭配if标签一起使用

🌷3、where标签:搭配if标签

方式1:使用where关键字(注意不是where标签)

方式2:使用标签

🌷4、set标签:搭配if标签

🌷5、foreach标签:用于批量操作,搭配if\where标签

🍉个人小结


一、解决Java实体类属性与数据库表字段不一致问题

        在对数据进行增删改查的时候,如果是增,删,改一般会返回受影响的行数,所以在mapper.xml文件中可以不设置返回的类型;但是对于查询,无论查询什么内容,都要设置返回的数据类型。如下:

查询:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 增加、删除和修改:一般可以不设置返回类型:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 所以对于<select>查询标签来说,至少需要两个属性

(1)i属性:用于标识实现接口中的哪个方法;

(2)结果映射属性:有两种实现标签:<resultType>和<resultMap>

         其中,在前一节我们定义用户实体类的时候,强调了当时的属性名要与数据库中表的字段名一致,就可以使用<resultType>了。但是在实际开发中,Java中的实体类属性一般是小驼峰命名,数据库中的字段属性是字母小写并用下划线分隔,两者之间的名称可能不一致,那么此时就要用到<resultMap>了。

🌷现象1:显示字段不对应:使用ResultType查询结果为null;

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

xml文件 

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 结果:【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🌷解决办法:字段不对应:使用ResultMap解决。

UserMapper.xml文件

<resultMap id="BaseMap1" type="demo3.model.User">
        <id property="id" column="id"></id>
        <result property="name" column="username"></result>
        <result property="pwd" column="password"></result>
        <result property="photo" column="photo"></result>
        <result property="createTime" column="createTime"></result>
        <result property="updateTime" column="updateTime"></result>
        <result property="state" column="state"></result>
    </resultMap>
    <select id="queryAllByMap" resultMap="BaseMap1">
        select * from userinfo
    </select>

结果: 

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

注意点:       

         一个xml文件中可以有多个resultMap,只要Id不同就行。(我们这里是所有的字段都写了)实际没写的字段,会按照默认的规则来帮助我们映射:当数据库字段和Java属性字段一直的话,就会自动映射。通常情况下,如果我们写了ResultMap,不论是否一致,都将属性写全。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring


二、数据库的多表查询

有两张表:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 数据库中的左连接操作:根据文章表中的用户id查找对应的用户表的用户信息,写法如下:我们现在就实现这个功能:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🌷方式1:使用对象user 

创建两个类:User类和Article类

注意点1:这里设置文章表的属性的时候,设置一个user对象。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 UserMapper与ArticleMapper

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

xml文件

注意点2:在ArticleMapper.xml文件中设置user的时候,要用association引入UserMapper的ResultMap的路径:路径名是UserMapper的namespace名+ResultMap的id名称。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring测试类:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 测试结果:

注意点3:可以看到在文章表中查询出来的结果,其中的用户信息是一个user对象来表示的。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🌷方式2:直接写具体的属性

注意1:这里的文章类:我们就不定义user对象了,而是要查询用户的Id和用户名,我们就将这两个字段定义出来。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

注意点2:xml文件中也是直接通过resutMap的result定义出用户的Id和用户名,不用再引入UserMapper.xml文件中的ResultMap了。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring结果: 

注意点3:可以看到最终查询的结果也是具体的用户Id和用户名信息,而不是方式1的整个user对象。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring


三、动态SQL的使用

动态SQL:根据输入参数的不同,动态的拼接SQL,从而完成不同条件下的SQL拼接。

        比如在实际场景下,有时候我们进行注册,有的字段是必填的,有的又不是必填的,如果在注册用户的时候有不确定的字段传入,那么怎么实现呢?

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🌷1、if标签:单个参数不确定

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 <insert id="insertByIf">
        insert into articleInfo ( title,content,uid      
        <if test="state!=null">
            ,state
         </if>
        )
        values ( #{title},#{content},#{uid}        
        <if test="state!=null">
            ,#{state}
        </if>
        )
    </insert>

(1)用法

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 测试结果1:当输入state状态: 【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 测试情况2:不输入state

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

注意:if标签里面的属性是Java对象的属性字段state,而不是数据库表中的字段。而insert中的sql语句的字段是数据库表中的字段,注意区分~

(2)存在问题

当我多个参数都不确定的时候,写成id标签的形式,会导致逗号放在哪里都存在问题。

        如果统一将逗号放在字段前面,当第一个字段为null的时候,整个SQL最前面就会多一个逗号;如果统一将逗号放在字段后面,当最后一个字段为null的时候,整个SQL最后面就会多一个逗号,所以这个时候我们就要用<trim>标签结合<if>标签,对多个字段都采取动态⽣成的⽅式了。

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🌷2、trim标签:多个参数不确定,搭配if标签一起使用

<trim>标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀:表示从(开始
  • suffix:表示整个语句块,以suffix的值作为后缀:表示从   )结束
  • prefixOverrides:表示整个语句块要去除掉的前缀:表示去掉左边的逗号
  • suffixOverrides:表示整个语句块要去除掉的后缀:表示去掉右边的逗号
 <insert id="insertByIf">
        insert into articleInfo
        <trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
            <if test="title!=null">
                title,
            </if>
            <if test="content!=null">
                content,
            </if>
            <if test="uid!=null">
                uid,
            </if>
            <if test="state!=null">
                state
             </if>

        </trim>
        values
        <trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
            <if test="title!=null">
                #{title},
            </if>
            <if test="content!=null">
                #{content},
            </if>
            <if test="uid!=null">
                #{uid},
            </if>
            <if test="state!=null">
                #{state}
            </if>
        </trim>
    </insert>

在以上 sql 动态解析时,会将第⼀个 <trim> 部分做如下处理:
(1)基于 prefix 配置,开始部分加上 (
(2)基于 suffix 配置,结束部分加上 )
(3)多个 <if>组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于 suffixO
verrides 配置去掉最后⼀个 ,
(4)注意 <if test=“state!= null”> 中的 state是传⼊对象的属性;

测试:当不传入state的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🌷3、where标签:搭配if标签

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

方式1:使用where关键字(注意不是where标签)

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

当uid为null的时候: 

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

当state为null的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

当uid和state为null的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

方式2:使用<where>标签

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 当uid为null的时候: 【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

当state为null的时候

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 当两个都为null的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 从上述案例中可以看出where标签的作用:

(1)生成where关键字;

(2)去掉多余的and;

(3)如果没有where条件,就不会生成where关键字

🌷4、set标签:搭配if标签

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

当只设置uid值的时候,测试通过(同样其他情况也是测试通过的。)

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

set作用:

(1)set标签生成set关键字;

(2)去除最后一个逗号。 

🌷5、foreach标签:用于批量操作,搭配if\where标签

批量操作:插入、删除、更新等。演示批量删除:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象;
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串。

 注意:collection中除了可以写Llist,还可以写参数名称,此时对参数进行重命名:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

🍉个人小结:

1、字段名称和程序中的属性名不同的情况,可使⽤ resultMap 配置映射。

2、多表查询:文章表中有用户Id和用户名,要通过文章表查询用户信息:有两种方式:

(1)在文章实体类定义属性为user,则文章表的xml文件中要通过association引入用户user的ResultMap的地址;

(2)直接在文章的实体类中定义属性用户Id和用户名,此时文章表中的xml文件通过resultMap引入这两个属性。

3、动态SQL:

(1)<if>标签是基础,后面的<trim>标签、<where>、<set>、<foreach>标签都是结合if标签使用的。

(2)当只有单个参数不确定的时候,使用If标签;

(3)当多个参数不确定,要trim标签;

(4)条件不确定的时候用where标签:也可以用where关键字加一个条件1=1;

(5)set标签设置 不确定的属性;

(6)foreach标签批量处理数据:插入、删除修改等。collection中传入list等;当对接口方法中的参数重命名后,collection也可以使用参数的名称。😁


【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL,Spring学习,mybatis,学习,sql,intellij-idea,spring

 文章来源地址https://www.toymoban.com/news/detail-610995.html

到了这里,关于【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis多表查询

    目录 1. 多表关系回顾 2. 一对一查询 2.1 一对一多表查询方式一:基于标签进行手动结果映射封装  2.2 一对一多表查询方式二 - 通过标签来封装属性中所关联的对象 3. 一对多查询 4. 多对多查询 在项目开发当中一对一关系的表不常见,因为一对一关系的两张表通常会合并为一

    2024年02月10日
    浏览(24)
  • MyBatis多表查询和注解开发

    一对一查询的模型 用户表和订单表的关系为, 一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 一对一查询的语句 对应的sql语句: 查询的结果如下: 创建Order和User实体 创建OrderMapper接口 配置OrderMappe

    2024年02月04日
    浏览(34)
  • 【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

    SSM( S pring、 S pringMVC、 M yBatis) Apache Shiro SpringBoot 事务 :若将 N 个 数据库操作 (CRUD)放到同一个事务中,则这 N 个数据库操作最终要么全都生效,要么全都不生效 🍀 开启事务【 START TRANSACTION 】 🍀 回滚事务:若事务中的某个数据库操作失败,其他所有数据库操作都需要

    2024年02月08日
    浏览(65)
  • springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

    mybatisplus实际上只对单表查询做了增强(速度会更快),从传统的手写sql语句,自己做映射,变为封装好的QueryWrapper。 本篇文章的内容是有两张表,分别是用户表和订单表,在不直接在数据库做表连接的情况下,通过后台代码完成①查询订单的同时查到该订单所属的用户,②

    2024年02月07日
    浏览(40)
  • mybatis-plus 多表关联条件分页查询

    此处以一对多,条件分页查询为例: 主表 明细表 0.请求dto 1.Controller 层: 注:我的项目中进行了service 读写分类配置,实际使用中,直接使用mybatis-plus中的 IUserService 对应的接口就行。 2.service 层 service impl实现层: 3.mapper 层 4.mapper.xml层 5.测试: 结果body: Q:todo page 分页会把

    2024年02月12日
    浏览(36)
  • mybatis-plus分页查询(springboot中实现单表和多表查询)

    一、mybatis-plus单表查询 使用mybatis-plus实现单表分页查询 非常方便,主要操作步骤如下: 配置分页查询拦截器 进行分页查询 1.首先,打开mybatis-plus官网的插件(插件主体) 或者点击mybatis-plus插件 我是配置在springboot项目中,所以找到springboot的分页配置 2.配置分页查询拦截器

    2024年02月08日
    浏览(32)
  • spring boot集成mybatis-plus——Mybatis Plus 多表联查(包含分页关联查询,图文讲解)...

     更新时间 2023-01-03 21:41:38 大家好,我是小哈。 本小节中,我们将学习如何通过 Mybatis Plus 实现 多表关联查询 ,以及 分页关联查询 。 本文以 查询用户所下订单 ,来演示 Mybatis Plus 的关联查询,数据库表除了前面小节中已经定义好的用户表外,再额外创建一张订单表,然后

    2024年02月01日
    浏览(72)
  • 【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询

    「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 前面篇章讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够,下面将讲解复合查询,首先回顾一下基本的查询。 使用的数据库是之前篇章的雇

    2024年02月11日
    浏览(38)
  • 最大子段和(动态规划详细解析)

    给出一个长度为 n n n 的序列 a a a ,选出其中连续且非空的一段使得这段和最大。 第一行是一个整数,表示序列的长度 n n n 。 第二行有 n n n 个整数,第 i i i 个整数表示序列的第 i i i 个数字 a i a_i a i ​ 。 输出一行一个整数表示答案。 样例输入 #1 样例输出 #1 样例 1 解释 选

    2024年02月06日
    浏览(33)
  • 【MySQL】学习多表查询和笛卡尔积

    🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​ 💫个人格言:“没有罗马,那就自己创造罗马~” 指的是从多张表中查询数据 首先准备好需要查询的数据表 - dept表 和 emp表 笛卡尔积:笛卡尔乘积是指在数学中,两个集合 A 集合和 B集合的所

    2024年02月19日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包