MyBatis日常笔记记录04--三种传递参数方法
1.在dao包下创建StudentDao接口,接口里面的方法
public interface StudentDao { /*方式一: * 一个简单类型的参数 * 简单类型:mybatis把java的基本数据类型和String都叫简单数据类型 * 在mapper文件获取简单数据类型的一个参数的值,使用#{任意字符} * */ public Student selectStudentById(Integer id); /*方式二: * 多个参数 : 命名参数,在形参定义的前面加入@Param("自定义参数名称") * */ List<Student> selectMultiParam(@Param("myname") String name, @Param("myage") Integer age); /*方式三: * 多个参数 : 使用java对象作为接口中方法的参数 * */ List<Student> selectMultiObject(QueryParam param); List<Student> selectMultiStudent(Student student);
其中,方式二中的参数需要自己新建java类来定义
public class QueryParam { private String paramName; private Integer paramAge; public String getParamName() { return paramName; } public void setParamName(String paramName) { this.paramName = paramName; } public Integer getParamAge() { return paramAge; } public void setParamAge(Integer paramAge) { this.paramAge = paramAge; }
2.编写mapper映射文件内容
<?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.example.dao.StudentDao"> <!-- parameterType : dao接口中方法参数的数据类型。 parameterType它的值是java的数据类型全限定名称或者mybatis定义的别名 例如: parameterType="java.lang.Integer" parameterType="int" 注意:parameterType不是强制的,mybatis通过反射机制能够发现接口参数的数据类型 所以可以没有。一般也不写 使用#{}之后,mybatis执行sql是使用的jdbc中的PrepareStatement对象 由mybatis执行下面的代码: 1.mybatis创建 Connection , PrepareStatement对象 String sql = "select id,name,email,age from student where id=?"; PrepareStatement pst = conn.prepareStatement(sql); pst.setInt(1,1001); 2.执行sql封装为resultType="com.example.domain.Student"这个对象 ResultSet rs = pst.executeQuery(); Student student = null; while(rs!=null){ //从数据库取表的一行数据,存到一个Java对象中 student = new Student(); student.setId(rs.getInt(id)); student.setName(rs.getName(name)); student.setEmail(rs.getEmail(email)); student.setAge(rs.getAge(age)); } return student; --> <select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.example.domain.Student"> select id,name,email,age from student where id=#{id} </select> <!--多个参数使用@Param命名--> <select id="selectMultiParam" resultType="com.example.domain.Student"> select id,name,email,age from student where name=#{myname} or age=#{myage} </select> <!--多个参数,使用java对象的属性值,作为参数实际值 使用对象的语法 : #{属性名,javaType=类型名称,jdbcType=数据类型} 很少有 javaType:指java中的属性数据类型 jdbcType:指在数据库中的数据类型 例如:#{paramName,javaType=java.lang.String,jbcType=VARCHAR} <select id="selectMultiObject" resultType="com.example.domain.Student"> select id,name,email,age from student where name=##{paramName,javaType=java.lang.String,jbcType=VARCHAR} or age=#{paramAge,javaType=java.lang.Integer,jbcType=INTEGER} </select> 我们使用的简化方式:#{属性名} ,javaType ,jdbcType的值mybatis反射能获取,不用提供 --> <select id="selectMultiObject" resultType="com.example.domain.Student"> select id,name,email,age from student where name=#{paramName} or age=#{paramAge} </select> <select id="selectMultiStudent" resultType="com.example.domain.Student"> select id,name,email,age from student where name=#{name} or age=#{age} </select> </mapper>
3.编写测试类
public class TestMyBatis { @Test public void testSelectStudents() { /* * 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口) * getMapper能获取dao接口对应的实现类对象 * * */ SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); Student student = dao.selectStudentById(1002); System.out.println(student); } @Test public void testSelectMultiParam() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); List<Student> students = dao.selectMultiParam("李四", 20); for (Student stu : students) { System.out.println("学生:" + stu); } sqlSession.close(); } @Test public void testSelectMultiObject() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); QueryParam param = new QueryParam(); param.setParamName("张三"); param.setParamAge(21); List<Student> students = dao.selectMultiObject(param); for (Student stu : students) { System.out.println("学生:" + stu); } sqlSession.close(); } @Test public void testSelectMultiStudent() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); Student student = new Student(); student.setName("张三"); student.setAge(21); List<Student> students = dao.selectMultiStudent(student); for (Student stu : students) { System.out.println("学生:" + stu); } sqlSession.close(); }