MyBatis-Spring

Mybatis源码架构

久未见 提交于 2021-02-02 06:57:58
一、JDBC实现查询分析 如果不使用mybatis,使用原生的API来进行JDBC查询时的实现如下: public static List<Map<String,Object>> jdbcQuery(){ Connection connection = null; ResultSet rs = null; PreparedStatement stmt = null; List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>(); try { //1、加载JDBC驱动 Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8"; //2、获取数据库连接 connection = DriverManager.getConnection(url,"root","123456"); String sql = "select * from user where id = ? "; //3、创建Statement对象(每一个Statement为一次数据库执行请求) stmt = connection

阿里弃用Hibernate,却用MyBatis,竟然是因为这个!

一世执手 提交于 2020-11-11 10:25:19
最近一直在研究MyBatis源码,作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手! 另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。 而在Mybatis中,缓存是一个绕不开的话题。比如说,MyBatis的一级缓存竟然还会引来麻烦? MyBatis 一级缓存与 SpringFramework 的声明式事务有冲突吗?在 Service 中开启事务,连续查询两次同样的数据,结果两次查询的结果不一致。这些应该如何解决? 使用 Mapper 的 selectById 查出来实体,修改实体的属性值,然后再 selectById 查找实体,发现之前查出来的是刚才修改过的实体,不是由数据库查出来的 如果不开启事务,则两次请求查询的结果是相同的,控制台打印了两次 SQ 然而大多数人对Mybatis框架的理解仅仅局限于使用,并不熟悉框架底层的实现原理。但MyBatis框架在互联网大厂是非常重要的角色,比如说阿里巴巴的持久层抛弃hibernate,采用的就是MyBatis框架 为什么阿里巴巴的持久层抛弃hibernate,采用MyBatis框架? 原因大概有以下4点: 阿里在mysql上下了大功夫,他们对数据查询的要求也比较高,很多sql查询都要精心设计

Mybatis 原理

…衆ロ難τιáo~ 提交于 2020-08-12 20:27:06
Mybatis 所有的力量来自 SqlSession 接口,DefaultSqlSession 是它的一个实现类。 DefaultSqlSession 中包括了 Configuration 和 Executor 。 Configuration 在 SqlSessionFactory 的初始化中通过 XMLMapperBuilder 来生成 MappedStatement ,并放入 Configuraion 中。 执行任何 SQL 语句,都是从 SqlSession 进入,从 Configuration 获取 MappedStatement ,然后放入 Executor。 sqlSource 在 MappedStatement 中会变成 boundSql。 在 Executor 中 MappedStatement 和其他一些条件会生成 StatementHandler 。 在 StatementHandler 中实际执行 JDBC 的操作,然后通过 ResultSetHandler 包装好结果回传。 Configuration ---> MappedStatement ---> Executor ---> StatementHandler ---> ResultSetHandler * JDBC 中没有 Transaction 接口,只是通过 Connection 体现了这个概念

源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)

核能气质少年 提交于 2020-08-08 22:52:06
作者:小傅哥 博客: https://bugstack.cn - 汇总系列原创专题文章 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言介绍 一个知识点的学习过程基本分为;运行helloworld、熟练使用api、源码分析、核心专家。在分析mybaits以及mybatis-spring源码之前,我也只是简单的使用,因为它好用。但是他是怎么做的多半是凭自己的经验去分析,但始终觉得这样的感觉缺少点什么,在几次夙兴夜寐,靡有朝矣之后决定彻底的研究一下,之后在去仿照着写一版核心功能。依次来补全自己的技术栈的空缺。在现在技术知识像爆炸一样迸发,而我们多半又忙于工作业务开发。就像一个不会修车的老司机,只能一脚油门,一脚刹车的奔波。车速很快,但经不起坏,累觉不爱。好!为了解决这样问题,也为了钱程似锦(形容钱多的想家里的棉布一样),努力! 开动之前先庆祝下我的iPhone4s又活了,还是那么好用( 嗯!有点卡 ); 二、以往章节 关于mybaits & spring 源码分析以及demo功能的章节汇总,可以通过下列内容进行系统的学习,同时以下章节会有部分内容涉及到demo版本的mybaits; 源码分析 | Mybatis接口没有实现类为什么可以执行增删改查 源码分析 | 像盗墓一样分析Spring是怎么初始化xml并注册bean的 源码分析 |

【Spring】Bean的LifeCycle(生命周期)

牧云@^-^@ 提交于 2020-08-08 10:22:46
菜瓜:水稻,上次说Bean的LifeCycle,还没讲完 水稻:啥?说人话? 菜瓜:spring,bean,生命周期 水稻:哦哦,下次直接说人话。说正事,先从BeanFactory、ApplicationContext和FactoryBean开始说起吧 我们知道(你不一定知道)BeanFactory是Spring访问Bean容器的根接口,源码的注释: “The root interface for accessing a Spring bean container.” 而ApplicationContext继承自BeanFactory,也就是说它具有BeanFactory的属性和方法,并进一步完善(继承其他的接口) FactoryBean跟前两个关系就不怎么大了,它是spring提供给用户创建bean的口子,有一些bean创建过程复杂,或者依赖第三方包等(Mybatis-Spring中),可交给用户自己创建 菜瓜:嗯。。陷入沉思。。(欲言又止) 水稻:讲理论不给代码就是耍流氓 package com.vip.qc.postprocessor; import org.springframework.beans.factory.FactoryBean; import org.springframework.stereotype.Component; /** * @author

腾讯T4架构师耗时八个月整理《深入浅出MyBatis技术原理与实战》

て烟熏妆下的殇ゞ 提交于 2020-08-06 10:43:07
写在前面 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 本书以讲解MyBatis基础运用和原理为主,所以适合初级到中高级开发人员阅读。 小编这里早已为大家准备好【深入浅出MyBatis技术原理与实战】的PDF完整版 内容介绍 本书分为三大部分 第一部分是MyBatis基础应用 第1章丨MyBatis【MyBatis的内容简介,告诉读者MyBatis是什么,在何种场景下使用它。】 领取《深入浅出MyBatis技术原理与实战》方式: 点此获取 第2章丨MyBatis入门【主要介绍MyBatis的基础模块及生命周期,并给出实例。】 第3章丨配置【主要介绍MyBatis配置的主要含义和内容。】 第4章丨映射器【介绍MyBatis映射器的主要元素及其使用方法。】 第5章丨动态SQL【介绍动态SQL,助你轻松应对大部分的SQL场景。】 第二部分是MyBatis原理 第6章丨MyBatis的解析和运行原理【介绍MyBatis的解析和运行原理,我们将了解到SqlSession的构建方法

MyBatis和Spring整合的奥秘

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-06 01:00:44
本篇博客源码分析基于Spring 5.1.16.RELEASE,mybatis-spring 2.0.0,较高版本的mybatis-spring源码有较大区别。 Spring之所以是目前Java最受欢迎的框架,几乎所有的Java项目都在使用,就是因为它良好的生态,很多技术可以与之整合,为什么其他技术可以和Spring相整合,就是因为Spring拥有很多扩展点,阅读Spring源码,有一部分原因就是有必要清楚的知道Spring提供了哪些扩展点,而怎么合理的利用这些扩展点,就需要了解其他技术是如何利用这些扩展点的。 今天我就来带着大家看下,国内最流行的数据库框架MyBatis是如何利用Spring的扩展点的,从而双剑合璧,让Spring+MyBatis成为国内最流行的技术搭配。 前置知识 为了后面的故事可以顺利展开,很有必要先给大家介绍下,阅读mybatis-spring源码的前置知识,没有这些前置知识阅读mybatis-spring源码是寸步难行。 mybatis-spring使用 因为现在有了SpringBoot,所以Mybatis和Spring的整合变得非常简单,但是如果没有SpringBoot,该怎么整合呢?我翻阅了百度的前几页,不知道是不是搜索关键词问题,几乎全是用XML的方式去整合Mybatis和Spring的,零XML配置,它不香吗? 代码结构: 具体实现:

给java编程新手推荐的java学习十个基本点

淺唱寂寞╮ 提交于 2020-05-06 20:17:33
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 给你java学习路线:html-css-js-jq-javase-数据库-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm 在这里小编给零基础的小白罗列下java的基本语法,有基础的大神可以略过。 基本语法: 一、编写Java程序时,应注意以下几点: 大小写敏感 :Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。 类名 :对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。 方法名 :所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。 源文件名 :源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。 主方法入口 :所有的Java 程序由 public static void main(String []args)

MyBatis-Spring(二):整合Mybatis与Spring方式二:SqlSessionDaoSupport

谁都会走 提交于 2020-04-06 03:59:22
本文上接《MyBatis-Spring:整合Mybatis与Spring方式一:SqlSessionTemplate》, SqlSessionDaoSupport是一个抽象的支持类,用来为你提供SqlSession。调用getSqlSession()方法你会得到一个SqlSessionTemplate,之后可以用于执行 SQL 方法,就像下面这样: public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper { public List<User> selectUser() { return getSqlSession().getMapper(UserMapper.class).selectUser(); } } SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactory 或 SqlSessionTemplate。如果两个属性都被设置了,那么 SqlSessionFactory 将被忽略。 假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类,可以编写如下的 Spring 配置来执行设置: <bean id="userMapper" class="com.spring.mapper.UserMapperImpl

MyBatis-Spring(一):整合Mybatis与Spring方式一:SqlSessionTemplate

江枫思渺然 提交于 2020-04-06 03:53:28
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 准备工作,实体类,mapper接口,mybatis配置文件 public class User { private int id; private String username; private String password; } public interface UserMapper { public List<User> selectUser(); } <mapper namespace="com.spring.mapper.UserMapper"> <select id="selectUser" resultType="user">select * from databasename.user;</select> </mapper> <!--mybatis-config.xml配置文件--> <configuration> <typeAliases> <package name="com.spring.pojo"/> </typeAliases>