Mapper XML 文件(映射文件)
小贴士:
-
查询操作的select标签需要两个属性:id、resultType/resultMap(结果类型)
-
增删改标签只需要一个属性:id
CRUD标签
select
insert
update
delete
映射文件中语句接收方法参数
CRUD标签都有一个属性parameterType,statement通过它指定接收的参数类型。
接收参数的方式有两种:
#{} 预编译
${} 非预编译(直接的sql拼接,不能防止sql注入)
参数类型有三种:
基本数据类型
HashMap(使用方式和pojo类似)
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
sql片段
很多时候同一个sql片段,可能在很多映射文件里都有使用,这就需要添加一个映射文件,用来统一定义sql片段。
如下,在resource目录下新增CommonSQL.xml文件:
内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace(命名空间):映射文件的唯一标识 --> <mapper namespace="CommonSQL"> <sql id="commonSql"> id, user_name, password, name, age, sex, birthday, created, updated </sql> </mapper>
定义好sql片段的映射文件之后,接下来就该使用它了,首先应该把该映射文件引入到mybatis的全局配置文件中(mybatis-config.xml):
最后在需要使用该sql片段的地方通过include标签的refId属性引用该sql片段:<include refId="名称空间.sql片段的id" />
在UserMapper.xml的映射文件中,进一步改造根据用户名查询用户信息
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/17156309.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步