在前面例子中自定义 Dao 接口实现类时发现一个问题:Dao 的实现类其实并没有干什么 实质性的工作,

它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id 的 SQL 语句,

真正对 DB 进行操作的工作其实是由框架通过 mapper 中的 SQL 完成的。

所以,MyBatis 框架就抛开了 Dao 的实现类,直接定位到映射文件 mapper 中的相应 SQL语句,对 DB 进行操作。

这种对 Dao 的实现方式称为 Mapper 的动态代理方式。

Mapper 动态代理方式无需程序员实现 Dao 接口。接口是由 MyBatis 结合映射文件自动 生成的动态代理实现的。

  1.映射文件的 namespace 属性值

    一般情况下,一个Dao接口的实现类方法使用的是同一个SQL映射文件中的SQL映射id

    所以,MyBatis框架要求,将映射文件中<mapper/>标签的namespace 属性设为 Dao接口的全类名,

    则系统会根据方法所属Dao接口,自动到相应 namespace 的映射文件中查找相关的SQL映射

 <!-- 使用 mapper 进行动态代理的前提之一:需要将 mapper 的命名空间 定义为 接口的完整类名 -->
<!-- 系统会根据方法所属DAO接口,自动到响应的 namespace 的映射文件中,查找相关的SQL映射 --> <mapper namespace="com.mybatis.dao.StudentDAO" >

  2.修改日志输出控制文件

  3.Dao接口方法名

MyBatis 框架要求,接口中的方法名,与映射文件中相应的SQL 标签的id值相同。

系统会自动根据方法名到相应的映射文件中查找同名的SQL映射d

 @Test
public void testAdd() {
//使用 动态 mapper 的前提之二:DAO中的方法,需要跟 mapper.xml 文件的 的 statement的 id 相对应
studentDAO.insertStudent(s);
sqlSession.commit();
}

  4.Dao对象的获取

  使用时,只需调用SqlSession的getMapper方法,即可获取指定接口的实现类对象

  该方法的参数为指定Dao接口类的class值

 

  5.删除Dao实现类

  由于通过调用 Dao 接口的方法,不仅可以从 SQL 映射文件中找到所要执行 SQL 语句,还可通过方法参数及返回值,

  将 SQL 语句的动态参数传入,将查询结果返回。所以,Dao 的 实现工作,完全可以由 MyBatis 系统自动根据映射文件完成。

所以,Dao 的实现类就不再需 要了。Dao 实现对象是由 JDK 的 Proxy 动态代理自动生成的

  6.修改测试类

 Student s = null;
private SqlSession sqlSession;
private StudentDAO studentDAO;
@Before
public void before() {
s= new Student();
s.setAge(25);
s.setName("xzk5");
s.setScore(99); sqlSession = SqlSessionUtil.getSqlSession();
studentDAO = sqlSession.getMapper(StudentDAO.class);
} @After
public void after() {
if(sqlSession != null) {
sqlSession.close();
}
} //动态代理的过程
//1.首先通过 sqlSession.getMapper方法 ,创建代理对象,对studentDAO 进行代理
//2.通过接口名定位到映射文件 mapper
//3.通过接口的 方法名 定位到 映射文件 mapper中 对应的 SQL语句
//Mapper 动态代理方式 无需程序员 实现 DAO 接口
//接口是由MyBatis 结合 映射文件自动生成的动态代理实现的 ,(这个代理对象就是dao的实现) @Test
public void testAdd() {
//使用 动态 mapper 的前提之二:DAO中的方法,需要跟 mapper.xml 文件的 的 statement的 id 相对应
studentDAO.insertStudent(s);
sqlSession.commit();
}

多查询条件无法接收的问题

  在实际工作中,表单中所给出的查询条件有时是无法将其封装为一个对象的,也就是说,查询方法只能携带多个参数,

  而不能携带将这多个参数进行封装的一个对象。对于这个问题, 有两种解决方案

(1)将多个参数封装为一个Map

 @Test
public void testSelectStudentsByMap() {
Map<String,Object> map = new HashMap<String,Object>();
map.put("conName", "xx");
map.put("conScore", "59");
map.put("conStu", s); //s 是一个 student对象
List<Student> students = studentDAO.selectStudentsByMap(map);
for(Student student:students) {
System.out.println(student);
} }
 <select id="selectStudentsByMap" resultType="com.mybatis.model.Student">
select * from student where name like '%' #{conName} '%' and score > #{conScore} and age > #{conStu.age}
<!-- #{} 可以 1.放入 Map的key 2. 对象的属性-->
</select>

(2)多个参数逐个接收

对于mapper中的SQL语句,而已通过参数索引 #{index}的方式逐个接收每个参数

 <select id="selectStudentsByMap" resultType="com.mybatis.model.Student">
<!-- select * from student where name like '%' #{conName} '%' and score > #{conScore} and age > #{conStu.age} -->
<!-- #{} 可以放入 1. Map的key 2. Map的value的对象的属性--> select * from student where name like '%' #{0} '%' and age > #{1}
<!-- #{} 可以放入 3.参数的索引-->
<!-- 另外:4.可以放入任意字符,构成占位符 5.放入对象的属性 --></select>
 @Test
public void testSelectStudentsByConditions() {
List<Student> students = studentDAO.selectStudentsByConditions("xx",24);
for(Student student:students) {
System.out.println(student);
} }

 

  

8.Mapper动态代理的更多相关文章

  1. Mybatis之旅第二篇-Mapper动态代理方式

    一.引言 通过上一篇mybatis的入门学习,我们已经会使用mybatis实现简单的增删改查,但是我们也发现了用原始Dao开发的一些问题: Dao方法体存在重复代码:通过SqlSessionFacto ...

  2. Mybaits之Mapper动态代理开发

    Mybaits之Mapper动态代理开发 开发规范: Mapper接口开发方法只需要程序员与Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法 ...

  3. Mybatis框架三:DAO层开发、Mapper动态代理开发

    这里是最基本的搭建:http://www.cnblogs.com/xuyiqing/p/8600888.html 接下来做到了简单的增删改查:http://www.cnblogs.com/xuyiqi ...

  4. 【Mybatis】-- Mapper动态代理开发注意事项

    1.1. Mapper动态代理方式 1.1.1. 开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对 ...

  5. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  6. mybatis由浅入深day01_5.3 Mapper动态代理方法

    5.3 Mapper动态代理方法(程序员只需要写mapper接口(相当于dao接口)) 5.3.1 实现原理(mapper代理开发规范) 程序员还需要编写mapper.xml映射文件 程序员编写map ...

  7. Spring 整合Mybatis Mapper动态代理方法

    先看项目目录结构 很清爽了 最重要的Spring的核心配置文件,看一下 <?xml version="1.0" encoding="UTF-8"?> ...

  8. Mybatis之Mapper动态代理

    一.什么是Mapper的动态代理 采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接 ...

  9. MyBatis使用Mapper动态代理开发Dao层

    开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同原始Dao接口实现类方法. Mappe ...

  10. MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...

随机推荐

  1. ES6深入浅出-1 新版变量声明:let 和 const-1.视频 概述

    es7语法比较少,只占了一点点 ES 6 新特性一览:https://frankfang.github.io/es-6-tutorials/ 我用了两个月的时间才理解 let   https://zh ...

  2. Qt编写数据可视化大屏界面电子看板5-恢复布局

    一.前言 恢复布局这个功能在整个数据可视化大屏界面电子看板系统中非常有用,很多时候不小心把现有布局拖动乱了,(当然如果不想布局被拖动改动,可以修改配置文件中的MoveEnable参数来控制,默认为真表 ...

  3. Spring事务管理4-----声明式事务管理(2)

    声明式事务管理  基于AspectJ的 XML 方式配置 通过对事务管理器TransactionManager配置通知(增强),然后再配置切点和切面,详细见applicationContext.xml ...

  4. php自定义错误处理函数

    function myErrorHandler($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:< ...

  5. 在MFC中添加OpenGL窗口

    虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了...   一.首先介绍Windows图像程序设计中几个重要的概念:   G ...

  6. ADRMS与office的整合(一)

    因为微软之前针对客户的RMS加密服务是一种免费的测试服务,虽然用户很多但实质上还是一种“测试服务”. 后来微软把这个服务商业化了,需要继续使用的话需要打下这个补丁 https://support.mi ...

  7. Spring-Boot的第三方类库的依赖版本调整方法

    springboot方式构建的工程,是dependencyManagement方式进行依赖包的版本管理, spring中有默认的版本,可以修改ext参数来调整版本 如下SpringBoot-2.2.x ...

  8. Vmare虚拟机安装麻烦二三事

    1).如何把虚拟机完整的迁移到另一个磁盘空间 2).VMware启动时提示我已移动或我已复制该虚拟机 3).虚拟机上显示主ip地址网络信息不可用怎么解决 4).vmware15虚拟机安装mac os ...

  9. 【FFMPEG】Windows下使用Visual Studio 2010编译ffmpeg全过程

    原文  http://www.cnblogs.com/xylc/p/3683203.html 主题 FFmpegWindowsVisual Studio ffmpeg是一个开源的多媒体库,使用非常广泛 ...

  10. jupyter notebook 常用快捷操作

    Shift-Enter 执行当前cell,并自动跳到下一个cell Ctrl-Enter 执行当前cell,执行后不自动调转到下一个cell DD 删除当前的cell L 为当前的cell加入line ...