首页 > 移动平台 > 详细

03Mapper XML 文件(映射文件)

时间:2021-02-28 23:25:00      阅读:54      评论:0      收藏:0      [点我收藏+]

查询操作的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

03Mapper XML 文件(映射文件)

原文:https://www.cnblogs.com/leizia/p/14460991.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!