第三十天 Java基础学习(二十四)

本文详细介绍了MyBatis中如何获取自增主键的值,包括使用<selectKey>和<insert>的useGeneratedKeys属性。此外,还深入探讨了动态SQL的实现,如if、choose、trim、set、foreach、bind、sql和include标签的使用。通过这些标签,可以实现灵活的SQL拼接,适应多变的查询条件。文章还提及了MyBatis的注解使用,如@SelectKey,以及SQL构建器。最后,讨论了多表查询的几种方式,包括业务装配、N+1查询、联合查询和延迟加载。
摘要由CSDN通过智能技术生成

一、主键回填

      在一些特殊的需求中,需要执行完新增的SQL后立即知道新增时主键的值。如果主键的值是自己设置的固定值,可以知道主键是多少。但是很多时候都是使用MySQL的主键自增,这时想要获取主键的值就需要通过特殊的方式获取了。

●在MyBatis中有两种方式可以获取到自增主键的值:

•使用<selectKey>子标签编写SQL进行回填属性。

•使用<select>的useGeneratedKeys属性进行自动回填

●selectKey的使用

• 在接口中添加方法

在接口中添加方法。 

//参数peo中包含了name值和address值。

int insert1(People peo);

•在映射文件中添加标签

在映射文件中添加标签与接口中方法进行绑定。

<selectkey>标签是<insert>的子标签,作用:把查询到的结果填充进行回填

keyProperty:接口方法参数中,对象的哪个属性需要进行回填

resultType:SQL查询到的结果

select @@identity:是MySQL内置的全局变量表示获取到自增主键值。

order:selectKey中SQL是在外面SQL执行之前还是之后。可取值:AFTER和BEFORE

●自动主键回填

      MyBatis的映射文件的<insert>标签带有自动主键回填功能,只需要设置useGeneratedKeys进行开启自动主键回填功能,同时设置keyProperty的值需要回填到对象的哪个属性。

   直接修改映射文件中insert1的内容,修改后运行测试类,查看控制台输出对象值是否带有主键值。

二、动态SQL

●动态SQL引入

MyBatis在简化操作方法提出了动态SQL功能,将使用Java代码拼接SQL语句,改变为在XML映射文件中截止标签拼接SQL语句。相比而言,大大减少了代码量,更灵活、高度可配置、利于后期维护

MyBatis中动态SQL是编写在mapper.xml中的,其语法和JSTL类似,但是却是基于强大的OGNL表达式实现的。

为了查看动态SQL最终执行时的SQL,先把日志配置上。

●if标签

通过if处理用户多变的查询条件

接口代码

List<People> selectIf(People people);

mapper映射文件通过if进行判断参数的属性是否为null。

<if>标签的test属性值为OGNL(对象导航图语言)表达式,通过对象属性名可以快速获取到对象属性值。

•namel=null:OGNL表达式,直接写属性名可以获取到属性值。不需要添加$或#

•name=#(name]中name是SQL的列名。#(name)是MyBatis获取参数对象属性值的写法(之前学习的)。

•where 1=1中1=1是为了保证SQL语法的正确性。如果if成立没有1=1最后的SQL就是where and name=xxx这种写法是不对的。

•通过测试类中是否设置对象属性值来控制SQL,如果name属性有值,address属性没有值。最终执行的SQL就没有and name=xxx。

●choose

choose标签相当于Java中的switch..case...default,在choose标签里面可以有多个when标签和一个otherwise(可以省略)标签。只要里面有一个when成立了后面的when和otherwise就不执行了。

●trim标签

if标签中为了保证语法的正确性,需要在SQL中明确指定where 1=1,其中1=1存在的意义单纯为了保证语法的正确性,没有实际意义的。可以通过trim标签动态进行截取添加,省略where1=1,

•trim标签包含四个属性:

prefix:只要内容不是空字符串(""),就在子内容前面添加特定字符串。

prefixOverrides:如果里面内容是以某个内容开头,去掉这个内容。

suffix:只要内容不是空字符串(""),就在子内容后面添加特定字符串。

suffixOverrides

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值