MyBatis入门-多个接口参数的用法

MyBatis中多个接口参数的用法

本篇内容

  • mapper接口中参数的类型
  • mapper接口参数传递给xml,xml如何获取参数值
  • @param注解的作用

介绍-参数类型

mapper接口中的参数类型为:

  • 基本类型
  • JavaBean

mapper中的参数只有一个且为基本类型时,sql语句中只会使用一个参数。当参数是一个JavaBean类型时,它再xml文件中对应的sql语句会有多个参数。

业务中,经常会遇到多个参数(少量)的情况,若将参数合并到一个JavaBean中和分别创建JavaBean都不太方便。因此对于参数比较少的情况,还有两种方式传参

  1. 使用Map类型
  2. 使用@Param注解

参数-Map类型

Map中通过key来映射XML中SQL使用的参数值名字,value用来存放参数值。

这种方式很少使用。

参数-使用@Param注解

mapper接口定义,未使用@Param注解

 /**
     * 根据用户id和角色的enabled状态获取用户的角色
     * @param userId
     * @param enabled
     * @return
     */
    List<SysRole> selectRoleByUserIdAndRoleEnabled(Long userId, Integer enabled);

xml定义

<select id="selectRoleByUserIdAndRoleEnabled" resultType="tk.mybatis.simple.model.SysRole">
        SELECT
            r.id,
            r.role_name,
            r.enabled,
            r.create_by,
            r.create_time
        FROM
            `sys_user` u
        INNER JOIN sys_user_role ur ON u.id = ur.user_id
        INNER JOIN sys_role r ON r.id = ur.role_id
        WHERE
            u.id = #{userId}
        AND r.enabled = #{enabled}
    </select>

测试方法

public void selectRoleByUserIdAndRoleEnabled() {
    
    
        SqlSession sqlSession = getSqlSession();
        try {
    
    
            SysUserMapper userMapper = sqlSession.getMapper(SysUserMapper.class);
            // 调用查询方法
            List<SysRole> sysRoles = userMapper.selectRoleByUserIdAndRoleEnabled(1L, 1);
            Assert.assertNotNull(sysRoles);
            Assert.assertTrue(sysRoles.size()>0);
        } finally {
    
    
            sqlSession.close();
        }
    }

测试结果,有异常信息org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]

这个错误表示,xml可用的参数只有0、1、param1、param2,没有userId。0、1、param1、param2是MyBatis根据参数位置自定义的名字,如果将xml中的#{userId}改为#{0},#{param1},将#{enabled}改为#{1}、#{param2},就可调用了。

将mapper中接口改为如下

/**
     * 根据用户id和角色的enabled状态获取用户的角色
     *
     * @param userId 用户id主键
     * @param enabled 是否启用
     * @return 用户角色信息
     */
    List<SysRole> selectRoleByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);

重新执行测试方法的结果如下,这时xml文件中对应的sql的可用参数变成了userId,enabled,param1,param2,如果把#{userId}改为#{param1},把#{enabled}改为#{param2},也可以成功执行

==>  Preparing: SELECT r.id, r.role_name, r.enabled, r.create_by, r.create_time FROM `sys_user` u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON r.id = ur.role_id WHERE u.id = ? AND r.enabled = ? 
==> Parameters: 1(Long), 1(Integer)
<==    Columns: id, role_name, enabled, create_by, create_time
<==        Row: 1, 管理员, 1, 1, 2021-01-28 21:58:32.0
<==        Row: 2, 普通用户, 1, 1, 2021-01-28 21:58:32.0
<==      Total: 2

总结:给参数配置@Param注解后,MyBatis会将参数封装为map类型,@Param注解值作为key。

而当只有一个参数(基本类型)时,MyBatis会直接把唯一的参数值拿来使用,而不必关心参数名。

猜你喜欢

转载自blog.csdn.net/weixin_43169156/article/details/114968825
今日推荐