Mapper代理开发
- 目的
- 使用Mapper代理方式入门
- 1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
- 首先新建一个Mapper接口
- 编译mybatis-demo
- 更改sql映射文件路径
- 2.设置SQL映射文件的namespace属性为Mapper接口全限定名
- 3.在Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
- 4.编码
- 细节
以下代码建立在上篇博客Mybatis快速搭建的基础上,没有搭建或者忘记如何搭建的可以去跟着搭建一下子Mybatis快速搭建
目的
- 解决原生方式中的硬编码
原先编码执行sql语句要在main方法中写死查询语句的id,且每个语句的id都是不一样的,这样再去main方法中写的时候就会写很多个id,麻烦且复杂,用Mapper代理开发就可以解决这个问题 - 简化后期执行sql
区别就是之后不用再修改代码,修改配置文件即可
使用Mapper代理方式入门
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
首先新建一个Mapper接口
新建一个UserMapper接口,再在resources文件夹下新建一个com.svt.mapper,但是不能直接写com.svt.mapper,资源文件夹会认为com.svt.mapper就是你这个文件夹的名字,要在新建Directory的时候写com/svt/mapper
,这样就能分成三级了
编译mybatis-demo
这里直接执行会出错,可以使用一个maven helper插件,使用里面的run maven进行编译
插件可以在idea内下载
File->Settings->Plugins->进行搜索maven helper
下载之后重启idea即可使用,我们编译一下子
出来的结果有编译成功的文件夹名,这时候我们就可以去对应目录下看是否已经成功放在同一目录下
像这样就已经成功完成第一步啦
更改sql映射文件路径
还有个小细节,此时资源路径已经更改,所有在mybatis-config.xml文件里我们需要修改一下加载sql映射文件的路径,右击UserMapper.xml文件选择Copy Relative Path
,直接粘贴到路径内
<!--加载sql映射文件-->
<mapper resource="com/svt/mapper/UserMapper.xml"/>
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
前一个博客内写的命名空间是test,比较随意,这里就需要将test改为自己定义的mapper接口路径
<mapper namespace="com.svt.mapper.UserMapper">
3.在Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
在UserMapper接口中写一个和id名一样的方法
User selectAll();
但此时有个小细节,之前写的查询语句查询的是整张表的数据,查询的是一个集合,这时候我们就需要用一个集合来接收数据,所有方法的类型是List集合,里面放的是一个一个user对象
public interface UserMapper {
List<User> selectAll();
}
4.编码
通过 SqlSession的 getMapper方法获取 Mapper接口的代理对象
调用对应方法完成sql的执行
- 代码实现
/**
* 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 sqlSession = sqlSessionFactory.openSession();
//3.执行sql
//3.1获取UserMapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
System.out.println(users);
//4.释放资源
sqlSession.close();
}
}
- 执行结果
细节
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<!--Mapper代理方式-->
<package name="com.svt.mapper"/>
以后像这样的xml文件还会有很多,我们就可以使用扫描的方式进行加载,扫描一下对应的包就可以直接夹在里面所有的xml文件,不用再一个一个加载了
至此Mapper代理开发就阐述完毕,一起实现一下子吧!