单个简单类型参数
简单类型包括:
- byte short int long float double char
- Byte Short Integer Long Float Double Character
- String
- java.util.Date
- java.sql.Date
1. /** 2. * 根据学生id进行查询 3. * @param id 4. * @return 5. */ 6. Student selectById(Long id);
对应的映射xml文件
1. <select id="selectById" resultType="com.study.pojo.Student"> 2. select * from t_student where id=#{id}; 3. </select>
简单类型对于mybatis来说都是可以自动类型识别的:
- 也就是说对于mybatis来说,它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。
如果参数只有一个的话,#{} 里面的内容就随便写了。对于 ${} 来说,注意加单引号。
Map参数
需求:根据name和age查询
1. /** 2. * 根据name和age查询 3. * @param paramMap 4. * @return 5. */ 6. List<Student> selectByParamMap(Map<String,Object> paramMap);
对应的映射xml文件
1. <select id="selectByParamMap" resultType="com.study.pojo.Student"> 2. select * from t_student where name=#{name} and age=#{age} 3. </select>
对应的java测试代码
1. @org.junit.Test 2. public void test02(){ 3. SqlSession sqlSession = SqlSessionUtil.openSession(); 4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); 5. Map map=new HashMap(); 6. map.put("name","张三"); 7. map.put("age","18"); 8. List<Student> student = mapper.selectByParamMap(map); 9. System.out.println(student); 10. }
这种方式是手动封装Map集合,将每个条件以key和value的形式存放到集合中。然后在使用的时候通过#{map集合的key}来取值。
实体类(pojo)参数
需求:插入一条Student数据
1. /** 2. * 插入学生数据 3. * @param student 4. * @return 5. */ 6. int insertStudent(Student student);
对应的映射xml文件
1. <insert id="insertStudent"> 2. insert into t_student values (null ,#{name},#{age},#{brith}) 3. </insert>
对应的java测试代码
1. @org.junit.Test 2. public void test03(){ 3. SqlSession sqlSession = SqlSessionUtil.openSession(); 4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); 5. Student student = new Student(); 6. student.setAge("28"); 7. student.setBrith(new Date()); 8. student.setName("李四"); 9. int i = mapper.insertStudent(student); 10. System.out.println(i); 11. System.out.println(student); 12. }
这里需要注意的是:#{} 里面写的是属性名字。这个属性名其本质上是:set/get方法名去掉set/get之后的名字,也就是使用了反射进行。
多参数
需求:通过name和sex查询
1. /** 2. * 根据name和age查询 3. * @param name 4. * @param age 5. * @return 6. */ 7. List<Student> selectByNameAndAge(String name, String age);
对应的映射xml文件(错误示范)
1. <select id="selectByNameAndAge" resultType="com.study.pojo.Student"> 2. select * from t_student where name=#{name} and age=#{age} 3. </select>
对应的java测试代码
1. @org.junit.Test 2. public void test04(){ 3. SqlSession sqlSession = SqlSessionUtil.openSession(); 4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); 5. List<Student> student = mapper.selectByNameAndAge("张三", "18"); 6. System.out.println(student); 7. }
运行报错
异常信息描述了:name参数找不到,可用的参数包括[arg1, arg0, param1, param2]
修改StudentMapper.xml配置文件:尝试使用[arg1, arg0, param1, param2]去参数
修改xml文件
1. <select id="selectByNameAndAge" resultType="com.study.pojo.Student"> 2. select * from t_student where name=#{param1} and age=#{param2} 3. </select>
再次运行得到结果
同时也可以将xml文件修改为:
1. <select id="selectByNameAndAge" resultType="com.study.pojo.Student"> 2. select * from t_student where name=#{arg0} and age=#{arg1} 3. </select>
通过测试可以看到:
- arg0 是第一个参数
- param1是第一个参数
- arg1 是第二个参数
- param2是第二个参数
实现原理:实际上在mybatis底层会创建一个map集合,以arg0/param1为key,以方法上的参数为value,例如以下代码:
1. Map<String,Object> map = new HashMap<>(); 2. map.put("arg0", name); 3. map.put("arg1", sex); 4. map.put("param1", name); 5. map.put("param2", sex); 6. 7. // 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2} 8. // 其本质就是#{map集合的key}
注意:使用mybatis3.4.2之前的版本时:要用#{0}和#{1}这种形式。
@Param注解(命名参数)
可以不用arg0 arg1 param1 param2吗?这个map集合的key我们自定义可以吗?当然可以。使用@Param注解即可。这样可以增强可读性。
需求:根据name和age查询
添加注解
1. /** 2. * 根据name和age查询 3. * @param name 4. * @param age 5. * @return 6. */ 7. List<Student> selectByNameAndAge(@Param("name") String name,@Param("age") String age);
对应的xml文件
1. <select id="selectByNameAndAge" resultType="com.study.pojo.Student"> 2. select * from t_student where name=#{name} and age=#{age} 3. </select>