Mybatis(三)-Mybatis的Mapper接口的变量详解

本文介绍了MyBatis中不同参数类型的传参方式。包括单个字面量类型参数,可用${}和#{}以任意名称取值;多个字面量类型参数,MyBatis会将其放入map集合;map集合类型参数,手动创建map后通过键取值;实体类类型参数,通过访问属性名获取属性值。同时提醒${}需手动加单引号。

单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型

此时可以使用 ${} 和 #{} 以任意的名称获取参数的值,

注意 ${} 需要手动加单引号

字面量:字符串、基本数据类型、基本数据类型对应的包装类 例如: int a = 1

如:

UserMapper.java

User getUserByUsername(String username);

UserMapper.xml

<select id="getUserByUsername" parameterType="java.lang.String" resultType="User">
    select * from t_user where username = #{username}
  </select>

通过测试代码:

        @Test
        public void testgetUserByUsername(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.getUserByUsername("test1");
            System.out.println(user);
            sqlSession.close();
        }

输出:

如果使用 ${},则如果是字符串参数,则要手动添加单引号

<select id="getUserByUsername" parameterType="java.lang.String" resultType="User">
    select * from t_user where username = '${username}'
  </select>

此时发现跟jdbc.properties里的重复,会取到这个文件里的参数,导致username='root',根据debug发现可以用arg0代替

<select id="getUserByUsername" parameterType="java.lang.String" resultType="User">
    select * from t_user where username = '${arg0}'
  </select>

运行成功.

总结:

单个参数的时候不管事#或者$,参数名称都可以用arg0代替

多个字面量类型的参数

若mapper接口中的方法参数为多个时

此时MyBatis会自动将这些参数放在一个map集合中,

(1)以arg0,arg1…为键,以参数为值;

(2)以param1,param2…为键,以参数为值;

因此只需要通过 ${} 和 #{} 访问map集合的键就可以获取相对应的值,

注意 ${} 需要手动加单引号

方法1:

UserMapper.java

User getUserByUsernameAndPassword(String username1,String password1);

UserMapper.xml

  <select id="getUserByUsernameAndPassword" resultType="User">
    select * from t_user where username = #{arg0} and password = #{arg1}
  </select>

测试用param1和param2也是可以,用${}加单引号也可以

方法二:

用注解@Param(""),注解中的参数则是sql的参数名

UserMapper.java

User getUserByUsernameAndPassword(@Param("username") String username,@Param("password") String password);

UserMapper.xml

<select id="getUserByUsernameAndPassword" resultType="User">
    select * from t_user where username = #{username} and password = #{password}
  </select>

map集合类型的参数

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过 ${} 和 #{} 访问map集合的键就可以获取相对应的值。

注意 ${} 需要手动加单引号

UserMapper.java

User getUserByUsernameAndPassword(Map<String,Object> map);

UserMapper.xml

  <select id="getUserByUsernameAndPassword" parameterType="map" resultType="User">
    select * from t_user where username = #{username} and password = #{password}
  </select>

测试程序

        @Test
        public void testGetUserByUsernameAndPassword(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            HashMap<String,Object> map = new HashMap<>();
            map.put("username","test1");
            map.put("password","0");
            //User user = userMapper.getUserByUsernameAndPassword("test1","0");
            User user = userMapper.getUserByUsernameAndPassword(map);
            System.out.println(user);
            sqlSession.close();
        }

注意:

map添加的顺序和键的名称必须一致。

实体类类型的参数

若mapper接口中的方法参数为实体类对象时

此时可以使用 ${} 和 #{} ,通过访问实体类对象中的属性名获取属性值,

注意 ${} 需要手动加单引号

UserMapper.java

User getUserByUsernameAndPassword(User user);

UserMapper.xml

  <select id="getUserByUsernameAndPassword" parameterType="User" resultType="User">
    select * from t_user where username = #{username} and password = #{password}
  </select>

测试程序

        @Test
        public void testGetUserByUsernameAndPassword(){
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            HashMap<String,Object> map = new HashMap<>();
            map.put("username","test1");
            map.put("password","0");
            User userPara = new User();
            userPara.setUsername("test1");
            userPara.setPassword("0");
            //User user = userMapper.getUserByUsernameAndPassword("test1","0");
            //User user = userMapper.getUserByUsernameAndPassword(map);
            User user = userMapper.getUserByUsernameAndPassword(userPara);
            System.out.println(user);
            sqlSession.close();
        }

测试成功

注意:

参数名和实体类的属性名必须一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值