myBatis入门及源码学习
军伟@
Java开发工程师
展开
-
mybtais-plus学习--BaseMapper提供的方法及SQL语句生成
这篇博客我们介绍一下关于Mybatis-Plus相关的知识,Mybatis-Plus可以简单的理解为Mybatis的加强,其在Mybatis的基础上完成了一些封装,这样开发人员在使用起来就很容易和方便(确实是一个很好的框架),官网Mybatis-Plus优点 | Advantages无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入...原创 2018-08-18 18:44:59 · 84869 阅读 · 3 评论 -
Mybatis源码之Statement处理器SimpleStatementHandler(四)
SimpleStatementHandler就是使用基本的Statement来执行query、batch、update等操作,其实现还是比较简单的,当然在执行过程中会涉及keyGenerator和ResultHandler操作,这些我们会在接下来的博客中进行详解。SimpleStatementHandler用于执行简单的sql语句,这里简单的sql语句是指sql语句中没有变量,不会通过外部进行参数原创 2016-09-24 22:33:42 · 1973 阅读 · 0 评论 -
Mybatis接口编程原理分析(一)
Mybatis接口编程示例(1)首先定义接口编程需要的接口及其方法public interface IUserMapper { public User getById(int id);//接口方法,不需要实现}(2)创建mybatis的mapper文件,其中namespace的值为接口的完整类名//接口完整类名 <select id="getById" paramet原创 2016-09-18 20:15:21 · 3052 阅读 · 1 评论 -
Mybatis源码分析之结果封装ResultSetHandler和DefaultResultSetHandler
ResultSetHandler负责处理两件事:(1)处理Statement执行后产生的结果集,生成结果列表(2)处理存储过程执行后的输出参数ResultSetHandler是一个接口,提供了两个函数分别用来处理普通操作和存储过程的结果,源码如下:/** * @author Clinton Begin */public interface ResultSetHandler原创 2016-09-29 18:22:07 · 12064 阅读 · 4 评论 -
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主键生成器SelectKeyGenerator(三)
前面两篇博客我们介绍了MyBatis主键生成器KeyGenerator(一)和MyBatis主键生成器Jdbc3KeyGenerator(二),接下来我们介绍SelectKeyGenerator,如在Oraclee中并不提供自增组件,提供了Sequence主键,我们就需要执行它的Sequence主键,如在mysql中如下配置: SELECT LAST_INSERT_ID() AS原创 2016-09-26 21:48:11 · 6829 阅读 · 0 评论 -
MyBatis主键生成器Jdbc3KeyGenerator(二)
上一篇博客MyBatis主键生成器KeyGenerator(一)中我们大体介绍了主键生成器的接口及配置等,接下来我们介绍一下KeyGenerator的实现类Jdbc3KeyGeneratorJdbc3KeyGenerator实际上实现了processAfter方法,其使用方法如下配置,目的是将主键作为返回值返回,这种用法只能是在有自增主键的数据库中使用: insert into tb原创 2016-09-26 21:46:27 · 5586 阅读 · 8 评论 -
MyBatis主键生成器KeyGenerator(一)
Mybatis提供了主键生成器接口KeyGenerator,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 。由于不同的数据库对主键的生成不一样:(1)针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle、DB2,KeyGenerator提供了proce原创 2016-09-26 21:45:27 · 27384 阅读 · 3 评论 -
Mybatis源码之(TypeAliasRegistry)TypeAlias别名实现机制
在Mybatis编程中我们经常会用到将某个bean作为参数类型parameterType或者结果返回值类型ResultType,所以很多时候我们需要把完成的Bean的包名在mapper文件中写上,如下: select * from Teacher where c_id=#{id} Mybatis给我们提供了一种叫别名的机制,意思就是对某个具体的类设置别名,在mybati原创 2016-09-21 21:04:14 · 6400 阅读 · 0 评论 -
Mybatis源码之Statement处理器CallableStatementHandler(六)
CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程。源码如下:/** * @author Clinton Begin *//***/public class CallableStatementHandler extends BaseStatementHandler { public Calla原创 2016-09-24 22:34:51 · 3010 阅读 · 0 评论 -
Mybatis源码之Statement处理器PreparedStatementHandler(五)
PreparedStatementHandler就是调用PreparedStatement来执行SQL语句,这样在第一次执行sql语句时会进行预编译,在接下来执行相同的SQL语句时会提高数据库性能源码如下:/** * @author Clinton Begin *//* 使用PrepareStatement**/public class PreparedStatementHandl原创 2016-09-24 22:34:19 · 4694 阅读 · 0 评论 -
Mybatis源码之Statement处理器RoutingStatementHandler(三)
RoutingStatementHandler类似路由器,在其构造函数中会根据Mapper文件中设置的StatementType来选择使用SimpleStatementHandler、PreparedStatementHandler和CallableStatementHandler,其实现的接口StatementHandler的方法也是由这三个具体实现类来实现。源码如下:/** * @a原创 2016-09-24 22:32:41 · 5956 阅读 · 2 评论 -
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源码分析之参数映射及处理ParameterHandler
ParameterHandler是用来设置参数规则的,当StatementHandler调用prepare方法之后,接下来就是调用它来进行设置参数。ParameterHandler接口:public interface ParameterHandler { Object getParameterObject(); void setParameters(PreparedStatement原创 2016-12-15 19:14:38 · 3900 阅读 · 1 评论 -
Mybatis源码学习之TypeHandler
ORM框架最重要功能是将面向对象方法中的对象和关系型数据库中的表关联了起来,在关联过程中就必然涉及到对象中的数据类型和数据库中的表字段类型的转换,Mybatis中的org.apache.ibatis.type包主要就是实现这个功能。TypeHandler的功能就是给参数设置指定的jdbc类型和返回对应的java类型的数据。接口、抽象类和实现类的结构体系:接口TypeHandler中定义如下方法:主原创 2016-12-15 19:37:14 · 7052 阅读 · 0 评论 -
mybatis-plus学习--ActiveRecord实现原理探究
在Mybatis-Plus中提供了ActiveRecord的模式,支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作,简单来说就是一个实体类继承Model类,并通过注解与数据库的表名进行关联,这样就可以通过实体类直接进行表的简单增删改查操作,这样也确实极大的方便了开发人员。原理理解: 简单来说Mybatis-plu...原创 2018-08-19 11:43:41 · 20536 阅读 · 3 评论 -
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 评论 -
Mybatis逻辑分页原理解析RowBounds
物理分页Mybatis插件原理分析(三)分页插件Mybatis提供了一个简单的逻辑分页使用类RowBounds(物理分页当然就是我们在sql语句中指定limit和offset值),在DefaultSqlSession提供的某些查询接口中我们可以看到RowBounds是作为参数用来进行分页的,如下接口: public <E> List<E> selectLis...原创 2019-02-26 10:22:46 · 72525 阅读 · 2 评论 -
Mybatis事务(一)事务管理方式
Mybatis管理事务是分为两种方式:(1)使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交(2)使用MANAGED的事务管理机制,这种机制mybatis自身不会去实现事务管理,而是让程序的容器(JBOSS,WebLogic)来实现对事务的管理在Mybatis的配置文件中可以配置事务管理方式如下:原创 2016-09-20 21:06:20 · 42802 阅读 · 0 评论 -
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 评论 -
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 · 11562 阅读 · 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 · 6632 阅读 · 1 评论 -
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源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理。其实简单来说Mybatis的延迟加载就是分多次执行SQL语句,这样就实现了延迟加载的机制,并且第一次执行的结果值可能是接下来执行的SQL语句的参数值,Mybatis实现执行接下来的SQL的原理机制是通过代理类来实现的,就是原创 2017-01-03 20:53:49 · 3013 阅读 · 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源码之Statement处理器StatementHandler(一)
StatementHandler通过类名我们可以了解到它可能是Statement的处理器,它是一个接口,其实现类如下:BaseStatementHandler:一个抽象类,只是实现了一些不涉及具体操作的方法RoutingStatementHandler:类似路由器,根据配置文件来路由选择具体实现类SimpleStatementHandler、CallableStatementHan原创 2016-09-24 22:31:36 · 3940 阅读 · 0 评论 -
Mybatis事务(二)事务隔离级别
一般数据库的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。√: 可能出现 ×: 不会出现脏读不可重复读幻读说明Read原创 2016-09-20 21:23:29 · 18081 阅读 · 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源码学习之SqlSession
/** * @author Clinton Begin */public class DefaultSqlSession implements SqlSession { private Configuration configuration; //配置文件生成的对象 private Executor executor;//执行器 private boolean autoCom原创 2015-12-30 20:07:22 · 5094 阅读 · 0 评论 -
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 评论 -
mybati源码之ReuseExecutor
/** * @author Clinton Begin */public class ReuseExecutor extends BaseExecutor { private final Map statementMap = new HashMap(); public ReuseExecutor(Configuration configuration, Transaction t原创 2016-01-13 21:04:59 · 1044 阅读 · 0 评论 -
Mybatis源码之SimpleExecutor
/** * @author Clinton Begin */public class SimpleExecutor extends BaseExecutor { public SimpleExecutor(Configuration configuration, Transaction transaction) { super(configuration, transactio原创 2016-01-13 21:03:53 · 1697 阅读 · 0 评论 -
Mybatis 源码之Plugin类解析
public class Plugin implements InvocationHandler { private Object target; //目标对象 private Interceptor interceptor;//拦截器对象 private Map, Set> signatureMap;//目标对象方法签名 private Plugin(Object targe原创 2016-01-13 20:21:00 · 1302 阅读 · 1 评论 -
mybatis源码之SimpleStatementHandler
/** * @author Clinton Begin */public class SimpleStatementHandler extends BaseStatementHandler { public SimpleStatementHandler(Executor executor, MappedStatement mappedStatement, Object paramete原创 2016-01-07 20:13:16 · 1189 阅读 · 0 评论 -
Mybatis源码之RoutingStatementHandler
/** * @author Clinton Begin */public class RoutingStatementHandler implements StatementHandler { private final StatementHandler delegate; public RoutingStatementHandler(Executor executor, Map原创 2016-01-07 20:12:30 · 2313 阅读 · 0 评论 -
mybatis源码之PreparedStatementHandler
/** * @author Clinton Begin */public class PreparedStatementHandler extends BaseStatementHandler { public PreparedStatementHandler(Executor executor, MappedStatement mappedStatement, Object para原创 2016-01-07 20:11:42 · 2173 阅读 · 0 评论