Mybatis入门及源码学习
用来学习mybatis的源码,了解Mybatis的运行流程及实现机制
军伟@
Java开发工程师
展开
-
mybatis-plus学习--ActiveRecord实现原理探究
在Mybatis-Plus中提供了ActiveRecord的模式,支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作,简单来说就是一个实体类继承Model类,并通过注解与数据库的表名进行关联,这样就可以通过实体类直接进行表的简单增删改查操作,这样也确实极大的方便了开发人员。原理理解: 简单来说Mybatis-plu...原创 2018-08-19 11:43:41 · 20536 阅读 · 3 评论 -
mybtais-plus学习--BaseMapper提供的方法及SQL语句生成
这篇博客我们介绍一下关于Mybatis-Plus相关的知识,Mybatis-Plus可以简单的理解为Mybatis的加强,其在Mybatis的基础上完成了一些封装,这样开发人员在使用起来就很容易和方便(确实是一个很好的框架),官网Mybatis-Plus优点 | Advantages无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入...原创 2018-08-18 18:44:59 · 84881 阅读 · 3 评论 -
mybatis配置开发
以mysql为例:一、需要的架包:mybatis.jar和mysql-connector-java.jar二、一般会有两类配置文件:数据库配置文件和要执行的sql语句数据库配置文件(配置文件中有关数据库的信息可以直接配置也可以通过properties文件进行配置):xml version="1.0" encoding="UTF-8"?> > conf原创 2015-11-08 12:11:19 · 1134 阅读 · 0 评论 -
Mybatis中文查询没有结果
我用中文参数去查找数据,没有返回结果,应该是乱码问题进行如下配置问题消失:jdbc:mysql://localhost:3306/appstore_db?useUnicode=true&characterEncoding=UTF-8原创 2015-11-14 16:33:39 · 2717 阅读 · 0 评论 -
Mybatis源码分析--关联表查询及延迟加载(一)
Mybatis提供了关联查询映射的功能。一、一对一关联实体类如下:Users表对应的实体类:public class User { private int id; private String names; private int age; private Teacher teacher; ......getXxx和setXxx方法}Teacher表对应的实体类:public原创 2017-01-03 20:52:59 · 2189 阅读 · 0 评论 -
Mybatis源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理。其实简单来说Mybatis的延迟加载就是分多次执行SQL语句,这样就实现了延迟加载的机制,并且第一次执行的结果值可能是接下来执行的SQL语句的参数值,Mybatis实现执行接下来的SQL的原理机制是通过代理类来实现的,就是原创 2017-01-03 20:53:49 · 3013 阅读 · 0 评论 -
Mybatis源码分析--返回值ResultType和ResultMap
这一篇博客我们来介绍一下Mybatis执行sql语句返回的结果值的到实体对象的映射机制。首先ResultType和ResultMap的使用方式是不同的。ResultType的使用方式:resultType的值为实体类 select * from users where id=#{id} ResultMap的使用方式:首先要定义resultMap的对应关系原创 2016-12-28 15:49:13 · 5560 阅读 · 1 评论 -
Mybatis源码学习之TypeHandler
ORM框架最重要功能是将面向对象方法中的对象和关系型数据库中的表关联了起来,在关联过程中就必然涉及到对象中的数据类型和数据库中的表字段类型的转换,Mybatis中的org.apache.ibatis.type包主要就是实现这个功能。TypeHandler的功能就是给参数设置指定的jdbc类型和返回对应的java类型的数据。接口、抽象类和实现类的结构体系:接口TypeHandler中定义如下方法:主原创 2016-12-15 19:37:14 · 7052 阅读 · 0 评论 -
Mybatis源码分析之参数映射及处理ParameterHandler
ParameterHandler是用来设置参数规则的,当StatementHandler调用prepare方法之后,接下来就是调用它来进行设置参数。ParameterHandler接口:public interface ParameterHandler { Object getParameterObject(); void setParameters(PreparedStatement原创 2016-12-15 19:14:38 · 3903 阅读 · 1 评论 -
Mybatis的resultType
使用mybatis去查询数据时,没有指定resultType,mybatis无法返回正常结果,当然在web中并没有出现报错,所以有点坑自己了,所以需要使用如下配置: select * from tbl_plugins where id in <foreach item="data" collection="array" open="(原创 2015-11-20 20:15:34 · 2509 阅读 · 0 评论 -
spring+mybaits多数据源使用
一、在利用spring管理mybatis时可以同时配置多个数据源,并且数据源可以随时切换,但在多线程中多数据源的事务需要一定的配置。多数据源配置:原创 2016-01-11 21:07:24 · 1910 阅读 · 0 评论 -
Mybatis #和$
在mybatis的mapper文件中,对于传递的参数我们一般是使用#和$来获取参数值。当使用#时变量是占位符,就是一般我们使用java jdbc的PrepareStatement时的占位符?,所有可以防止sql注入当使用$时,变量就是直接追加在sql中,一般会有sql注入问题。一个问题就是:在使用mybatis传递时间变量时,如果通过#方式获取变量值,可能会出现与数据库的字段的原创 2016-03-16 18:19:18 · 11563 阅读 · 1 评论 -
Mybatis简单入门
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。一、表结构准备:DROP TABLE IF EXIST原创 2016-10-09 12:34:51 · 995 阅读 · 0 评论 -
Mybatis3.4.0不支持mybatis-spring1.2.5及以下版本
今天将工程的Mybatis的版本由3.3.0升级到3.4.0导致程序运行错误,使用的mybatis-spring版本是1.2.3,错误内容如下,最后发现是SpringManagedTransaction类中没有getTimeout函数,所以导致这个错误出现。java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringM原创 2016-10-19 10:05:52 · 6633 阅读 · 1 评论 -
Mybatis源码分析之缓存
一、MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,H原创 2016-11-17 13:47:29 · 1651 阅读 · 0 评论 -
Mybatis源码分析之存储过程调用
这一篇博客我们学习一下Mybatis调用存储过程的使用和运行流程。首先我们先创建一个简单的存储过程DELIMITER $CREATE PROCEDURE mybatis.ges_user_count(IN age INT, OUT user_count INT)BEGIN SELECT COUNT(*) FROM users WHERE users.age=age INTO user_co原创 2016-11-17 12:49:21 · 1481 阅读 · 0 评论 -
Mybatis源码分析之结果封装ResultSetHandler和DefaultResultSetHandler
ResultSetHandler负责处理两件事:(1)处理Statement执行后产生的结果集,生成结果列表(2)处理存储过程执行后的输出参数ResultSetHandler是一个接口,提供了两个函数分别用来处理普通操作和存储过程的结果,源码如下:/** * @author Clinton Begin */public interface ResultSetHandler原创 2016-09-29 18:22:07 · 12064 阅读 · 4 评论 -
MyBatis主键生成器KeyGenerator(一)
Mybatis提供了主键生成器接口KeyGenerator,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 。由于不同的数据库对主键的生成不一样:(1)针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle、DB2,KeyGenerator提供了proce原创 2016-09-26 21:45:27 · 27386 阅读 · 3 评论 -
MyBatis主键生成器Jdbc3KeyGenerator(二)
上一篇博客MyBatis主键生成器KeyGenerator(一)中我们大体介绍了主键生成器的接口及配置等,接下来我们介绍一下KeyGenerator的实现类Jdbc3KeyGeneratorJdbc3KeyGenerator实际上实现了processAfter方法,其使用方法如下配置,目的是将主键作为返回值返回,这种用法只能是在有自增主键的数据库中使用: insert into tb原创 2016-09-26 21:46:27 · 5586 阅读 · 8 评论 -
MyBatis主键生成器SelectKeyGenerator(三)
前面两篇博客我们介绍了MyBatis主键生成器KeyGenerator(一)和MyBatis主键生成器Jdbc3KeyGenerator(二),接下来我们介绍SelectKeyGenerator,如在Oraclee中并不提供自增组件,提供了Sequence主键,我们就需要执行它的Sequence主键,如在mysql中如下配置: SELECT LAST_INSERT_ID() AS原创 2016-09-26 21:48:11 · 6829 阅读 · 0 评论 -
Mybatis源码之Statement处理器StatementHandler(一)
StatementHandler通过类名我们可以了解到它可能是Statement的处理器,它是一个接口,其实现类如下:BaseStatementHandler:一个抽象类,只是实现了一些不涉及具体操作的方法RoutingStatementHandler:类似路由器,根据配置文件来路由选择具体实现类SimpleStatementHandler、CallableStatementHan原创 2016-09-24 22:31:36 · 3942 阅读 · 0 评论 -
Mybatis源码之Statement处理器BaseStatementHandler(二)
BaseStatementHandler是一个抽象类,并没有实现和CURD相关的类,只是更多的设置了一些参数相关。源码如下:/** * @author Clinton Begin */public abstract class BaseStatementHandler implements StatementHandler { protected final Configura原创 2016-09-24 22:32:02 · 1492 阅读 · 1 评论 -
Mybatis源码之Statement处理器RoutingStatementHandler(三)
RoutingStatementHandler类似路由器,在其构造函数中会根据Mapper文件中设置的StatementType来选择使用SimpleStatementHandler、PreparedStatementHandler和CallableStatementHandler,其实现的接口StatementHandler的方法也是由这三个具体实现类来实现。源码如下:/** * @a原创 2016-09-24 22:32:41 · 5957 阅读 · 2 评论 -
Mybatis源码之Statement处理器SimpleStatementHandler(四)
SimpleStatementHandler就是使用基本的Statement来执行query、batch、update等操作,其实现还是比较简单的,当然在执行过程中会涉及keyGenerator和ResultHandler操作,这些我们会在接下来的博客中进行详解。SimpleStatementHandler用于执行简单的sql语句,这里简单的sql语句是指sql语句中没有变量,不会通过外部进行参数原创 2016-09-24 22:33:42 · 1973 阅读 · 0 评论 -
Mybatis源码之Statement处理器PreparedStatementHandler(五)
PreparedStatementHandler就是调用PreparedStatement来执行SQL语句,这样在第一次执行sql语句时会进行预编译,在接下来执行相同的SQL语句时会提高数据库性能源码如下:/** * @author Clinton Begin *//* 使用PrepareStatement**/public class PreparedStatementHandl原创 2016-09-24 22:34:19 · 4697 阅读 · 0 评论 -
Mybatis源码之Statement处理器CallableStatementHandler(六)
CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程。源码如下:/** * @author Clinton Begin *//***/public class CallableStatementHandler extends BaseStatementHandler { public Calla原创 2016-09-24 22:34:51 · 3011 阅读 · 0 评论 -
Mybatis执行Executor(一)
在DefaultSqlSession中我们可以看到一系列的增删改查操作的其实都是在调用Executor的接口,Mybatis对外统一提供了一个操作接口类Executor,提供的接口方法有update、query、flushStatements、commit、rollback等接口函数,源码如下: /** * @author Clinton Begin */public interfac原创 2016-09-23 21:47:47 · 6608 阅读 · 0 评论 -
Mybatis执行BaseExecutor(二)
BaseExecutor是Executor的一个子类,是一个抽象类,其实现了接口Executor的部分方法,并提供了三个抽象方法doUpdate、doFlushStatements和doQuery在他的子类SimpleExecutor、ReuseExecutor和BatchExecutor中实现。BaseExecutor的实现源码如下:原创 2016-09-23 21:48:46 · 5177 阅读 · 3 评论 -
Mybatis执行SimpleExecutor(三)
SimpleExecutor通过类名可以看出,它是一个简单的执行类,并不会做一些处理就执行sql,源码及分析如下:/** * @author Clinton Begin */public class SimpleExecutor extends BaseExecutor { public SimpleExecutor(Configuration configuration, Tra原创 2016-09-23 21:49:09 · 3358 阅读 · 0 评论 -
Mybatis执行BatchExecutor(四)
BatchExecutor:顾名思义就是进行批量操作,通过批量操作来提高性能public class BatchExecutor extends BaseExecutor { public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002; /* Statement链表**/ privat原创 2016-09-23 21:50:21 · 18624 阅读 · 3 评论 -
Mybatis执行ReuseExecutor(五)
ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map,将执行的sql作为key,将执行的Statement作为value保存,这样执行相同的sql时就可以使用已经存在的Statement,就不需要新创建了,源码及分析如下:/** * @author Clinton Begin */public class ReuseExecutor extends BaseExecut原创 2016-09-23 21:51:00 · 5719 阅读 · 3 评论 -
Mybatis执行CachingExecutor(六)
前面几篇博客我们介绍了Excutor及抽象类BaseExecutor和实现类SimpleExecutor、BatchExecutor和ReuseExecutor:接下来我们再介绍一个比较重要的类CachingExecutor,通过类名我们可以猜测到,这个Executor执行类可能原创 2016-09-23 21:53:59 · 5483 阅读 · 0 评论 -
myBatis源码学习之SqlSessionFactoryBuilder
/* * Builds {@link SqlSession} instances. * *//** * @author Clinton Begin */public class SqlSessionFactoryBuilder { public SqlSessionFactory build(Reader reader) { return build(reader, n原创 2015-12-30 20:03:49 · 10244 阅读 · 1 评论 -
myBatis源码学习之SqlSessionFactory
/** * Creates an {@link SqlSesion} out of a connection or a DataSource * * @author Clinton Begin */ //SqlSessionFactory接口,通过openSession方法获得SQLSessionpublic interface SqlSessionFactory { SqlS原创 2015-12-30 20:05:56 · 2090 阅读 · 0 评论 -
myBatis源码之XMLConfigBuilder
/** * @author Clinton Begin */public class XMLConfigBuilder extends BaseBuilder { private boolean parsed; private XPathParser parser; private String environment; public XMLConfigBuilder(R原创 2015-12-30 20:08:21 · 5300 阅读 · 0 评论 -
myBatis源码学习之SqlSession
/** * @author Clinton Begin */public class DefaultSqlSession implements SqlSession { private Configuration configuration; //配置文件生成的对象 private Executor executor;//执行器 private boolean autoCom原创 2015-12-30 20:07:22 · 5095 阅读 · 0 评论 -
myBatis源码之Configuration
/** * @author Clinton Begin */ //mybatis配置文件对应的类,包含了配置项的get set方法,并且有些初始化默认值public class Configuration { protected Environment environment; protected boolean safeRowBoundsEnabled = false;原创 2015-12-30 20:09:19 · 4883 阅读 · 0 评论 -
myBatis源码之Executor、BaseExecutor和CachingExecutor
/** * @author Clinton Begin */public class SimpleExecutor extends BaseExecutor { public SimpleExecutor(Configuration configuration, Transaction transaction) { super(configuration, transactio原创 2015-12-30 20:11:12 · 3133 阅读 · 1 评论 -
mybatis源码之MapperMethod
/** * @author Clinton Begin * @author Eduardo Macarron * @author Lasse Voss *///这个类是整个代理机制的核心类,对Sqlsession当中的操作进行了封装public class MapperMethod { //一个内部封 封装了SQL标签的类型 insert update delete原创 2016-01-07 20:05:27 · 7111 阅读 · 0 评论 -
mybatis源码之BaseStatementHandler
/** * @author Clinton Begin */public abstract class BaseStatementHandler implements StatementHandler { protected final Configuration configuration; protected final ObjectFactory objectFactory;原创 2016-01-07 20:08:50 · 1825 阅读 · 0 评论