Mapper代理开发
1 Mapper代理开发概述
之前我们写的代码是基本使用方式,它也存在硬编码的问题,如下:
这里调用 selectList()
方法传递的参数是映射配置文件中的 namespace.id值。这样写也不便于后期的维护。如果使用 Mapper 代理方式(如下图)则不存在硬编码问题。
通过上面的描述可以看出 Mapper 代理方式的目的:
- 解决原生方式中的硬编码
- 简化后期执行SQL
Mybatis 官网也是推荐使用 Mapper 代理的方式。下图是官网的截图
2 使用Mapper代理要求
使用Mapper代理方式,必须满足以下要求:
- 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:
- 设置SQL映射文件的namespace属性为Mapper接口全限定名
- 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
3 案例代码实现
-
在
com.itheima.mapper
包下创建 AbcMapper接口,代码如下:package com.mapper; import com.pojo.abc; import java.util.List; public interface AbcMapper { List<abc> selectAbc(); }
-
在
resources
下创建com/mapper
目录,并在该目录下创建 AbcMapper.xml 映射配置文件<!-- namespace:名称空间。必须是对应接口的全限定名 --> <mapper namespace="com.mapper.AbcMapper"> <select id="selectAbc" resultType="com.pojo.abc"> <!--select id 这条SQL语句的唯一标识--> select * from abc; </select> </mapper>
-
在
com
包下创建 MybatisDemo2 测试类,代码如下:package com; import com.mapper.AbcMapper; import com.pojo.abc; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.List; /*** * Mybatis 代理开发 */ public class MybatisDemo2 { public static void main(String[] args) throws IOException { //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象,用它来执行sql SqlSession a = sqlSessionFactory.openSession(); //3. 执行sql //List<abc> abcde = sqlSession.selectList("test.selectAbc"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id //3.1 获取UserMapper接口的代理对象 AbcMapper b = a.getMapper(AbcMapper.class); List<abc> c = b.selectAbc(); System.out.println(c); //4. 释放资源 a.close(); } }
注意:
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将核心配置文件的加载映射配置文件的配置修改为
<mappers>
<!--加载sql映射文件-->
<!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
<!--Mapper代理方式-->
<package name="com.itheima.mapper"/>
</mappers>