查询操作的select标签需要两个属性:id, resultType/resultMap(结果类型)
增删改标签只需要一个属性:id
CRUD标签
select标签
insert标签
update
delete
映射文件中语句接收方法参数
CRUD标签都有一个属性parameterType,statement通过它指定接收的参数类型。
接收参数的方式有两种:
1. #{} 预编译
2. ${} 非预编译(直接的sql拼接,不能防止sql注入)
参数类型有三种:
1、基本数据类型
2、HashMap(使用方式和pojo类似)
3、Pojo自定义包装类型
${}的用法
场景:数据库有两个一模一样的表。(历史表,当前表)
查询表中的信息,有时候从历史表中去查询数据,有时候需要去新的表去查询数据。希望使用1个方法来完成操作。
在UserMapper接口中,添加根据表名查询用户信息的方法:
在UserMapper映射文件中,添加方法对应的statement:
输出(报错):
如果你要动态传入的字段名是表名,并且sql执行是预编译的,这显然是不行的,所以你必须改成非预编译的,也就是这样:
注意:
使用 ${} 去接收参数信息,在一个参数时,默认情况下必须使用${value}获取参数值,
而 #{} 只是表示占位,与参数的名字无关,如果只有一个参数,可以使用任意参数名接收参数值,会自动对应。
但是这并不是一种稳妥的解决方案,推荐使用@Param注解指定参数名,所以以上接口及映射文件可以改成如下:
一个参数时,在使用#{}传参时,可以通过任意参数名接收参数;而${},默认必须通过value来接收参数。
可以通过@Param注解指定参数名
#{}接受多个参数
当mapper接口要传递多个参数时,有两种传递参数的方法:
1、默认规则获取参数{arg0, arg1, param1, param2}
2、使用@Param注解指定参数名
案例:实现一个简单的用户登录,根据username和password验证用户信息
在UserMapper接口中,添加登陆方法:
在UserMapper.xml配置中,添加登陆方法对应的Statement配置:
在UserMapperTest测试用例中,添加测试方法:
运行报错:
注意报错信息:没有找到参数userName,可用的参数是:[arg1,arg0,param1,param2],所以可有以下解决方案:
最终解决方案:
在接口方法中的参数前,添加@Param注解指定参数名
通常在方法的参数列表上加上一个注解@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