03Mapper XML 文件(映射文件)

查询操作的select标签需要两个属性:id, resultType/resultMap(结果类型)

增删改标签只需要一个属性:id

CRUD标签

select标签

03Mapper XML 文件(映射文件)

insert标签

03Mapper XML 文件(映射文件)

update

03Mapper XML 文件(映射文件)

delete

03Mapper XML 文件(映射文件)

映射文件中语句接收方法参数

CRUD标签都有一个属性parameterType,statement通过它指定接收的参数类型。
接收参数的方式有两种:

 1. #{} 预编译
 2. ${} 非预编译(直接的sql拼接,不能防止sql注入)

参数类型有三种:

1、基本数据类型
2、HashMap(使用方式和pojo类似)
3、Pojo自定义包装类型

${}的用法

场景:数据库有两个一模一样的表。(历史表,当前表)
查询表中的信息,有时候从历史表中去查询数据,有时候需要去新的表去查询数据。希望使用1个方法来完成操作。

在UserMapper接口中,添加根据表名查询用户信息的方法:
03Mapper XML 文件(映射文件)
在UserMapper映射文件中,添加方法对应的statement:
03Mapper XML 文件(映射文件)

输出(报错):
03Mapper XML 文件(映射文件)

如果你要动态传入的字段名是表名,并且sql执行是预编译的,这显然是不行的,所以你必须改成非预编译的,也就是这样:
03Mapper XML 文件(映射文件)
注意:

使用 ${} 去接收参数信息,在一个参数时,默认情况下必须使用${value}获取参数值,
而 #{} 只是表示占位,与参数的名字无关,如果只有一个参数,可以使用任意参数名接收参数值,会自动对应。

但是这并不是一种稳妥的解决方案,推荐使用@Param注解指定参数名,所以以上接口及映射文件可以改成如下:
03Mapper XML 文件(映射文件)
03Mapper XML 文件(映射文件)
一个参数时,在使用#{}传参时,可以通过任意参数名接收参数;而${},默认必须通过value来接收参数。
可以通过@Param注解指定参数名

#{}接受多个参数

当mapper接口要传递多个参数时,有两种传递参数的方法:

1、默认规则获取参数{arg0, arg1, param1, param2}
2、使用@Param注解指定参数名

案例:实现一个简单的用户登录,根据username和password验证用户信息
在UserMapper接口中,添加登陆方法:
03Mapper XML 文件(映射文件)
在UserMapper.xml配置中,添加登陆方法对应的Statement配置:
03Mapper XML 文件(映射文件)
在UserMapperTest测试用例中,添加测试方法:
03Mapper XML 文件(映射文件)
运行报错:
03Mapper XML 文件(映射文件)
注意报错信息:没有找到参数userName,可用的参数是:[arg1,arg0,param1,param2],所以可有以下解决方案:

最终解决方案:
在接口方法中的参数前,添加@Param注解指定参数名
03Mapper XML 文件(映射文件)
03Mapper XML 文件(映射文件)
通常在方法的参数列表上加上一个注解@Param(“xxxx”) 表示参数的名字,然后通过${“xxxx”}或#{“xxxx”}获取参数

注意:

单个参数时,#{}与参数名无关的。${}默认通过value取值
多个参数时,#{} ${}与参数名( @Param("参数名") )有关。

什么时候需要加@Param注解?什么时候不加?

单个参数不加,多个参数加

map & pojo 不需要加 @param
多参数建议加 @param ,不加就需要按照param1 param2 ...paramN
List & Array 可以不加 @param 如果不加 @param取值需要写 list & array
如果有多个List参数那么取值 param1 param2 ... paramN

终极解决方案:都加。

ResultMap:只要是关联查询一定是resultMap

03Mapper XML 文件(映射文件)

上一篇:【安卓】使用Handler出现的警告


下一篇:iOS 14.5 有啥新功能?Apple Watch 也能解锁 iPhone 了