MyBatis的dao层实现 - 接口代理方式实现
代理开发方式介绍:
采用MyBatis的代理开发方式实现DAO层的开发, 这种方式是我们后面进入企业的主流, Mapper接口开发方法只需要程序员编写Mapper接口(相当于传统方式的dao接口), 由MyBatis框架根据接口的定义来创建接口的动态代理对象, 代理对象的方法体其实是和我们传统方式的Dao接口实现类中的方法体是一样的 , 只不过就是使用Mapper接口代理方式的时候实现类对象是由MyBatis框架帮我们封装好的, 不需要我们手动封装
-
我们既然只需要编写一个接口,MyBatis就会根据接口的定义创建接口的动态代理对象, 这个时候注意: 我们肯定是不能随便创建一个接口我们的MyBatis框架都能识别并创建对应的动态代理对象的, 我们的Mapper接口的创建是有一定的定义规范的:
-
Mapper接口开发需要遵循以下的规范:
- 只有遵循对应的规范的时候我们的接口才能被MyBatis框架是被并可以成功封装为对应的接口动态代理对象
- Mapper.xml文件中的nameSpace与mapper接口的全限定名相同
- 全限定名其实就是接口的全类名
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- 这里说的statement就是我们之前说的映射文件中的一个操作, 也就是一个Sql语句
- Mapper接口中方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
- 这里的每个Sql语句就是一个statement
- Mapper接口方法的输出参数类型(也就是返回值), 要和mapper.xml中定义的每个sql语句resultType类型相同
- 同样的, 这里的每个sql语句就是一个statement
-
Mapper接口开发需要遵守的规范图解:
以前的时候我们都是定义一个Dao接口, 然后创建Dao接口的实现类, 然后在逻辑处理层(service)中处理的时候我们要创建Dao接口实现类的对象, 然后使用该对象调用对应的方法, 然后就能执行对应的操作, 但是此时我们使用接口代理开发方式之后, 我们只需要按照对应的规范创建一个Mapper接口, 我们并不需要去创建Mapper接口的实现类, 我们只需要通过SqlSession类的对象调用getMapper(Class mapper)方法, 我们就能得到一个对应Mapper接口的动态代理对象了, 得到了对应的动态代理对象之后我们就直接可以使用该对象调用其中的方法 ( 这个动态代理对象其实就和我们之前使用传统方式的时候创建的Dao接口的实现类的对象是一样的 )
- 以前的时候我们需要手动的创建Dao接口的实现类,在重写方法中要手动的使用sqlSession对象来执行对应的映射文件中的statement, 但是此时我们使用了接口代理开放方式之后, 我们获得了SqlSession对象之后只用使用SqlSession对象来调用getMapper()方法即可, 传入一个Mapper接口的运行时类对象, 然后就会自动生成对应的实现类的对象, 这个时候其中的方法MyBatis会替我们重写好, 我们只管调用即可 —> MyBatis会自动动态代理方式生成Mapper接口实现类对象, 然后其中会自动执行映射文件中statement中id和方法名相同的操作
接口代理方式代码实现:
映射文件中:
<!-- 这里的namespace的值对应了接口全类名 -->
<mapper namespace="com.ffyc.mapper.UserMapper">
<!-- 这里的id对应了接口中的抽象方法名
这里的resultType对应了接口中返回值类型的全类名
这里没有parameter, parameter属性对应了方法的形参变量类型的全类名-->
<select id="findAll" resultType="user">
select * from user
</select>
</mapper>
Mapper接口:
public interface UserMapper{
public List<User> findAll() throws IOException;
}
测试接口代理方式编写的dao层代码:
public class ServiceDemo{
public static void main(String [] args) throws IOException{
//以流的方式加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//使用SqlSessionFactory工厂对象构建调用build()方法构建SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBulder().build(resourceAsStream);
//使用SqlSessionFactory工厂对象调用openSession()方法得到一个SqlSession会话对象
SqlSession sqlSession = sqlSessioFactory.openSession();
//使用SqlSession会话对象调用getMapper()方法获得对应的接口的动态代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//使用接口动态代理对象调用对应方法
List<User> all = mapper.findAll();
//打印返回的结果(测试)
System.out.println(all);
}
}
我们其实可以发现: 使用接口代理方式编写Mapper接口其实就是使用Mapper接口和映射文件对应上即可
补充:
-
如果接口中方法的返回值类型和形参类型为Java中对应的核心类库中的类型的时候我们直接在映射文件中填入对应的类名即可, 或者基本类型的时候我们只需要填入对应的基本类型名即可
-
接口代理方式编写Mapper接口的方式就是我们只用编写Mapper接口, 实现类是由MyBatis框架为我们动态代理生成的