NO.05 MyBatis中特殊SQL语句的执行

目录

1、前言

2、模糊查询

3、批量删除

4、动态获取表名

5、对于添加功能,获取数据库中自增的主键

6、测试类中的测试方法


MyBatis获取参数值的两种方式,一种是#{},一种是${}。其中#{}的实质填充占位符,而${}的实质是字符串的拼接;#{}会自动加单引号的,而${}需手动添加单引号。大多数情况下倾向于使用#{},但是在个别情况下需要使用${}。如模糊查询、批量删除、动态设置表明等功能在实现的时候,不能直接使用#{},否则出现各种问题,下面针对于这些问题提出解决方案。

1、前言

实体类以User类为例,数据库表以t_user表为例。User类结构、表结构以及数据库连接获取等参考NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查_qq_46053741的博客-CSDN博客

2、模糊查询

在Mapper接口中声明getUserByVague(@Param("str") String str)方法,方法返回值为List集合,集合中存储的类型是User类型,采用@Param注解的方式获取形参。

    //通过模糊查询查找李姓
    List<User> getUserByVague(@Param("str") String str);

在映射文件中实现Sql语句,分别使用${}和#{}的方式获取形参值,注意:使用${}要手动加单引号

<!--    List<User> getUserByVague(@Param("str") String str);-->
    <select id="getUserByVague" resultType="User">
<!--
        方式一:使用${}获取参数
        select *from t_user where username like '${str}%'
-->
<!--
        方式二:使用#{}获取参数
        select *from t_user where username like #{str}"%"
-->
<!--
        方式三:使用#{}与concat获取参数
-->
        select *from t_user where username like concat(#{str},"%")
    </select>

3、批量删除

对于批量删除操作,Sql语句使用in()的方式筛选需要删除的数据,该操作不需要设置结果类型resultType。实参采用拼接字符串的方式将字符串传递给形参,只能使用${}的方式获取形参值,此时不需要在${}外添加单引号;如果使用#{}方式获取形参值,则Sql语句中会自动拼接上单引号导致Sql语法错误。

例:

实参采用拼接字符串的方式将字符串传递给形参,在Mapper接口中声deleteByIds(@Param("ids") String ids)方法,采用@Paran注解的方式获取形参。

    //通过拼接字符串ids实现批量删除
    int deleteByIds(@Param("ids") String ids);

在映射文件中实现Sql语句,只能通过${}方式获取参数值。

<!--    void deleteByIds(@Param("ids") String ids);-->
    <delete id="deleteByIds">
        delete from t_user where id in(${ids})
<!-- 
    假设ids="4,5",使用#{}则Sql语句:
    delete from t_user where id in(#{ids})
    等同于
    delete from t_user where id in(’4,5‘)导致Sql语句出错。
-->
    </delete>

4、动态获取表名

动态获取表名和批量删除操作类似,只能通过${}方式获取形参值,此时不需要添加单引号,否则Sql语句出错。

例:

在Mapper接口中声明getAllUserByTablename(@Param("tablename") String tablename)方法,方法的返回值为List集合,List集合存储的类型为User类型,采用@Param注解的方式获取形参。

    //获取表名查询所有用户信息
    List<User> getAllUserByTablename(@Param("tablename") String tablename);

在映射文件中实现Sql语句,结果类型resultType为User类型

<!--    List<User> getAllUserByTablename(@Param("tablename") String tablename);-->
    <select id="getAllUserByTablename" resultType="User">
        select *from ${tablename}
<!--
    假设tablename="t_user",使用#{}则Sql语句:
    select *from #{tablename}
    等同于
    select *from 't_user'导致Sql语句出错。
-->
    </select>

5、对于添加功能,获取数据库中自增的主键

在设计表结构时,表的字段名id通常设为自增,并且在向表中添加数据时,实体类(如:User)的id属性通常赋值为NULL。此时要想获取表自增生成的id值要通过useGeneratedKeys和keyProperty属性获取id值。其中useGenerated属性默认值为false,要将其设置为true;keyProperty属性设置为想要获取的字段名(如:id)。

例:

在Mapper接口中声明insertUserAndGetId(User user)方法。

    //添加user信息并获取user的id值
    int insertUserAndGetId(User user);

在映射文件中实现Sql语句,此时可以通过#{}和${}两种方式访问user的属性获取对应的参数值,注意:${}需手动添加单引号。在insert标签中设置useGenerated属性值为true,keyProperty设置为id。

<!--    int insertUserAndGetId(User user);-->
    <insert id="insertUserAndGetId" useGeneratedKeys="true" keyProperty="id">
        insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
    </insert>

6、测试类中的测试方法

在下面测试类中测试本篇中的操作方法

public class UserMapperTest {

    @Test
    public void getUserByvague() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

        List<User> list=userMapper.getUserByVague("李");

        for(User user:list){
            System.out.println(user);
        }

        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void deleteByIds() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);


        int result=0;
        result=userMapper.deleteByIds("15,16,17");
        if(result>0){
            System.out.println("数据删除成功");
        }else{
            System.out.println("数据删除失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void getAllUserByTablename() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

        List<User> list=userMapper.getAllUserByTablename("t_user");

        for(User user:list){
            System.out.println(user);
        }

        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void insertUserAndGetId() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isInsert=0;
        List<User> list=new ArrayList<>();
        list.add(new User(null,"韩信","hanxin",23,'男'));
        for (User user:list) {
            isInsert=userMapper.insertUserAndGetId(user);
            if(isInsert>0){
                System.out.println("数据添加成功,id值:"+user.getId());
            }else{
                System.out.println("数据添加失败");
            }
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值