MaBatis--Mapper代理

目前使用SqlSession进行增删改查的缺点:

  1. 没有办法实现多参传值
  2. 书写的时候没有接口,后期的维护低

使用Mapper的动态代理方式来解决问题

具体实现

首先我们需要编写Dao层相关的数据库接口--AccountMapper

  1. public interface AccountMapper {
  2. /**
  3. * 查询account表中的所有数据
  4. * @return 返回结果集
  5. */
  6. List<Account> selectAll();
  7. /**
  8. *
  9. * @param account 需要插入的JavaBean对象
  10. * @return 影响行
  11. */
  12. int insert(Account account);
  13. }

接下来编写SQL映射文件--AccountMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace = "接口的全路径" -->
  6. <mapper namespace="com.lyl.dao.AccountMapper">
  7. <!-- id接口的方法名 -->
  8. <select id="selectAll" resultType="account">
  9. select * from account
  10. </select>
  11. <insert id="insert">
  12. insert into Account values(DEFAULT ,#{username},#{balance})
  13. </insert>
  14. </mapper>

再编写测试类--Test4

  1. public class Test4 {
  2. public static void main(String[] args) throws Exception {
  3. // 1.解析mybatis.xml文件配置
  4. String resource = "mybatis.xml";
  5. InputStream inputStream = Resources.getResourceAsStream(resource);
  6. // 2.得到SqlSessionFactory工厂
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  8. // 3.得到一个SqlSession
  9. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  10. // 4.SQL操作
  11. AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class); // 通过动态代理得到接口对象
  12. List<Account> list = accountMapper.selectAll();
  13. Account account = new Account();
  14. account.setUsername("lyl");
  15. account.setBalance(9999);
  16. int a = accountMapper.insert(account);
  17. System.out.println(list);
  18. System.out.println(a);
  19. // 5.关闭资源
  20. sqlSession.close();
  21. }
  22. }

控制台结果:

  1. [Account{id=1, username='张三', balance=1000.0}, Account{id=3, username='王五', balance=2000.0}, Account{id=4, username='赵六', balance=4000.0}, Account{id=5, username='丈八', balance=3000.0}]
  2. 1

主要看AccountMapper.xml,和Test4,那么通过上面的代码和注释可以看到我们不再通过SqlSession对象直接操作数据库,而是通过accountMapper接口对象来调用接口的方法操作数据库,这样我们就可以通过编写接口的方法来自定义传参类型以及个数,更加灵活规范的书写我们的SQL操作。那接口和SQL映射文件是怎么绑定在一起的呢?

两者绑定在一起并起作用都是依靠动态代理(动态代理我现在也没学所以不做解释),我们能看到最直观的线索就是AccountMapper.xml<mapper>标签中的namespace属性的值刚好就是我们AccountMapper接口在项目中的路径,这并不是巧合,就是依靠namespace来桥接接口和SQL映射文件。

既然可以传多参,那么参数的类型也是可以自定义,常见的对象,List,Map...都是可以传入,但是在SQL映射文件中取出实参却每个都不太一样。

取出对象:直接写对象的属性即可,MyBatis会自动帮我们取出

取出多个参数:用#{param1},#{param2}...即可一次对照形参的顺序即可,也可以用MaBatis的注解起别名@Param("xx")即可。

其他的类型可以自行百度。

MyBatis的Mapper代理笔记的更多相关文章

  1. Mybatis非mapper代理配置

    转: Mybatis非mapper代理配置 2017年04月26日 20:13:48 待长的小蘑菇 阅读数:870   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  2. Mybatis的mapper代理开发方法

    一.开发规范 1.映射文件中的namespase等于mapper接口类路径 2.statement的id与mapper中的方法名一致 3.让mapper的接口方法输入参数类型与statement中的p ...

  3. Spring+SpringMVC+Mybatis大整合(SpringMVC采用REST风格、mybatis采用Mapper代理)

    整体目录结构: 其中包下全部是采用mybatis自动生成工具生成. mybatis自动生成文件 <?xml version="1.0" encoding="UTF- ...

  4. mybatis——使用mapper代理开发方式

    ---------------------------------------------------------------generatorConfig.xml------------------ ...

  5. mybatis入门-mapper代理原理

    原始dao层开发 在我们用mybatis开发了第一个小程序后,相信大家对于dao层的开发其实已经有了一个大概的思路了.其他的配置不用变,将原来的test方法,该为dao的方法,将原来的返回值,直接在d ...

  6. Mybatis的mapper代理开发dao方法

    看完了之前的mybatis原始的dao开发方法是不是觉得有点笨重,甚至说没有发挥mybatis 作为一个框架的优势.总结了一下,原始的dao方法有以下几点不足之处 dao接口实现方法中存在大量的模板方 ...

  7. springboot集成下,mybatis的mapper代理对象究竟是如何生成的

    前言 开心一刻 中韩两学生辩论. 中:端午节是属于谁的? 韩:韩国人! 中:汉字是谁发明的? 韩:韩国人! 中:中医是属于谁的? 韩:韩国人! 中:那中国人到底发明过什么? 韩:韩国人! 前情回顾 M ...

  8. mybatis入门--mapper代理方式开发

    不使用代理开发 之前,我们说了如何搭建mybatis框架以及我们使用mybatis进行简单的增删改查.现在,我们一起来构建一个dao层的完整代码.并用@test来模拟service层对dao层进行一下 ...

  9. mybatis的mapper代理,SqlMapConfig.xml中配置,输入和输出映射使用案例

    public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private ...

随机推荐

  1. 终于彻底搞清楚了spin-lock 之一次CPU问题定位过程总结

    首先这个问题,我只是其中参与者之一.但这个问题很有参考意义,特记录下来. 还有我第一次用"彻底"这个词,不知道会不会有人喷?其实,还有一些问题,也不是特别清楚.比如说什么是CPU流 ...

  2. LeetCode通关:数组十七连,真是不简单

    分门别类刷算法,坚持,进步! 刷题路线参考:https://github.com/chefyuan/algorithm-base       https://github.com/youngyangy ...

  3. Java流程控制02——顺序结构

  4. 【剑指offer】59 - I. 滑动窗口的最大值

    剑指 Offer 59 - I. 滑动窗口的最大值 知识点:队列:滑动窗口:单调 题目描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例 输入: nums = [ ...

  5. Fluid + GooseFS 助力云原生数据编排与加速快速落地

    前言 Fluid 作为基于 Kubernetes 开发的面向云原生存算分离场景下的数据调度和编排加速框架,已于近期完成了 v0.6.0 版本的正式发布.腾讯云容器 TKE 团队一直致力于参与 Flui ...

  6. Vue系列-01-基础语法

    vue.js文件 # https://blog-static.cnblogs.com/files/lichengguo/vue.js # 下载该文件,保存的路径为代码同级目录 js/vue.js 文件 ...

  7. HTTP缓存——协商缓存(缓存验证)

    协商缓存 所谓"协商",可以理解为:客户端和服务端双方商量着来. 客户端检查资源超过有效期.强缓存命中失败的情况下,则发出请求"询问"服务器是否资源真的过期了, ...

  8. CVE-2021-21972 vSphere Client RCE复现,附POC & EXP

    漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi.vCenter Server 等一系列的软件.其中 vCenter Server 为 ESXi 的控制中心,可从单一控 ...

  9. 关于下载远程文件为未知文件.txt的解决方法

    本地下载文件后缀正常,服务器下载文件后缀都为.txt的解决方法: 后缀为 未知文件.txt 的原因为前端无权限获取Content-Disposition中的文件名 response.setHeader ...

  10. Python 可变数据类型与不可变数据类型

    浅拷贝和深拷贝 Python数据都是存放到内存中的,Python的数据又分为可变和不可以变 可变数据(修改了值后,不会改变内存地址,修改的值还是指向相同的内存地址) 字典 # 列表是可变 x = [1 ...