特殊SQL的执行
2026/1/15大约 2 分钟MyBatis模糊查询批量删除
特殊SQL的执行
1. 模糊查询
模糊查询有三种方式:
// Mapper接口
List<User> getUserByLike(@Param("username") String username);方式一:使用 ${}
<select id="getUserByLike" resultType="User">
select * from t_user where username like '%${username}%'
</select>方式二:使用 concat 函数
<select id="getUserByLike" resultType="User">
select * from t_user where username like concat('%', #{username}, '%')
</select>方式三:使用 "%"#{}"%"(推荐)
<select id="getUserByLike" resultType="User">
select * from t_user where username like "%"#{username}"%"
</select>推荐
第三种方式最常用,既安全又简洁。
2. 批量删除
// Mapper接口
int deleteMore(@Param("ids") String ids);<delete id="deleteMore">
delete from t_user where id in (${ids})
</delete>注意
这里使用 ${} 的原因是:#{} 解析后会带单引号 '',而 in 语句中不需要单引号。
例如:delete from t_user where id in ('1,2,3') 是错误的,应该是 delete from t_user where id in (1,2,3)
测试代码:
@Test
public void testDeleteMore() {
int result = mapper.deleteMore("1,2,3");
System.out.println(result);
}3. 动态设置表名
// Mapper接口
List<User> getUserByTableName(@Param("tableName") String tableName);<select id="getUserByTableName" resultType="User">
select * from ${tableName}
</select>注意
表名不能使用 #{},因为表名不能带单引号。
4. 添加功能获取自增的主键
// Mapper接口
void insertUser(User user);<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null, #{username}, #{password}, #{age}, #{sex}, #{email})
</insert>属性说明
- useGeneratedKeys:设置使用自增的主键
- keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数 user 对象的某个属性中
测试代码
@Test
public void testInsertUser() {
User user = new User(null, "王五", "123456", 30, "男", "wangwu@qq.com");
mapper.insertUser(user);
System.out.println("自增主键: " + user.getId());
}执行后,user.getId() 就能获取到数据库自动生成的主键值。
总结
| 场景 | 使用方式 | 原因 |
|---|---|---|
| 模糊查询 | "%"#{xxx}"%" | 安全且简洁 |
| 批量删除 | ${ids} | in 语句不能带单引号 |
| 动态表名 | ${tableName} | 表名不能带单引号 |
| 获取自增主键 | useGeneratedKeys + keyProperty | 将主键值回填到对象属性 |
