mybatis中引入接口实现DAO
前面的时候我们都使用nameSpace.id的形式去进行数据库的访问
现在这种方式存在的一些问题在哪里呢?
- 如果是SQL语句或者id值有问题我们的错误信息 只能通过运行的时候才能暴露出来
- 在编写这样的调用过程的时候我们的API和配置文件的耦合性比较高必须是通过namepace.id的形式去进行调用
引入了接口之后,那么错误信息前扬以及耦合性的问题就得到了解决
这个就是为什么我们要引入接口
1、编写mapper
/**
* @Auther: lkx
* @Date: 2021/3/10 14:07
* @Description:这个是咋们的用户的DAO的接口
*
* 这个接口中要申明很多的方法,这个方法的申明是有一定的约束规范的
*
* 1:返回值类型必须和mapper.xml中对应的方法保持一致
* 2:方法的名字必须和mapper.xml中的id保持一致
* 3:请求参数 必须和mapper.xml中保持一致
* 4:nameSpace的值必须和接口的全路径保持一致
*/
public interface UserMapper {
/**
* add方法
*/
void add();
}
2、编写mapper.xml
<mapper namespace="com.qf.ibatis.mapper.UserMapper">
<!--这里就是使用标签来进行方法的描述-->
<insert id="add">
insert into t_user(userName,password) values("lkx","123");
</insert>
</mapper>
3、编写测试
/**
* 引入接口之后的测试
*/
@Test
public void testAdd() throws IOException {
SqlSession sqlSession = JdbcUtils.getSqlSession();
//首先获取接口的实现类的对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.add();
JdbcUtils.close();
}
疑问:
1:接口的实现类是啥呢?
使用JDK生成的代理类,但是不需要被代理类,只需要在相应的方法上找到对应的SQL语句和参数就OK了 ,然后调用原始的硬编码形式代码去完成请求
2: getMapper的时候为啥就能够找到这个类对象呢?
因为在这个类中维护了一个 MapperProxyFactory的对象,在MapperProxyFactory的对象中维护了接口的class对象,生成MapperProxy的时候同时使用JDK代理生成了代理类,通过代理类找到接口的全路径.id去Configuration中找到MapperedSatement对象,然后找到SQL语句和需要的参数,最终调用硬编码形式的API去执行SQL语句
3:nameSpace为啥要换成 接口的全路径呢?
方便生成接口的代理类对象
上述疑问和答案姐来自源码,有兴趣的小伙伴可以去看看。
4、mybatis为什么要引入接口引入接口的好处在哪里
可以让错误信息前扬,实现代码和配置文件之间的解耦