【MyBatis笔记】6 - 特殊SQL的执行:不能使用#{}的场景、获取自增的主键

165 阅读1分钟

视频链接:www.bilibili.com/video/BV1VP…

接口类综合代码:

public interface SQLMapper {
    /**
     * 根据用户名模糊查询用户信息
     */
    List<User> getUserByLike(@Param("username") String username);

    /**
     * 批量删除
     */
    int deleteMore(String ids);

    /**
     * 查询指定表中的数据
     */
    List<User> getUserByTableName(String tableName);

    /**
     * 添加用户
     */
    void insetUser(User user);
}

1、模糊查询

SQLMapper类:

public interface SQLMapper {
    /**
     * 根据用户名模糊查询用户信息
     */
    List<User> getUserByLike(@Param("username") String username);
}

SQLMapper.xml:

<!--    List<User> getUserByLike(@Param("username") String username);-->
<!--    使用#{},因为包括在单引号里,会被认为是字符串的一部分:select * from t_user where username like '%#{username}%'-->
<!--    三种方式-->
    <select id="getUserByLike" resultType="User">
     <!--  第一种 select * from t_user where username like '%${username}%'
       第二种 select * from t_user where username like concat('%', #{username}, '%')-->
       <!--第三种 推荐使用-->
        select * from t_user where username like "%"username"%"
    </select>

测试类:

    @Test
    public void testGetUserByLike(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
        List<User> user = mapper.getUserByLike("RUOYI");
        System.out.println(user);
    }

2、批量删除

SQLMapper类:

public interface SQLMapper {
    /**
     * 批量删除
     */
    int deleteMore(String ids);
}

SQLMapper.xml:

<!--    int deleteMore(String ids);-->
<!--    不能使用#{},因为他会自动添加单引号,变成delete from t_user where id in ('9,10,11')-->
    <delete id="deleteMore">
        delete from t_user where id in (${ids})
    </delete>

测试类:

    @Test
    public void testDeleteMore(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
        int result = mapper.deleteMore("12, 13");
        System.out.println(result);
    }

3、动态设置表名

SQLMapper类:

public interface SQLMapper {
    /**
     * 查询指定表中的数据
     */
    List<User> getUserByTableName(String tableName);
}

SQLMapper.xml:

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

测试类:

    @Test
    public void testGetUserByTableName(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
        List<User> t_user = mapper.getUserByTableName("t_user");
        System.out.println(t_user);
    }

4、添加功能获取自增的主键

SQLMapper类:

public interface SQLMapper {
    /**
     * 添加用户
     */
    void insetUser(User user);
}

SQLMapper.xml:

<!--    void insetUser(User user);-->
<!--    方法的返回值是固定的
        useGeneratedKeys    设置当前标签中的sql使用了自增的主键 (id)
        keyProperty         将自增的主键的值 赋值给 传输到映射文件中的参数的某个属性(user.id)
-->
    <insert id="insetUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values(null, #{username}, #{password},#{age},#{gender},#{email})
    </insert>

测试类:

    @Test
    public void testInsetUser(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
        mapper.insetUser(new User(null, "兔兔","111",11,"f","abc@qq.com"));
    }