Mybatis实战练习六【批量删除Mybatis参数传递】
目录
- 💂 个人主页: 爱吃豆的土豆
🌈欢迎加入社区,福利多多哦!土豆社区
- 🤟数据库专栏更新完毕:数据库知识
- 🤟JDBC专栏更新完毕:JDBC知识
- 🤟Mybatis专栏更新中:Mybatis知识
- 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
批量删除
编写接口方法
编写SQL语句
编写测试方法
Mybatis参数传递
多个参数
单个参数
批量删除
如上图所示,用户可以选择多条数据,然后点击上面的 删除
按钮,就会删除数据库中对应的多行数据。
编写接口方法
在 BrandMapper
接口中定义删除多行数据的方法。
/**
* 批量删除
*/
void deleteByIds(int[] ids);
参数是一个数组,数组中存储的是多条数据的id
编写SQL语句
在 BrandMapper.xml
映射配置文件中编写删除多条数据的 statement
。
编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 foreach
标签供我们使用
foreach 标签
用来迭代任何可迭代的对象(如数组,集合)。
-
collection 属性:
-
mybatis会将数组参数,封装为一个Map集合。
-
默认:array = 数组
-
使用@Param注解改变map集合的默认key的名称
-
-
-
item 属性:本次迭代获取到的元素。
-
separator 属性:集合项迭代之间的分隔符。
foreach
标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。 -
open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
-
close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
<delete id="deleteByIds">
delete from tb_brand where id
in
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>
;
</delete>
假如数组中的id数据是{1,2,3},那么拼接后的sql语句就是:
delete from tb_brand where id in (1,2,3);
编写测试方法
在 test/java
下的 com.itheima.mapper
包下的 MybatisTest类中
定义测试方法
@Test
public void testDeleteByIds() throws IOException {
//接收参数
int[] ids = {5,7,8};
//1. 获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//SqlSession sqlSession = sqlSessionFactory.openSession(true);
//3. 获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//4. 执行方法
brandMapper.deleteByIds(ids);
//提交事务
sqlSession.commit();
//5. 释放资源
sqlSession.close();
}
Mybatis参数传递
Mybatis 接口方法中可以接收各种各样的参数,如下:
-
多个参数
-
单个参数:单个参数又可以是如下类型
-
POJO 类型
-
Map 集合类型
-
Collection 集合类型
-
List 集合类型
-
Array 类型
-
其他类型
-
多个参数
如下面的代码,就是接收两个参数,而接收多个参数需要使用 @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
注解。这样代码的可读性更高。==
单个参数
-
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类型,
参数占位符名称
叫什么都可以。尽量做到见名知意