当接口参数比较多的时候,可以使用JavaBean来封装参数,当参数比较少的情况,可以使用Map类型或者使用@Param注解
1.userMapper接口类
package com.aruisi.mybatis.mapper; import com.aruisi.mybatis.dto.UserDTO; public interface UserMapper { public UserDTO selectUserByNameAndSex(String loginName,Integer sex); }2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.aruisi.mybatis.mapper.UserMapper"> <select id="selectUserByNameAndSex" resultType="com.aruisi.mybatis.dto.UserDTO"> SELECT id, login_name AS loginName, sex, age, create_time AS createTime FROM `user` WHERE login_name=#{loginName} and sex=#{sex} </select> </mapper>3.测试方法
package com.aruisi.mybatis.test; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.aruisi.mybatis.dto.UserDTO; import com.aruisi.mybatis.mapper.UserMapper; public class TestSelectUserByNameAndSex { public static void main(String[] args) { /** * java 7增强了try语句的功能,圆括号可以声明、初始化一个或多个资源(必须在程序结束时显示关闭的资源) * try语句在该语句结束时会自动关闭这些资源 */ try ( //读取配置文件信息 Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); //参数为true,设置事务是自动提交 SqlSession sqlSession = new SqlSessionFactoryBuilder().build(reader).openSession(true); ){ UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserDTO user = userMapper.selectUserByNameAndSex("王五", 1); System.out.println("============="+user.toString()); } catch (IOException e) { e.printStackTrace(); } } }测试结果会报如下错误:
Parameter 'loginName' not found. Available parameters are [1, 0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'loginName' not found. Available parameters are [1, 0, param1, param2]
报这个错误的原因是mybatis默认可用的xml参数只用 [1, 0, param1, param2], 这四个参数都是mybatis根据参数位置自定义的名字,这时将xml中的loginName改为#{0}或者#{param1},将sex改为#{1}或者#{param2},selectUserByNameAndSex这个接口方法就能正常被调用
但是这种写法代码可读性很差,不利于维护,这时可以使用@Param注解
将接口方法给为
public UserDTO selectUserByNameAndSex(@Param("loginName")String loginName,@Param("sex")Integer sex);
总结:
给参数加上@Param注解后,mybatis会自动将参数封装成map类型,@Param注解的值 @Param("loginName")作为map的key,在xml中就可以使用注解的值来使用参数。当时当只有一个参数时,我们并没有使用注解,code也能运行,这是因为在只有一个参数时,mybatis不关心这个参数叫什么名字就会直接把这个唯一的参数值拿来使用。