尚硅谷MyBatis9_特殊sql的执行

模糊查询

在进行模糊查询的时候,如果使用 #{},那么得到的 sql 语句就会拼接错误。比如:

select * from t_user where username like '%#{username}%'

执行 sql 语句转换后会变成:

select * from t_user where username like '%?%'

也就是说使用 #{} 之后,它被当成匹配的字符串的一部分了。也就是说模糊查询不要使用 #{}#{} 会自动添加上单引号。

那么怎么做模糊查询才对呢?

  • 使用 ${},比如:

    select * from t_user where username like '%${username}%'
    
  • 使用拼接函数 +#{}

    <select id="getUserByLike" resultType="User">
        select *
        from t_user
        where username like concat('%', #{username}, '%')
    </select>
    

    但是这里两个百分号之间的单引号是怎么取消的没听懂

批量删除

由于 #{} 会自动添加上单引号,所以无法转换成正确的 sql 语句,需要使用 ${} 才可以正确使用

<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
    delete
    from t_user
    where id in (${ids})
</delete>

动态设置表名

使用 @Param() 指定表名,用 ${} 获取,因为这个不会添加单引号

<!--List<User> getAllUser(@Param("tableName") String tableName);-->
<select id="getAllUser" resultType="User">
    select *
    from ${tableName}
</select>

添加功能获取自增的主键

t_clazz(clazz_id,clazz_name)

t_student(student_id,student_name,clazz_id) ​

  1. 添加班级信息
  2. 获取新添加的班级的 id
  3. 为班级分配学生,即将某学的班级 id 修改为新添加的班级的 id
<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    insert into t_user
    values (null, #{username}, #{password}, #{age}, #{sex}, #{email})
</insert>

注意,我们在创建对象的时候并没有提供 id,当进行添加操作之后,就会将自增得到的 id 添加进 user 对象中。

  • useGeneratedKeys:设置当前标签中的 sql 语句使用了自增的主键
  • keyProperty:将自增的主键值赋给「参数的提供者」,这里的提供者是 User 类的实例

增删改具有固定的返回值,即改变的行数,所以并不能通过返回值的方式得到主键。只能将自增的主键作为对象的某一个属性值

@Test
public void testAdd() {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
    User user = new User(null, "nihao", "123456", 66, "男", "123@qq.com");
    int i = mapper.insertUser(user);
    System.out.println(user.getId());
}
---
6
posted @ 2023-03-20 21:04  ShaunY  阅读(11)  评论(0编辑  收藏  举报