Mybatis框架的使用之三(条件SQL)

对上次内容的补充:上一次通过Mytatis实现了最简单的select count(1) 查询,返回的类型是基本的int值,实际上在使用中,查询返回的结果也可能复杂数据类型,比如查询所有用户信息,那么返回的就可能是一个用户的集合,这种情况下,返回类型resultType不是写List,而是要具体到集合中的元素的类型,比如返回的是User对象集合,那么resultType应该是User这个类。具体操作通过带参查询一起展示:

一、单参数SQL:

需求:通过姓名,对所有用户进行模糊查找

首先,我们到UserMapper的接口创建新的抽象方法:

List<User> getUserListByName(String userName);

然后到UserMapper.xml编写sql语句。因为依旧是查询,所以再新建一个select标签:

<!-- 根据用户名称查询用户列表(模糊查询) -->
<!-- 依旧要注意,select标签的id值要跟接口的抽象方法名一致! -->
<!-- resultType返回的结果是User的集合,所以是User -->
<!-- 这次出现了新的属性 parameterType,参数的类型,这里是字符串 -->
    <select id="getUserListByName" resultType="User" parameterType="String">
    <!--JDBC中,对于参数是用?代替,mybatis则使用#{参数名},要注意参数名是跟接口中方法的形参名称一致 ,前后两个%则用于实现模糊查找-->
	select * from smbms_user where userName like CONCAT('%',#{userName},'%')
	</select>

到测试类中创建测试方法:

 public void getUserListByName() {
        SqlSession sqlSession = null;
        List<User> list;
        try {
            sqlSession = MyBatisUtils.getSQLSession();
            //这里直接传实参,查找姓名中带"赵"字的用户
            list = sqlSession.getMapper(UserMapper.class).getUserListByName("赵");
            for (User user : list) {
                logger.debug("UserCode:" + user.getUserCode() + "\tUserName:"
                        + user.getUserName());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

执行测试方法,控制台输出信息如下:

在这里插入图片描述

结果主要是这几行:

Preparing: select * from smbms_user where userName like CONCAT(’%’,?,’%’)
查询语句,可以看到编写时使用的#{}已经变成了JDBC的?,因此mybatis实质就是对JDBC的封装

Parameters: 赵(String)
参数以及类型

UserCode:zhaoyan UserName:赵燕
UserCode:zhaomin UserName:赵敏
查询并遍历的结果

至此,单条件(单参数)的查询就完成了。

二、多参数SQL:

多参数的sql语句执行主要有两个解决思路,1是有几个条件就传递几个参数,2封装一个对象作为参数。下面分别进行说明:

1、传递多个参数:
这是最容易想到的方式,在JDBC中也可以通过设置多个?的方式实现多条件操作。
需求模拟:修改用户密码。为了方便操作这里不进行新旧密码匹配。
需要两个参数,1是用户的id值,2是新密码
还是先创建接口的抽象方法:

//返回类型是int,表示受影响的行数
int updatePwd(@Param("id") Integer id, @Param("userPassword") String pwd);

这里小伙伴可能会注意到,每一个参数的前面多了一个@Param的注解。原因是Mybatis实际上是用过Map的方式,通过key来获得value。在这里,@Param(“id”)里的id就作为了key,而参数Integer id的id就是value,之后同理。 可能有的小伙伴会疑惑,为什么只传递一个参数的时候没有使用@Param注解,也是可以成功执行,那是因为一个参数的情况下Mybatis会自动产生一个跟value同名的key。因此实际上,即使是一个参数,规范的写法也是应该加上@Param注解。

下面编写Mapper文件,这里的需求是修改密码,因此创建的是update标签

<update id="updatePwd">
		//需要说明的是,#{参数名}应该是与接口方法中注解的名字一致
        UPDATE smbms_user SET userPassword=#{userPassword} where id=#{id}
    </update>

测试方法:

 public void updatePwd() {
        SqlSession sqlSession = null;
        int count = 0;
        try {
            sqlSession = MyBatisUtils.getSQLSession();
            //将id值是17的用户的密码修改为"666666"
            count = sqlSession.getMapper(UserMapper.class).updatePwd(17, "666666");
            //这里出现了新的方法commit(),因为在创建sqlsession对象的时候,我们打开了事务控制,因此语句执行完毕后必须提交才能生效
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            //如果进入了catch块,则回滚不生效。
            sqlSession.rollback();
            count = 0;
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
        logger.debug("testUpdatePwd----------" + count);

    }

执行的结果我就不贴图了,如果数据库的用户表存在id是17的用户,且各个配置文件没有错误的话,影响的行数就是1,表示修改成功。可以刷新表查看。

刚才说到Mybatis的多参实际上是Map的形式,那么我们必然也可以通过创建一个Map,用它来作为参数进行传递
需求分析:通过姓名以及职位id,查询满足条件的用户

先贴一张表截图:
在这里插入图片描述
接口方法:

    List<User> getUserListByMap(Map<String, String> userMap);

Mapper.xml语句:

//返回类型不变,只是参数类型,我们使用了Map
  <select id="getUserlistByMap" resultType="User" parameterType="Map">
		select * from smbms_user where userName like 
		   <!-- 下面每一个#{}内的名称要与创建的Map中的key一一对应 -->
		CONCAT('%',#{userName},'%') AND  userRole = #{userRole}
	</select>

创建测试类:

 public void getUserlistByMap() {
        SqlSession sqlSession = null;
        List<User> list;
        Map<String, String> userMap = new HashMap<>();
        //map里每一个key,都与mapper文件SQL语句中的#{}一一对应
        userMap.put("userName", "赵");
        userMap.put("userRole", "2");
        try {
            sqlSession = MyBatisUtils.getSQLSession();
            list = sqlSession.getMapper(UserMapper.class).getUserListByMap(userMap);
            for (User user : list)
                logger.debug("UserCode:" + user.getUserCode() + "\tUserName:"
                        + user.getUserName() + "\tUserAddress:"
                        + user.getAddress() + "\tage:" + user.getAge() + "\taddress:" + user.getAddress());

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

最终运行的结果是:
Preparing: select * from smbms_user where userName like CONCAT(’%’,?,’%’) AND userRole = ?

Parameters: 赵(String), 2(String)

UserCode:zhaomin UserName:赵敏 UserAddress:北京市昌平区天通苑3区12号楼 age:31 address:北京市昌平区天通苑3区12号楼

当然,也可以使用封装User对象的方式。mapper文件中parameterType类型为User,测试类中通过User user = new User()创建user对象,然后通过user.setUserName(“赵”)、user.setUserRole(2),然后将user对象作为方法的实参。

Mybatis框架的使用之四传送门:
https://blog.csdn.net/wangduanqs/article/details/85023293

猜你喜欢

转载自blog.csdn.net/wangduanqs/article/details/85016560