一、Dao 代理实现 CURD
1.案例
1)去掉 Dao 接口实现类
2)getMapper 获取代理对象
只需调用 SqlSession 的 getMapper()方法,即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值。
SqlSession session = factory.openSession(); StudentDao dao = session.getMapper(StudentDao.class); 复制代码
使用工具类:
StudentDao studentDao = MyBatisUtil.getSqlSession().getMapper(StudentDao.class); 复制代码
3)使用 Dao 代理对象方法执行 sql 语句
select 方法:
@Test public void testSelect() throws IOException { final List<Student> studentList = studentDao.selectStudents(); studentList.forEach( stu -> System.out.println(stu)); } 复制代码
insert 方法:
@Test public void testInsert() throws IOException { Student student = new Student(); student.setId(1006); student.setName("林浩"); student.setEmail("linhao@163.com"); student.setAge(26); int nums = studentDao.insertStudent(student); System.out.println("使用 Dao 添加数据:"+nums); } 复制代码
update 方法
@Test public void testUpdate() throws IOException { Student student = new Student(); student.setId(1006); student.setAge(28); int nums = studentDao.updateStudent(student); System.out.println("使用 Dao 修改数据:"+nums); } 复制代码
delete 方法
@Test public void testDelete() throws IOException { int nums = studentDao.deleteStudent(1006); System.out.println("使用 Dao 修改数据:"+nums); } 复制代码
2、原理
动态代理
MapperProxy 类定义:
invoke()方法:
重点方法:
二、深入了解参数
1、parameterType
parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。
int 或 java.lang.Integer
hashmap 或 java.util.HashMap
list 或 java.util.ArrayList
student 或 com.bjpowernode.domain.Student
select,insert,update,delete 都可以使用 parameterType 指定类型。
例如:
<delete id="deleteStudent" parameterType="int"> delete from student where id=#{studentId} </delete> 复制代码
等同于
<delete id="deleteStudent" parameterType="java.lang.Integer"> delete from student where id=#{studentId} </delete> 复制代码
2、Mybatis 传递参数
从 java 代码中把参数传递到 mapper.xml 文件。
3、一个简单参数
Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方法的参数名无关。
接口方法:
Student selectById(int id); 复制代码
mapper 文件:
<select id="selectById" resultType="com.bjpowernode.domain.Student"> select id,name,email,age from student where id=#{studentId} </select> 复制代码
#{studentId} , studentId 是自定义的变量名称