目录

简单使用

引出主题

看图

提到看源码,很多同学内心的恐惧的,其实这个从人性的角度来说是非常正常的,因为人们对未知的事物,都是非常恐惧的,其次,你内心可能始终觉得,好像不会原理也还是能工作啊,你的潜意识里没有强烈的欲望.从阅读源码的经历来说,Java三大框架SSM中,Mybatis的源码是最适合入门的.

简单使用

这是一个简单的Mybatis保存对象的例子

@Test
public void testSave() throws Exception {//创建sessionFactory对象SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));//获取session对象SqlSession session = sf.openSession();//创建实体对象User user = new User();user.setUsername("toby");user.setPassword("123");user.setAge(23);//保存数据到数据库中session.insert("com.toby.mybatis.domain.UserMapper.add", user);//提交事务,这个是必须要的,否则即使sql发了也保存不到数据库中session.commit();//关闭资源session.close();
}
<mapper namespace="com.toby.mybatis.domain.UserMapper"><!--#{}在传入的对象中找对应的属性值--><!--parameterType传入的参数是什么类型--><insert id="add" parameterType="com.toby.mybatis.domain.User">INSERT INTO USER (username,password,age) VALUES (#{username},#{password},#{age})</insert>
</mapper>

引出主题

但是在实际中,我们都不是这样操作的,我们是通过Mapper接口,调用接口方法,就能实现CRUD操作,那么关键是,这个接口究竟做了什么事,才是我们关心的.

只要把下面这段代码究竟发生了什么事弄明白,就明白,这个Mapper接口究竟做了什么事.

public void testGetObject() throws Exception {SqlSession session = MybatisUtil.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.get(5L);System.out.println(user);session.close();
}
public interface UserMapper {public void add(User user);public User get(Long id);
}

看图

但是我认为,一张流程图就能够看明白这期间所发生的事

1.invoke方法什么时候执行的?
jdk动态代理创建代理对象的时候需要传入三个参数,分别为(1)类加载器,(2)为哪些接口做代理(拦截什么方法),(3)把这些方法拦截到哪里处理,从图中我们得知,他是要把执行的方法拦截到MapperProxy类中的invoke方法处理,换句话说,该动态代理对象执行接口中的方法,都会调到MapperProxy类的invoke方法处理,这也就是为什么调用get方法的时候会调用invoke
2.执行过程
图中已经比较明显,那我还是文字给你简单描述一下原理.mapper文件中要定位到sql,需要两个条件,一个是namespace,一个是sql id.要想用这种mapper接口的方式调用也必须遵循一个约定,那就是namespace等于接口的全限定名.接口的方法名等于xml文件中的sql id,这就是为什么图中封装MapperMethod的时候,需要把这两个传进去的原因.确定了sql,传入参数mapperMethod.execute(args),拼接成一条完成sql,执行之.

心血来潮再补上一张时序图

想了解Mybatis缓存的移步Hibernate和Mybaitis缓存

别怕看源码,一张图搞定Mybatis的Mapper原理相关推荐

  1. 两张图搞定IJK源码

    IJK源码两张图就可以搞定,一张是IJK从播放到停止的代码流程图,一张是IJK的线程模型图

  2. 【一张图搞定关机程序】让你的代码有趣起来!送兄弟送闺蜜,快乐原来如此简单!(赋全过程和结果,超详细解说)

    从这里开始让你的代码有趣起来 事情是这样的 关机程序 实现关机指令 代码实现 如何把程序送出去 故事后续 快乐传递 事情是这样的 你也许不会想到,简单的几行的代码居然可以带来如此多的快乐,那么事情究竟 ...

  3. android 视网膜黄斑检查 amsler,自测黄斑病变 | 一张图搞定

    原标题:自测黄斑病变 | 一张图搞定 关注 很多人提到黄斑都唯恐避之不及,但你知道吗?人体也有一个重要的"黄斑"部位是必须保护的那就是眼底黄斑区,它跟我们的视觉是密切相关的. 如果 ...

  4. Math:利用学生计算器计算一大堆的平均数和方差思维图文教程(一张图搞定!)

    Math:利用学生计算器计算一大堆的平均数和方差思维图文教程(一张图搞定!) 目录 利用学生计算器计算一大堆的平均数和方差教程 利用学生计算器计算一大堆的平均数和方差教程 我们的学生计算器其实有很多功 ...

  5. Java高级工程师必看系列,从基础到源码统统帮你搞定

    1.Java基础 Java基础务必要有一个非常牢固的根基,尤其是对于JVM和并发编程的掌握情况**(属于进阶内容,但也是Java最为重要的基础内容)**,不论是面试还是工作,基础不好,写不出高质量.漂 ...

  6. [3D游戏开发实践] Cocos Cyberpunk 源码解读-一文搞定延迟渲染管线原理与实践

    Cocos Cyberpunk 是 Cocos 引擎官方团队以展示引擎重度 3D 游戏制作能力,提升社区学习动力而推出的完整开源 TPS 3D游戏,支持 Web, IOS, Android 多端发布. ...

  7. oauth2 增加token 返回参数_一张图搞定OAuth2.0

    公众号:低并发编程(dibingfa) 目录 1.引言 2.OAuth2.0是什么 3.OAuth2.0怎么写 1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简 ...

  8. 一张图搞定OAuth2.0

    1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...

  9. android启动页广告图,一张图搞定APP启动页广告

    之前我们产品里的启动页比较简单,就是背景色加上我们的logo.slogan等,这种形式适配起来比较容易,把元素切出来交给开发写出来就行.最近由于运营的需求,我们需要在APP启动页展示广告,广告图更新频 ...

最新文章

  1. 两难!到底用Apache BeanUtils还是Spring BeanUtils?
  2. 让机器像人一样听音乐,Facebook开源Demucs项目
  3. Web Storage
  4. 虚拟服务器能加内存吗,虚拟服务器可以加内存吗
  5. RocketMq Consumer 最佳实践
  6. HDU2031 进制转换【进制】
  7. 新驾考科目三有四个地方易犯错 多名教练提供对策
  8. Matlab与C/C++混合编程调用OpenCV
  9. 华为确认与三家EDA公司停止合作;开源安卓恶意软件窃取用户隐私信息;三星高通回应7纳米EUV工艺问题……...
  10. linux cat时间段,linux – cat / dev / urandom的输出是多么临时
  11. 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
  12. 如何把Excel转成html table表格代码
  13. JavaWeb开发——软件国际化(动态元素国际化)
  14. SM2258XT固态硬盘不认盘量产修复开卡工具,SM2258XT开卡教程
  15. mysql 登录失败18456_sql server 用户'sa'登录失败(错误18456)
  16. 上海php程序员职友集,好程序员WEB前端培训|HTML5培训|H5培训-好程序员官网
  17. iOS 微信支付开发流程
  18. 【Bash百宝箱】Makefile快速入门
  19. Hinton传奇:退学当木匠,辞职反军方,终成一代AI教父
  20. python 人民币兑美元汇率代码_人民币对美元汇率的大数据分析与预测【完整代码】...

热门文章

  1. # vue+JavaScript实现slideDown与slideUp效果
  2. SpringBoot视频教程 百度云
  3. 反应-扩散方程(Reaction-diffusion system)
  4. date比较大小 mybatis_mybatis 日期比较
  5. Java应届生大学四年怎么过才能进入华为工作
  6. eggjs框架源码解读
  7. 【英语六级】【仔细阅读】(2)
  8. Numpy与矩阵的相似对角化(Python与高等代数03)
  9. GIS基础(1)空间参考
  10. java 设置word权限_如何设置word文档的修改权限