前言:了解代理开发之前必须要了解原始开发。因为只有形成对比之后,才可以举一反三发现其中的优劣。博主有一篇博客关于mybatis原始dao开发方式的详解。希望可以帮助到大家https://blog.csdn.net/My_name_is_ZwZ/article/details/82926601
什么是mapper代理开发?
一种开发dao层的方式。
为什么要使用mapper代理方法开发dao?
为了弥补原始方法开发dao的弊端。例如:
- dao接口实现类方法中存在大量重复代码 ;
- 调用sqlSession方法时,将satement的id硬编码了 ;
- sqlSession的方法中,要求传入的参数是Object类型的,如果传错了参数,编译不会报错,执行的时候才会报错,降低开发效率,不利于开发。
使用mapper代理开发dao的步骤:
大部分与原始dao开发的步骤相同。在开头那篇博客里有详细介绍每一个步骤,所以这里就写一个大致的步骤,不再仔细展开。
1.使用IDEA创建一个maven工程(大家完全可以通过手动导入jar包的方式使用mybatis)
2.在src目录下创建一个名为SqlMapConfig.xml的xml文件
3.配置SqlMapConfig.xml文件中的内容
4.创建表所对应的类的映射文件
【注意】UserMapper.xml文件中namespace的内容不能乱写。必须写成我们将要定义的mapper接口的地址;其它与原始dao开发方法相同
<?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接口的地址-->
<mapper namespace="dao.jiekou.Usermapper">
<select id="findById" parameterType="int" resultType="com.demo.User">
SELECT * FROM User WHERE userid=#{id}
</select>
</mapper>
5.创建接口
【注意1】mapper.java接口中的方法名和mapper.xml中statement的id一致; 如下:
public interface Usermapper {
/**
这里的findById与mapper.xml文件中根据id查询对象的<select>标签中的id属性的内容保持一致
*/
User findById(int id);
}
【注意2】mapper.java接口中的方法接收参数的类型与parameterType中的类型保持一致;如上
【注意3】mapper.java接口中的方法返回的参数的类型与resultType中指明的类型保持一致;如上
6.在总的配置文件中映射上表所对应的类的映射文件
7.测试运行
public class TestDaiLi {
public static void main(String[] args) throws IOException {
//mybatis的总配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*通过工厂得到SqlSession*/
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到dao类的代理对象 相当于原始dao中接口的实现类
Usermapper usermapper = sqlSession.getMapper(Usermapper.class);
User user = usermapper.findById(1);
System.out.println(user.getUserName());
}
}
总结:
在使用mapper代理开发dao的过程中,与原始dao开发方法相比,唯一省去的步骤就是:创建接口的实现类。这样子就大大提高了代码的可读性。便于开发
sqlSession可以自动创建一个mapper接口的代理对象。我们只需要把刚刚写好的mapper接口的字节码对象传给getMapper方法,即可得到一个该接口对应的代理对象,然后就可以使用这个代理对象来操作接口中具体的方法。
由于mapper接口中方法的参数要根据映射文件中的parameterType来指定,而parameterType只有一个,所以mapper接口中所有方法的参数都只有一个! 但是可以使用包装类型的pojo满足不同的业务方法的需求。也就是说使用包装类型把所需要的多个参数都包装到一个类中去