1.简介
上面第 2 章学习,讲解的方式为 基础配置文件实现 CRUD 的方式,但是确是非官方推荐的做法,Mybatis 官方推荐的是:mapper 动态代理方式实现 CRUD(即 Myabtis 的接口开发);
- mapper 动态代理方式实现 CRUD 的实现原则:约定优于配置,配置优于硬编码;
- 约定的目标:省略掉原编码中的 statement(举例:String statement = "namespace."+"select.id"),即根据约定,直接可以定位出 mapper.xml 文件中指定的 SQL 语句;
2.实现步骤
- 第一步:导入 jar 包,创建表和实体类过程不再赘述;
- 第二步:基于 实体类创建对应的接口,需要遵循如下配置:
▶约定【1】:接口的名字必须与 mapper.xml 文件中的 namespace 的值一致,实现 接口 和 指定 xml 文件的映射关系;
public interface EmployeeMapper { }
- 第三步:在上面定义的接口中定义方法;定义的方法必须与 mapper.xml 文件中的 CRUD 标签一一进行映射,即需要满足如下约定:
▶约定【1】:方法名必须和 mapper.xml 文件中的 id 值一致;
▶约定【2】:方法的输入参数必须和 mapper.xml 文件中的 parameterType 类型一致;
▶约定【3】:方法的返回值类型必须和 mapper.xml 文件中的 resultType 类型一致;
如我们现有 mapper.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"> <!--namespace为映射mapper文件的全路径名,不要写.xml后缀--> <mapper namespace="com.entity.employeeMapper"> <select id="queryEmployeeById" resultType="com.entity.Employee" parameterType="int"> </select> </mapper>
此时在接口中定义的方法如下:
public interface EmployeeMapper { Employee queryEmployeeById(int empId); }
- 第四步:编写测试类,验证动态代理实现 CRUD
★【1】第一种通过动态代理实现根据职员编号查询到该职员;
public static void queryOneEmployee() throws Exception { //第一步:加载 Mybatis-config.xml 文件,并使用 字符串输入流 Reader 进行读取; Reader reader = Resources.getResourceAsReader( "mybatis-config.xml" ); //第二步:创建 SqlSession 的单例工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build( reader ); //第三步:创建访问数据库的Session--connection SqlSession session = sessionFactory.openSession(); //第四步:通过反射找到对应的接口 EmployeeMapper employeeMapper = session.getMapper( EmployeeMapper.class ); //第五步:执行接口中定义的方法 Employee employee = employeeMapper.queryEmployeeById( 1 ); System.out.println( "职工编号为1的员工的基本信息为::" + employee ); //第六步:关闭会话 session.close(); }
3.总结
基于动态代理实现 CRUD 的过程如下:
- 第一:接口名要和对应的映射 xml 文件命名一致,基于接口可以映射到该 xml 文件;
- 第二:接口中定义的方法要依据 mapper.xml 文件中的标签进行约定;