![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Mybatis系列
文章平均质量分 86
Mybatis-Plus教程
云烟成雨TD
一个追求有道有术的非典型程序员
展开
-
Mybatis-Plus入门系列(20) -兼容多种数据库
在我们实际开发软件产品过程中,数据库的类型可能不是确定的,也有客户会有要求必须用什么数据库,比如很多政府机构要求必须使用国产数据库,所以我们在开发时,需要适配多种数据库。MySQLOraclePostgreSQL、达梦等数据库在进行增删改查时,都是基于美国国家标准局制定的SQL标准,比如SQL-92SQL-99。但是每个数据库厂商实际的SQL会有较小差异,也就是数据库方言,大家最熟知的就是MySQL分页使用limit,Oracle分页使用rownum`。支持各种标准SQL。原创 2023-02-22 20:15:40 · 9420 阅读 · 1 评论 -
Mybatis-Plus入门系列(19) -多数据源使用详解
文章目录简介特性约定使用案例1. 创建项目,引入依赖2. 添加hikari 数据源3. 编写业务逻辑4. 测试简介dynamic-datasource-spring-boot-starter 是一个基于spring boot的快速集成多数据源的启动器。其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x。这是一个第三方 mybatis 扩展库,与 mybatis-plus 本身无关,属于组织参与者小锅盖个人发起的项目,任何行为与 baomidou 组织其它成员无关。原创 2022-03-03 11:20:16 · 1634 阅读 · 0 评论 -
Mybatis-Plus入门系列(18) -基于注解的动态数据权限实现方案
数据权限简介前言一般的系统都离不开权限模块,它是支撑整个系统运行的基础模块。而根据项目类型和需求的不同,权限模块的设计更是大相径庭。但不管怎么变,权限模块从大的方面来说,可以分为三种大的类型:功能权限、接口权限、数据权限。功能权限:也就是我们最熟悉的菜单、按钮权限。可以配置各个角色能看到的菜单、按钮从而从最表层分配好权限接口权限:顾名思义,配置不通角色调用接口的权限。有些敏感接口,是只能有固定的一些角色才能调用,普通角色是不能调用的。这种情况需要有一个明确的系统来控制对应的访问权限数据权限:是大家原创 2021-11-09 17:54:02 · 6162 阅读 · 4 评论 -
MyBatis入门系列(26) -MyBatis-Spring-Boot-Starter入门案例
前言mybatis除了继承了Spring以外,还集成了Spring Boot的自动配置及自动装配,开发更加简化。MyBatis-Spring-Boot-Starter 帮助您在Spring Boot之上快速构建 MyBatis 应用程序。通过使用此模块,您将实现:构建独立的应用程序将样板文件减少到几乎为零更少的 XML 配置要求MyBatis-Spring-Boot-Starter 需要以下版本:入门案例首先使用Spring Initializr创建一个Spring Boot We原创 2021-11-01 15:22:21 · 3076 阅读 · 1 评论 -
MyBatis入门系列(25) -MyBatis-Spring核心之@MapperScan使用及源码分析
注册映射器在使用Mybatis中,我们需要将Mapper接口注册到Spring中,这叫注册映射器。注册映射器的方法根据你的配置方法,即经典的 XML 配置或新的 3.0 以上版本的 Java 配置(也就是常说的 @Configuration),而有所不同。XML 配置在你的 XML 中加入 MapperFactoryBean 以便将映射器注册到 Spring 中。就像下面一样:<bean id="userMapper" class="org.mybatis.spring.mapper.Map原创 2021-11-01 14:06:42 · 6804 阅读 · 2 评论 -
MyBatis入门系列(24) -MyBatis-Spring核心类之SqlSessionTemplate、SqlSessionDaoSupport
前言在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session。 使用 MyBatis-Spring 之后,你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以被注入一个线程安全的 SqlSession,它能基于 Spring 的事务配置来自动提交、回滚、关闭 session。SqlSess原创 2021-11-01 11:01:30 · 1163 阅读 · 0 评论 -
MyBatis入门系列(23) -MyBatis-Spring核心之事务管理器
Spring 事务MyBatis-Spring允许 MyBatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。并且支持 @Transactional 注解和 AOP 风格的配置。在事务处理期间,一个单独的 SqlSession 对象原创 2021-11-01 10:58:02 · 1518 阅读 · 0 评论 -
MyBatis入门系列(22) -MyBatis-Spring核心源码解析之SqlSessionFactoryBean
前言在之前使用了mybatis的文档中,我们需要手动创建SqlSessionFactory对象来获取SqlSession,然后通过SqlSession获取mapper代理对象,进行数据库操作。 // 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); Sql原创 2021-11-01 10:47:27 · 5034 阅读 · 1 评论 -
MyBatis入门系列(21) -MyBatis-Spring入门案例
来自于官方文档简介MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。版本匹配MyBatis-Spring 需要以下版本:入原创 2021-11-01 10:19:17 · 249 阅读 · 0 评论 -
Mybatis-Plus入门系列(17)-多租户插件TenantLineInnerInterceptor源码解析
核心类InnerInterceptor接口InnerInterceptor内置插件接口,是MP提供的插件功能顶级接口。定义了一些Slelect查询,Update更新时,进行前置处理的一些方法。实现了此接口的实现类,可以添加到Mybatis插件中,最终实现拦截器功能,实际还是调用的Mybatis插件。public interface InnerInterceptor { /** * 判断是否执行 {@link Executor#query(MappedStatement, Obj原创 2021-09-03 13:37:09 · 10606 阅读 · 1 评论 -
Mybatis-Plus入门系列(16)- MybatisPlus之代码生成器源码解析及生成VO案例
前言在上篇文档中,讲解了如何生成代码及自定义模板,可以实现基础的一些代码生成。但是除了这些代码,比如现在需要生成VO\PO等对象,以及生成其他更多功能的代码生成,应该怎么做呢。所以接下来分析下MybatisPlus代码生成源码,这样就可以对症下药了。源码分析1. 获取配置项用以下代码示例,可以看出AutoGenerator会加载各种配置。 // 添加以上配置到AutoGenerator中 AutoGenerator autoGenerator = new Auto原创 2021-07-30 17:24:23 · 1740 阅读 · 1 评论 -
MyBatis入门系列(20) -MyBatis之插件机制源码及流程分析
官网案例话不多说,先来个spring boot使用mybatis插件案例。创建插件类,并注入到IOC中@Component@Intercepts({@Signature( type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})public class原创 2021-06-29 10:58:14 · 285 阅读 · 0 评论 -
MyBatis入门系列(19) -MyBatis四大组件之ResultSetHandler源码及流程解析
ResultSetHandler之前说过在创建StatementHandler处理器时会同时创建ParameterHandler及ResultSetHandler。ResultSetHandler是Mybatis的核心组件,主要负责将结果集resultSets转化成结果列表(或cursor)和处理储存过程的输出。源码分析ResultSet在原生JDBC查询的代码中,使用Statement进行操作,会返回ResultSet对象。ResultSet也是java.sql中的接口,它表示通过执行查询数原创 2021-06-28 12:58:04 · 1148 阅读 · 1 评论 -
MyBatis入门系列(18) -MyBatis四大组件之ParameterHandler源码及流程解析
ParameterHandler在之前的分析文档中,我们了解到在创建StatementHandler时,会生成参数处理器及结果集处理器。每个StatementHandler都会包含一个ParameterHandler及ResultSetHandler。ParameterHandler参数处理器主要是为PreparedStatement的sql语句参数动态赋值。 this.parameterHandler = this.configuration.newParameterHandler(m原创 2021-06-28 10:41:07 · 784 阅读 · 0 评论 -
MyBatis入门系列(17) -MyBatis四大组件之StatementHandler源码及流程解析
前言上篇文档我们分析了Executor源码及流程解析,我们了解到,Executor是SQL方法的执行器,是SQL方法执行的入口,配合其他组件,完成整个SQL的生命周期。Executor最后执行是由StatementHandler调用Statement去处理的,那么现在,就需要了解下MyBatis另外一个重要组件StatementHandler。StatementHandler字面上来看,是Statement的处理器。那么关于什么是Statement呢?StatementMyBatis中用的State原创 2021-06-28 09:43:19 · 518 阅读 · 1 评论 -
MyBatis入门系列(14) -MyBatis运行原理之获取Mapper代理对象源码分析
获取Mapper代理对象在获取了SqlSession对象后,调用getMapper方法传入一个Mapper接口,就会返回一个实例对象,众所周知,接口是不能实例化的,那么返回的肯定是接口的代理对象。UserMapper userMapper = sqlSession.getMapper(UserMapper.class);大致流程源码分析1. DefaultSqlSession.getMapper(type, this)SqlSession对象为DefaultSqlSession,那么实际调用原创 2021-06-23 19:18:16 · 558 阅读 · 1 评论 -
MyBatis入门系列(16) -MyBatis四大组件之Executor源码及流程解析
四大组件原创 2021-06-25 19:10:40 · 455 阅读 · 1 评论 -
MyBatis入门系列(15) -MyBatis运行原理之SQL查询源码分析
查询流程在通过代理模式获取到mapper接口的代理对象后,就直接使用代理对象进行增删改查操作了。 List<User> dynamicUserList = userMapper.selectDynamicUserList(userQuery);流程图源码分析1. MapperProxy.invoke(Object proxy, Method method, Object[] args)代理对象执行时,会进入MapperProxy类invoke方法。 /** * 执行代原创 2021-06-24 15:50:11 · 464 阅读 · 0 评论 -
MyBatis入门系列(13) -MyBatis运行原理之获取SqlSession源码分析
获取SqlSession创建了SqlSessionFactory后,调用openSession方法获取SqlSession对象。 SqlSession sqlSession = sqlSessionFactory.openSession();大致流程源码分析SqlSessionFactory是接口,其实际对象是DefaultSqlSessionFactory,2、返回sqlSession的实现类DefaultsqlSession对象。他里面包含了Executor和configu原创 2021-06-23 13:34:40 · 313 阅读 · 0 评论 -
MyBatis入门系列(12) -MyBatis运行原理之构建SqlSessionFactory源码分析
架构图Mybatis的功能架构分为以下几层,自下而上完成Dao操作:API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。原创 2021-06-22 23:07:21 · 568 阅读 · 2 评论 -
Mybatis-Plus入门系列(15)- MybatisPlus之代码生成器(3.5.0版本)
AutoGeneratorAutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。也可以自定义生成模板,生成更丰富的后台代码,简化开发。默认风格案例(1)引入依赖MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:添加 代码生成器 依赖,3.5.0不兼原创 2021-06-16 22:29:58 · 3862 阅读 · 0 评论 -
MyBatis入门系列(11) -spring boot集成MyBatis
MyBatis-Spring整合原创 2021-06-16 15:34:07 · 299 阅读 · 0 评论 -
MyBatis入门系列(10) -MyBatis之缓存机制详解
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率。 • MyBatis系统中默认定义了两级缓存。原创 2021-06-15 18:38:47 · 1081 阅读 · 0 评论 -
MyBatis入门系列(9) -MyBatis之SQL语句构建器
SQL 语句构建器问题Java 程序员面对的最痛苦的事情之一就是在 Java 代码中嵌入 SQL 语句。这通常是因为需要动态生成 SQL 语句,不然我们可以将它们放到外部文件或者存储过程中。如你所见,MyBatis 在 XML 映射中具备强大的 SQL 动态生成能力。但有时,我们还是需要在 Java 代码里构建 SQL 语句。此时,MyBatis 有另外一个特性可以帮到你,让你从处理典型问题中解放出来,比如加号、引号、换行、格式化问题、嵌入条件的逗号管理及 AND 连接。确实,在 Java 代码中动态生原创 2021-06-13 23:04:35 · 3677 阅读 · 1 评论 -
MyBatis入门系列(8) -MyBatis之映射器注解
日志Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:SLF4JApache Commons LoggingLog4j 2Log4jJDK logging原创 2021-06-13 19:35:55 · 1677 阅读 · 0 评论 -
MyBatis入门系列(7) -MyBatis之Java API
Java API既然你已经知道如何配置 MyBatis 以及如何创建映射,是时候来尝点甜头了。MyBatis 的 Java API 就是这个甜头。稍后你将看到,和 JDBC 相比,MyBatis 大幅简化你的代码并力图保持其简洁、容易理解和维护。为了使得 SQL 映射更加优秀,MyBatis 3 引入了许多重要的改进。...原创 2021-06-13 18:59:21 · 351 阅读 · 0 评论 -
MyBatis入门系列(6) -Mapper映射文件详解之动态SQL
动态 SQL所谓动态 SQL就是根据用户输入参数等才能确定的语句,根据用户输入参数执行不同的增删改查。动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。原创 2021-06-13 17:27:50 · 935 阅读 · 0 评论 -
MyBatis入门系列(5) -Mapper映射文件详解之参数处理及结果映射
resultMap原创 2021-06-11 15:49:20 · 2893 阅读 · 1 评论 -
MyBatis入门系列(4) -Mapper映射文件详解之增删改查基本操作
XML 映射器MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):cache – 该命名空间的缓存配置。cache-ref – 引用其它命名空间的缓存配置。resultMap – 描述如何从数据库结果集中加载对象原创 2021-06-10 16:31:28 · 1153 阅读 · 0 评论 -
MyBatis入门系列(3) -MyBatis全局配置文件详解2
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。提示 从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。类型处理器Java 类型JDBC 类型BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEANByteTyp.原创 2021-06-09 23:00:28 · 337 阅读 · 1 评论 -
MyBatis入门系列(2) -MyBatis全局配置文件详解1
全局配置文件包含了MyBatis数据源、MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环境变量)transactionManager(事务管理器).原创 2021-06-09 21:22:49 · 589 阅读 · 0 评论 -
MyBatis入门系列(1) -MyBatis简介及入门案例
简介官方文档github地址什么是 MyBatis?MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis历史MyBatis框架最早的名字叫iBatisibatis2001年 Cli原创 2021-06-09 14:04:24 · 400 阅读 · 0 评论 -
Mybatis-Plus入门系列(14)- MybatisPlus之条件构造器
前言mybatis-plus提供了强大的条件构造器,用于构造Where条件。Wrapper 条件构造抽象类 -- AbstractWrapper 查询条件封装,用于生成 sql 中的 where 语句。 -- QueryWrapper Query封装操作类,用于查询。 -- UpdateWrapper Update条件封装操作类,用于更新。 -- AbstractLambdaWrapper 使用 Lambda 表达式封装 wrapper原创 2021-04-21 12:49:03 · 2046 阅读 · 0 评论 -
Mybatis-Plus入门系列(13)- MybatisPlus之自定义ID生成器
数据库ID生成策略在数据库表设计时,主键ID是必不可少的字段,如何优雅的设计数据库ID,适应当前业务场景,需要根据需求选取合适高效的策略,在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识,下面介绍下常用的几种ID生成策略。Sequence ID(数据库自增)数据库自增长序列或字段,最常见的方式。由数据库维护,数据库表唯一。优点:简单,代码方便,性能可以接受。数字ID天然排序,对分页或者需要排序的结果很有帮助。缺点:不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持原创 2021-04-19 13:34:34 · 15411 阅读 · 4 评论 -
原创 Mybatis-Plus入门系列(12)- MybatisPlus之IService接口CRUD详解
简介Plust提供了一个顶级IService ,封装了很多CRUD操作,实际使用时,推荐直接在service层调用,Mapper:采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类对象 Wrapper 为 条件构造器插入Saveboolean save(T原创 2021-03-31 18:39:46 · 4898 阅读 · 0 评论 -
Mybatis-Plus入门系列(11)- MybatisPlus之Sql注入器及源码分析
简介什么是sql注入器/** * SQL 自动注入器 * * @author hubin * @since 2018-04-07 */public abstract class AbstractSqlInjector implements ISqlInjector { private static final Log logger = LogFactory.getLog(AbstractSqlInjector.class); /** * 检查SQL是否注入(已原创 2021-03-31 13:45:13 · 1582 阅读 · 0 评论 -
Mybatis-Plus入门系列(10)- MybatisPlus之自动填充功能
前言必要性:在实际开发中,设计数据库表时,通常都会添加公共字段,比如创建时间、操作人、更新时间等。而这些阿里巴巴规范:建表规约9【强制】表必备三字段:id, gmt_create, gmt_modified。说明:其中 id必为主键,类型为 unsigned bigint、单表时自增、步长为 1。gmt_create,gmt_modified的类型均为 date_time类型,前者现在时表示主动创建,后者过去分词表示被动更新。MybatisPlus自动填充Plus提供了MetaObjectHa原创 2021-03-30 17:03:04 · 2501 阅读 · 0 评论 -
Mybatis-Plus入门系列(9)- MybatisPlus之逻辑删除
概念什么是逻辑删除逻辑删除:假删除。将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。数据库实现思路:插入数据时,标记为未删除状态;查询、修改时,只获取未删除状态的数据进行操作;删除时则更新删除状态为已删除,则可实现逻辑上删除,物理上任存在数据功能。参考阿里巴巴开发规范表达逻辑删除的字段名为 is_deleted,1 表示删除,0 表示未删除。测试案例在表中添加is_deleted字段,并设置默认值为0,实体类添加逻辑删除字段并添加 @TableLo原创 2021-03-30 13:11:24 · 2787 阅读 · 0 评论 -
Mybatis-Plus入门系列(8)- MybatisPlus之sql性能规范插件IllegalSQLInnerInterceptor
前言IllegalSQLInnerInterceptor:不规范SQL拦截器。由于开发人员水平参差不齐,即使订了开发规范很多人也不遵守,SQL是影响系统性能最重要的因素,所以拦截掉不规范SQL语句。拦截SQL类型的场景:必须使用到索引,包含left join连接字段,符合索引最左原则如果因为动态SQL,bug导致update的where条件没有带上,全表更新上万条数据如果检查到使用了索引,SQL性能基本不会太差SQL尽量单表执行,有查询left join的语句,必须在注释里面允许该S原创 2021-03-22 11:50:06 · 4767 阅读 · 1 评论 -
Mybatis-Plus入门系列(7)- MybatisPlus之乐观锁插件OptimisticLockerInnerInterceptor
乐观锁并发控制:在计算机科学,特别是程序设计、操作系统、多重处理和数据库等领域,并发控制是确保及时纠正由并发操作导致的错误的一种机制。并发控制的基本单位是事务。数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观锁(Optimistic Locking):乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁原创 2021-03-22 10:39:30 · 4895 阅读 · 1 评论