【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文件中可以不设置返回的类型;但是对于查询,无论查询什么内容,都要设置返回的数据类型。如下:

查询:

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

 所以对于 select * from userinfo

结果: 

注意点:       

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第3张图片


二、数据库的多表查询

有两张表:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第4张图片

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第5张图片

方式1:使用对象user 

创建两个类:User类和Article类

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第6张图片

 UserMapper与ArticleMapper

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第7张图片

xml文件

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第8张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第9张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第10张图片测试类:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第11张图片

 测试结果:

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

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

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第12张图片

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第13张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第14张图片结果: 

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


三、动态SQL的使用

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

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第15张图片

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第16张图片

 
        insert into articleInfo ( title,content,uid      
        
            ,state
         
        )
        values ( #{title},#{content},#{uid}        
        
            ,#{state}
        
        )
    

(1)用法

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第17张图片

 测试结果1:当输入state状态: 【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第18张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第19张图片

 测试情况2:不输入state

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

(2)存在问题

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

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第20张图片

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

标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀:表示从(开始
  • suffix:表示整个语句块,以suffix的值作为后缀:表示从   )结束
  • prefixOverrides:表示整个语句块要去除掉的前缀:表示去掉左边的逗号
  • suffixOverrides:表示整个语句块要去除掉的后缀:表示去掉右边的逗号
 
        insert into articleInfo
        
            
                title,
            
            
                content,
            
            
                uid,
            
            
                state
             

        
        values
        
            
                #{title},
            
            
                #{content},
            
            
                #{uid},
            
            
                #{state}
            
        
    

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

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

3、where标签:搭配if标签

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第21张图片

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第22张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第23张图片

当uid为null的时候: 

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第24张图片

当state为null的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第25张图片

当uid和state为null的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第26张图片

方式2:使用标签

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第27张图片

 当uid为null的时候: 

当state为null的时候

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第28张图片

 当两个都为null的时候:

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第29张图片

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

(1)生成where关键字;

(2)去掉多余的and;

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

4、set标签:搭配if标签

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第30张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第31张图片

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第32张图片

set作用:

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

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

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

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

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第33张图片

【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第34张图片

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

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

个人小结:

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

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

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

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

3、动态SQL:

(1)标签是基础,后面的标签、标签都是结合if标签使用的。

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

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

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

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

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


【MyBatis 学习三】子段不一致问题 && 多表查询 && 动态SQL_第35张图片

 

你可能感兴趣的:(Spring学习,mybatis,学习,sql,intellij-idea,spring)