MyBatis-${}与#{}、插入数据获取自动生成的主键

mybatis技巧

1.${}和#{}的区别与使用

1.1 ${}和#{}的区别

#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。

${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。

通俗的来讲就是#{}会把里面的参数带上引号,而${}不会带上参数。
如果我们要传一些关键词的时候,我们就可以使用后者

根据car_type查询汽车为例观察两者的不同

CarMapper接口List selectByCarType(String carType);
CarMapper.xml(使用#{})image-20230404214931079
CarMapper.xml(使用${})image-20230404214940609

测试代码

@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();
}
  • 使用#{}
    【执行通过】
    image-20230404215303036
    ?表示占位符,效果同JDBC中一致
    这就是使用#{},他会进行预编译,然后给占位符传值
  • 使用${}
    【执行失败】
    image-20230404215741379
    image-20230404215757333

使用${},是直接把字符拼接到sql语句,再去执行

因为 燃油车 是一个字符串,在sql语句中应该添加单引号

修改代码

手动添加 ’ ’

image-20230404220000267

运行结果

image-20230404220042573

1.2 使用${}的场景

1.通过参数判断是升序asc还是降序desc

2.拼接表名

3.批量删除

4.模糊匹配

1.2.1批量删除

image-20230404221005441

对应的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.xmlimage-20230404221620253
@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();
    }

image-20230404222933001

2.插入数据时获取自动生成的主键

image-20230404223414232

插入一条新的记录之后,自动生成了主键,而这个主键需要在其他表中使用时。

插入一个用户数据的同时需要给该用户分配角色:需要将生成的用户的id插入到角色表的user_id字段上。

第一种方式:可以先插入用户数据,再写一条查询语句获取id,然后再插入user_id字段。【比较麻烦】

第二种方式:mybatis提供了一种方式更加便捷。

CarMapper接口void insertUseGeneratedKeys(Car car);
CarMapper.xmlimage-20230404223651611

测试

@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());
}

运行结果image-20230404223858209

我们后面就能直接这个id,而不需要再去查询一次id

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值