mybatis技巧
1.${}和#{}的区别与使用
1.1 ${}和#{}的区别
#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。
${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。
通俗的来讲就是#{}会把里面的参数带上引号,而${}不会带上参数。
如果我们要传一些关键词的时候,我们就可以使用后者
根据car_type查询汽车为例观察两者的不同
CarMapper接口 | List selectByCarType(String carType); |
---|---|
CarMapper.xml(使用#{}) | ![]() |
CarMapper.xml(使用${}) | ![]() |
测试代码
@Test
public void selectByCarType() {
SqlSession sqlSession = SqlSessionUtil.openSqlSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
List<Car> cars = carMapper.selectByCarType("燃油车");
cars.forEach(car -> System.out.println(car));//这儿使用的Lambda表达式
sqlSession.close();
}
- 使用#{}
【执行通过】
?表示占位符,效果同JDBC中一致
这就是使用#{},他会进行预编译,然后给占位符传值
- 使用${}
【执行失败】
使用${},是直接把字符拼接到sql语句,再去执行
因为 燃油车 是一个字符串,在sql语句中应该添加单引号
修改代码
手动添加 ’ ’
运行结果
1.2 使用${}的场景
1.通过参数判断是升序asc还是降序desc
2.拼接表名
3.批量删除
4.模糊匹配
1.2.1批量删除
对应的sql语句:
- delete from t_user where id = 1 or id = 2 or id = 3;
- delete from t_user where id in(1, 2, 3);
使用#{} :delete from t_user where id in(‘1,2,3’) 执行错误:1292 - Truncated incorrect DOUBLE value: ‘1,2,3’
使用${} :delete from t_user where id in(1, 2, 3)
CarMapper接口 | int deleteBatch(String ids); |
---|---|
CarMapper.xml | ![]() |
@Test
public void testDeleteBatch(){
SqlSession sqlSession = SqlSessionUtil.openSqlSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
int count = carMapper.deleteBatch("1,2,3");
System.out.println("删除了几条记录:" + count);
sqlSession.commit();
sqlSession.close();
}
1.2.2模糊匹配
<select id="selectLikeByBrand" resultType="Car">
select *
from t_car
where brand like '%${brand}%'
</select>
@Test
public void testSelectLikeByBrand(){
SqlSession sqlSession = SqlSessionUtil.openSqlSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
List<Car> cars = carMapper.selectLikeByBrand("宝马");
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
2.插入数据时获取自动生成的主键
插入一条新的记录之后,自动生成了主键,而这个主键需要在其他表中使用时。
插入一个用户数据的同时需要给该用户分配角色:需要将生成的用户的id插入到角色表的user_id字段上。
第一种方式:可以先插入用户数据,再写一条查询语句获取id,然后再插入user_id字段。【比较麻烦】
第二种方式:mybatis提供了一种方式更加便捷。
CarMapper接口 | void insertUseGeneratedKeys(Car car); |
---|---|
CarMapper.xml | ![]() |
测试
@Test
public void testInsertUseGeneratedKeys(){
SqlSession sqlSession = SqlSessionUtil.openSqlSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(null, "56665", "大众", 20000.00, "2022-12-12", "汽油车");
carMapper.insertUseGeneratedKeys(car);
sqlSession.commit();
sqlSession.close();
System.out.println("主键="+car.getId());
}
运行结果
我们后面就能直接这个id,而不需要再去查询一次id