Javaweb梳理15——MyBatis参数传递以及注解实现CURD
Javaweb梳理15——MyBatis参数传递以及注解实现CURD
- 15 MyBatis参数传递
- 15.1 MyBatis参数传递
- 15.2 单个参数
15 MyBatis参数传递
15.1 MyBatis参数传递
如下面的代码。就是接收连个参数,而接受多个参数需要使用@Param注解,那么为什么要加该注解呢?这个问题要弄明白就必须来研究Mybatis底层对于这些参数是如何处理的。
User select(@Param("username") String username,
@Param("password")String password);
<select id="select" resultType="user">
select *
from tb_user
where
username=#{username}
and password=#{password}
</select>
我们在接口方法中定义多个参数,Mybatis会将这些参数封装成Map集合对象,值就是参数值,而键在没有使用@Param
注解时有以下命名规则:
- 以arg开头:第一个参数就叫arg0;第二个参数就叫arg1,以此类推。如:
map.put(“arg0”,参数值1);
map.put(“arg1”,参数值2);
- 以param开头:第一个参数就叫param1,第二个参数就叫param2,以此类推,如:
map.put(“param1”,参数值1);
map.put(“param2”,参数值2);
代码验证:
- 在
UserMapper
接口中定义如下方法
User select(String username,String password);
- 在
UserMapper.xml
映射配置文件中定义SQL
<select id="select" resultType="user">
select *
from tb_user
where
username=#{arg0}
and password=#{arg1}
</select>
或者
<select id="select" resultType="user">
select *
from tb_user
where
username=#{param1}
and password=#{param2}
</select>
- 运行代码结果如下
在映射配合文件的SQL语句中使用用 arg
开头的和 param
书写,代码的可读性会变的特别差,此时可以使用 @Param
注解。
在接口方法参数上使用 @Param
注解,Mybatis 会将 arg
开头的键名替换为对应注解的属性值。
代码验证:
在 UserMapper
接口中定义如下方法,在 username
参数前加上 @Param
注解
User select(@Param("username") String username, String password);
Mybatis 在封装 Map 集合时,键名就会变成如下:
map.put(“username”,参数值1);
map.put(“arg1”,参数值2);
map.put(“param1”,参数值1);
map.put(“param2”,参数值2);
- 在
UserMapper.xml
映射配置文件中定义SQL
<select id="select" resultType="user">
select *
from tb_user
where
username=#{username}
and password=#{param2}
</select>
- 运行程序结果没有报错。而如果将
#{}
中的username
还是写成arg0
<select id="select" resultType="user">
select *
from tb_user
where
username=#{arg0}
and password=#{param2}
</select>
- 运行程序则可以看到错误
结论:以后接口参数是多个时,在每个参数上都使用@Param
注解。这样代码的可读性更高。
15.2 单个参数
- POJO类型
直接使用。要求属性名
和参数占位符名称
一致 - Map集合类型
直接使用。要求map集合的键名
和参数占位符名称
一致 - Collection集合类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put(“arg0”,collection集合);
map.put(“collection”,collection集合);
可以使用@Param
注解替换map集合中默认的 arg 键名。
- List集合类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put(“arg0”,list集合);
map.put(“collection”,list集合);
map.put(“list”,list集合);
可以使用@Param
注解替换map集合中默认的 arg 键名。
- Array类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put(“arg0”,数组);
map.put(“array”,数组);
可以使用@Param
注解替换map集合中默认的 arg 键名。
- 其他类型
比如int类型,参数占位符名称
叫什么都可以。尽量做到见名知意。如下: - 查询 :@Select
- 添加 :@Insert
- 修改 :@Update
- 删除 :@Delete
接下来我们做一个案例来使用 Mybatis 的注解开发
代码实现
将之前案例中UserMapper.xml中的根据id查询数据的statement注释掉
- 在
UserMapper
接口的selectById
方法上添加注解
- 运行测试程序也能正常查询到数据
我们课程上只演示这一个查询的注解开发,其他的同学们下来可以自己实现,都是比较简单。
注意:在官方文档中入门
中有这样的一段话:
所以,注解完成简单功能,配置文件完成复杂功能。
而我们之前写的动态 SQL 就是复杂的功能,如果用注解使用的话,就需要使用到 Mybatis 提供的SQL构建器来完成,而对应的代码如下:
上述代码将java代码和SQL语句融到了一块,使得代码的可读性大幅度降低。
MyBatis 参数封装:
* 单个参数:
1. POJO类型:直接使用,属性名 和 参数占位符名称 一致
2. Map集合:直接使用,键名 和 参数占位符名称 一致
3. Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",collection集合);
map.put("collection",collection集合);
4. List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",list集合);
map.put("collection",list集合);
map.put("list",list集合);
5. Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",数组);
map.put("array",数组);
6. 其他类型:直接使用
* 多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)
---------------@Param("username")
map.put("username",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)