Mybatis源码学习
itw_zhangzx02
这个作者很懒,什么都没留下…
展开
-
MyBatis源码的学习(1)---mybatis源码的下载和学习
安装的mysql为5.7.28版本;需要修改时区和sql-mode。mysq的配置文件内容如下:其中后面的三个参数必须加上,不然会出问题。[mysql]# 设置mysql客户端默认字符集default-character-set=utf8 [mysqld]# 设置3306端口port = 3306 # 设置mysql的安装目录basedir=C:\Program Files...原创 2019-12-12 15:08:25 · 148 阅读 · 0 评论 -
myBatis3.1.0升级遇到的一个BUG
mybatis3.1升级可能遇到的BUG原创 2022-03-10 18:24:42 · 867 阅读 · 0 评论 -
MyBatis源码的学习(23)---阶段性总结
按功能模块分:sql解析阶段sql执行阶段先看解析阶段@BeforeAllstatic void initDatabase() throws Exception { try (Reader reader = Resources.getResourceAsReader("mybatis-config.xml")) { sqlSessionFactory = new SqlS...原创 2020-01-12 19:17:36 · 149 阅读 · 0 评论 -
MyBatis源码的学习(22)---关于#和$的区别,简单类型$中只能用value吗??
最近在整理mybatis中关于#和$的区别的时候,其中看到网上有一条是:${}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。上面加黑的部分,经过测试,不管是$还是#,单个参数...原创 2020-01-08 11:04:44 · 440 阅读 · 0 评论 -
MyBatis源码的学习(21)---mybatis中当参数只有一个且是自定义对象类型时提示reflection.ReflectionException: There is no getter
Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'user' in 'class learn.User'### Cause: org.apache.ibatis.reflection.Reflectio...原创 2020-01-06 20:36:56 · 407 阅读 · 0 评论 -
SpringBoot整合mybatis-plus的使用---提示未绑定默认接口中的抽象方法的解决和源码分析
示例代码,仿照官网写的。在自己写的demo中,遇到一个问题:提示方法绑定不了org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.itw.zhangzx.mybatisPlus.mapper.UserMapper.selectList解决方法:在我们继承的Base...原创 2020-01-05 21:04:05 · 895 阅读 · 0 评论 -
MyBatis源码的学习(20)---如何从jdbc到mybatis?
mybatis源码解读,基本简单的流程已经解析的差不多了,这里做个总结:从架构的角度,分析下如何把jdbc封装成myBatis的。原生的jdbc代码步骤:1.获取连接(连接信息等可以从配置文件中获取)2.sql3.创建statement对象4.设置参数5.执行statement6.结果集映射为java类型7.释放资源从架构的角度看问题:首先,连接信息需要的驱...原创 2020-01-04 20:42:35 · 179 阅读 · 0 评论 -
MyBatis源码的学习(19)---如何将jdbc的返回结果resultSet处理为我们想要的java类型
处理结果集的逻辑:ResultSetHandler---->TypeHandler @Override public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boun...原创 2020-01-04 14:40:03 · 1019 阅读 · 0 评论 -
MyBatis源码的学习(18)---如何对statement对象进行参数赋值操作的?
前面说过,我们建立连接,创建statement对象,接下来我们看看如何进行赋值操作private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { Statement stmt; Connection connection = getConn...原创 2019-12-31 10:48:21 · 826 阅读 · 0 评论 -
MyBatis源码的学习(17)---如何使用JDK动态代理进行日志记录的织入
在学习Spring的时候,我们经常说到AOP。然后举例的时候,经常会说,比如日志切面的切入,将日志功能织入到主体功能中,进行日志记录。今天,我们看一下MyBatis中使用动态代理织入记录日志的功能。// SimpleExecutor类 @Override public <E> List<E> doQuery(MappedStatement ms, Object ...原创 2019-12-31 10:29:52 · 209 阅读 · 0 评论 -
MyBatis源码的学习(16)---拦截器为何不能拦截Executor中6个参数的query方法
今天,配置了一个MyBatis拦截器如下:package learn.interceptors;import org.apache.ibatis.cache.CacheKey;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.BoundSql;import org.apache.i...原创 2019-12-30 15:41:42 · 2395 阅读 · 1 评论 -
MyBatis源码的学习(15)---sqlSession.selectList方法
sqlSession一共俩个实现类,我们这里分析默认的DefaultSqlSession类public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { try { //ms对象代表我们的xml中的一条sql。例如:<select...原创 2019-12-29 22:18:09 · 7002 阅读 · 1 评论 -
MyBatis源码的学习(14)---SqlSource和SqlNode
sqlSource接口中最底层的,最基础的是: StaticSqlSource,里面sql字段用于存放解析好的sql,比如将'#{}'替换为“?”占位符BoundSql getBoundSql(Object parameterObject);RawSqlSource--.>StaticSqlSource-- >sql常规的解析Mapper.xml的时候,我们创建S...原创 2019-12-29 10:38:04 · 655 阅读 · 0 评论 -
MyBatis源码的学习(13)---Mybatis是如何构建sql的?
统一的一个接口:sqlSource俩个实现类:1.RawSqlSource 解析:select * from user where name = #{name}属性字段 sqlSource --StaticSqlSource类型的StaticSqlSource进行将'#{}'替换为 ?占位符StaticSqlSource中的属性字段sql用于存储解析后的sql select ...原创 2019-12-27 21:50:40 · 351 阅读 · 0 评论 -
MyBatis源码的学习(12)---Mybatis是如何从Mapper.xml中的select到sqlSession.selectList的?
这个问题:估计大家都知道是动态代理。可是除了动态代理这之间还有哪些设计模式呢? //3、获取mapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //4、执行数据库操作,并处理结果集 return userMapper.selectUser("10");先看我们的getM...原创 2019-12-26 22:54:19 · 487 阅读 · 0 评论 -
MyBatis源码的学习(11)---Mybatis二级缓存默认LRU算法的分析
首先说结论,百度Mybatis的lru算法时,都说的是,活跃的节点放到了头部,如果容量满了,会先剔除掉尾节点。这个说法是不对的,在MyBatis中的lruCache中,不活跃的节点是头节点,这个节点会被剔除掉,每次我们的get和put操作时,会把活跃的节点放到尾部。为了方便研究问题,我们先修改源码,将LruCache的容量改小点:size改为5.public class LruCache...原创 2019-12-21 13:00:36 · 522 阅读 · 0 评论 -
MyBatis源码的学习(10)---高版本的Mapper.XML中为何不能使用#{0},#{1}操作?
public void updateName(@Param("name") String name , @Param("id")String id);XML中获取参数: <update id="updateName" parameterType="String" > update u_user set username = #{name} where userco...原创 2019-12-18 20:08:01 · 766 阅读 · 0 评论 -
MyBatis源码的学习(9)---映射器mappers的的XML解析
来自官方文档解析的方式如下:<!-- 使用相对于类路径的资源引用 --><mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <...原创 2019-12-18 09:23:47 · 160 阅读 · 0 评论 -
MyBatis源码的学习(8)---Executor执行器的的创建
/*** 来自DefaultSqlSessionFactory类。*/@Override public SqlSession openSession(boolean autoCommit) { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit...原创 2019-12-19 19:12:26 · 139 阅读 · 0 评论 -
MyBatis源码的学习(7)---MappedStatement的的创建
SqlSessionFactoryBuilder--->XMLConfigBuilder---> XMLMapperBuilder---(桥梁)MapperBuilderAssistant--->XMLStatementBuilder(parseStatementNode方法)--(桥梁)MapperBuilderAssistant(addMappedStatemen...原创 2019-12-16 12:06:08 · 454 阅读 · 0 评论 -
MyBatis源码的学习(6)---二级缓存默认是关闭的?
以前,没有看源码,一直印象中记得二级缓存是关闭的。最近看了源码才发现,原来二级缓存总开关默认是开了,只是使用时需要加一定条件的。先说结论,要想某个Mapper.xml使用到二级缓存,只需要在<mapper>标签下加一个<cache/>标签就可以了,总配置里的开关cacheEnabled默认是true,二级缓存是在使用CachingExecutor执行器进行查询时,使用的...原创 2019-12-15 23:54:57 · 2197 阅读 · 2 评论 -
MyBatis源码的学习()---关于UML常见的类图关系
上面是MyBatis中的一个适配器设计模式的类图。好多东西总是忘记,所以专门记录一下。依赖关系:依赖(dependency),在代码中,某个类的方法通过局部变量,方法参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些任务.比如:我们的PlainMethodInvoker类中的invoke方法@Override public Object invoke...原创 2019-12-14 22:37:02 · 809 阅读 · 0 评论 -
MyBatis源码的学习(5)---设计模式的使用
前面,在分析源码的时候,看到了好几个设计模式的使用,在这里记录一下。Builder模式 例如 SqlSessionFactoryBuilder工厂模式 例如SqlSessionFactory、MapperProxyFactory;装饰者模式例如 Executor执行器 接口下的CachingExecutor对我们常说的三种执行器的装饰动态代理模式例如我们的Mapp...原创 2019-12-14 20:47:23 · 100 阅读 · 0 评论 -
MyBatis源码的学习(4)---MapperProxy的invoke方法
public Object execute(SqlSession sqlSession, Object[] args) { Object result; switch (command.getType()) { case INSERT: { Object param = method.convertArgsToSqlCommandParam(...原创 2019-12-14 14:38:08 · 1216 阅读 · 0 评论 -
MyBatis源码的学习(2)---学习MyBatis中JAVA8新特性的使用
MyBatis的版本是: 3.5.4-SNAPSHOT断点看从sqlSession中获取mapper对象。我们知道,MyBatis使用的Java动态代理为接口(UserMapper)生成代理类。简单说下:我们加载MaBatis的xml配置文件和Mapper文件,会生成一个configuration 对象。这里对象里面有一个MapperRegistry类型...原创 2019-12-13 17:27:37 · 293 阅读 · 0 评论 -
MyBatis源码的学习(3)---MapperMethod是什么?
今天主要讲MapperMethod类。public class MapperMethod { // sql命令对象,也就是解析sql语句用,对应我们的xml中的sql语句 private final SqlCommand command; //方法签名 对应我们定义在接口中方法,比如 :public User selectUser(String id); private ...原创 2019-12-13 23:55:58 · 566 阅读 · 0 评论