MyBatis执行原理图】的更多相关文章

作者:W&L 推荐: 陶邦仁的博客 (1)加载配置并初始化       触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置.执行的SQL语句.结果映射配置),存储在内存中. (2)接收调用请求       触发条件:调用Mybatis提供的API       传入参数:为SQL的ID和传入参数对象 处理过程:将请求传递给下层的请求处理层进行处理.  (3)处理操作请求 触…
Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话,很简单,组织 update table set column='...' where id in (1,2,3)l 这样的sql就可以了.Mybatis中这样写就行 <update id="batchUpdateStudentWithMap" parameterType="…
前面几篇博客我们介绍了Excutor及抽象类BaseExecutor和实现类SimpleExecutor.BatchExecutor和ReuseExecutor: 博客列表: Mybatis执行Executor(一) Mybatis执行BaseExecutor(二) Mybatis执行SimpleExecutor(三) Mybatis执行BatchExecutor(四) Mybatis执行ReuseExecutor(五) 接下来我们再介绍一个比较重要的类CachingExecutor,通过类名我…
一图看懂mybatis执行过程,不再懵B了…
今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction 最后发现: 1.实体在前面 是使用JPA查询得出的 2.在后面update的时候,是使用mybatis去做update的 这就导致了前面的锁还没有释放,后面update的时候 就在等待锁的释放. 虽然myb…
1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql使用下面的语句 jdbcUrl=jdbc:mysql://xx.xx.xx:3306/xxxxx?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true…
Mybatis执行流程 mybatis中xml解析是通过SqlSessionFactoryBuilder.build()方法. 初始化mybatis(解析xml文件构建成Configuration对象)并初始化SqlSessionFactory对象 在解析xml时会同时根据其中节点做相应的初始化操作 关键节点:  settings.typeAliases.mappers 通过SqlSesssionFactory.openSession()方法打开一个SqlSession对象 SqlSession…
mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.xml.pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上. 企业实际开发中,常用的逆向工程方式:由数据库的表生成java代码. 之所以强调单表两个字,是因为Mybatis逆向工程生成的Mapper所进行的操作都是针对单表的,也许你可能会觉得那这就有点鸡肋了,但是在大型项目中,很少有复杂的多表关联查询,所以作用还是很大的.…
mappper 配置文件  头文件: 1.   <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">  之前三者写的不一致,有什么config的导致,错误 2.  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://my…
目录 一.mybatis极简示例 1.1 创建mybatis配置文件 1.2 创建数据库表 1.3 创建javabean 1.4 创建mapper映射文件 1.5 运行测试 二.mybatis的几大“组件” 2.1 SqlSessionFactoryBuilder 2.2 SqlSessionFactory 2.3 SqlSession 2.4 Executor 2.5 StatementHandler 2.6 ParameterHandler 2.7 ResultSetHandler 2.8…
首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之70的面试问题和开发中遇到的困惑,此乃重中之重 假如我们要自己设计一个半自动的仿Mybatis框架,有哪些环节是必不可少的呢?思考再三,必然有以下环节: 相关配置文件加载(XML类型,接口类型则可以省略) 接口代理(JDK 动态代理) 针对XML或者接口进行解析 ==>即把不可直接执行的SQL处理为…
Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动态代理,所有调用userMapper的方法,最终都会代理到MapperProxy的invoke方法上,我们这次就来看看mybatis具体的执行流程.为了简单易懂,本次的示例用的是最简单的查询语句且不包含事务. 本篇文档的源码路径https://github.com/wbo112/blogdemo/t…
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用域:方法作用域(局部变量) ] (2)SqlSessionFactory(类似连接池) [ 生命周期:一旦被创建就应该在应用的运行期间一直存在,作用域:应用作用域变量(使 用单例模式/静态单例模式) ] (3)SqlSession(类似连接对象) [ 特点:非线程安全,不能共享,作用域:请求或方法作…
存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的存储过程,我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号 CREATE OR REPLACE Procedure cascadeoperation As Begin ; ; End; 这里执行了2个操作,可能用过mybatis的人会迷惑执行的时候到底使用update标签呢还是d…
转载自:http://blog.csdn.net/hfmbook/article/details/41985853 比较适用于在分页时候进行拦截.对分页的SQL语句通过封装处理,处理成不同的分页sql. 实用性比较强. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Lis…
这个问题竟然纠结了半个小时! 就问题而言,肯定是出在mybatis中 终于,找到了答案, 原来是DataSource配置问题, 我将配置连接池的数据写到了文件db.properties中, SqlMapConfig.xml中引用db.properties配置 经过几轮测试,后来又将url重新自己配置到SqlMapConfig.xml中,SQL语句执行成功!…
[前言] 对MyBatis一直停留在仅仅会用的阶段,常用的场景就是通过MyBatis对表数据进行DML(insert, delete, update等)操作,从来没有想过通过MyBatis对数据库 进行DDL(create, alter, drop)操作,最近的项目需要利用MyBatis对数据库进行DDL操作,自己就尝试了一把,对MyBatis又多了点儿了解. [具体代码] 1.mapper接口文件内容如下. /** * 执行备份数据库相关表的Mapper */ public interface…
研究了一天mybatis如何执行存储过程,基本了解了ORM的设计思想,在map层面进行对象关系映射有两种思路. 根据不同的业务使用不同的思路: 一.实体类和数据库映射,就是将数据库中的字段和java实体类中的对象对应起来,这是最普遍的做法. 就是这个样子: <resultMap id="BaseResultMap" type="com.kt.model.Funeral" > <id column="applyid" proper…
背景: 在我日常码代码的时候,由于对mybatis的动态sql,比较依赖,并且有时候需求复杂,导致sql较长,而且参数众多,当出现问题是,需要将sql,放到navicat里面去执行查看结果,但是对于复杂的sql来说,众多的参数,一个一个替换.当真很麻烦,于是萌生出可不可以将sql直接输出,不在出线sql和参数分开的情况,可以减少很多麻烦,在我找度娘,一次又一次的尝试,我还是没有发现,在log4j的配置文件里面.有这个功能,所以最后萌生出改写源码的想法,之后我也会尝试继续寻找,有没有官方的API提…
数据库:Mysql 在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下. 结论: insert:   插入n条记录,返回影响行数n.(n>=1,n为0时实际为插入失败) update:更新n条记录,返回影响行数n.(n>=0) delete: 删除n条记录,返回影响行数n.(n>=0) 验证: 插入多条数据,mysql中可以使用如下sql: insert into bill (TX_TYP,REMARK,NO) VALUES (?,?,?) , (?,?,?) , (…
一般在测试myBatis运行正常,但数据库数据不变时,有可能是SQL语句有问题,检查SQL语句没问题,但数据库依然没变,就说明myBatis方法执行后并未提交到数据库,可尝试在测试类添加   session.commit(); 可正常运行. public class AppTest { SqlSession session = null; Reader reader=null; @Beforepublic void init()throws IOException { Reader reader…
mybatis 简介 开源的持久层框架:代码简洁,写sql,性能还可以.容易掌握 执行图 文字说明 先创建核心配置文件(sqlMapConfig.xml) 再创建映射文件(可以有多个 ~ 通常有多少张表就有多少) 通过对象SqlSessionFactory对象来创建 通过SqlSessionFactory来返回sqlSession接口(他并不是执行,只是负责调用) 通过调用返回一个excutor(执行器)(真正使用) 通过excutor(执行器)来包装MappedStatement 通过Mapp…
<!--keyColumn keyProperty useGeneratedKeys 用于在插入数据后,能直接使用user.getId()获取主键--> <insert id="insert" keyColumn="Id" keyProperty="id" parameterType="com.chinacarbonal.carboncms.bean.UserRole" useGeneratedKeys=&q…
1. getById 的执行 前面一篇 提到过, Mapper.java 创建的时候, 会通过 jdk 代理的方式来创建, 且代理处理类为: MapperProxy . 所以当执行 UserMapper 的 getById 方法的时候, 就会去 MapperProxy 中执行 invoke 方法. //MapperProxy.java @Override public Object invoke(Object proxy, Method method, Object[] args) throws…
一切的执行从MapperProxy开始,MapperProxy是MapperProxyFactory使用SqlSession创建出来的.所以MapperProxy中包含SqlSession. 可以看到MapperProxy调用invoke方法,进而调用MapperMethod的execute(),这些MapperMethod就是和你要执行的命令相关,比如执行select语句,则会通过SqlSession的select()方法,最终调用到Executor的query方法.Executor会再协调另…
前篇:Mybatis初始化过程 SqlSession : SqlSession是一个接口,它有两个实现类:DefaultSqlSession (默认)和 SqlSessionManager (弃用,不做介绍) SqlSession是MyBatis中用于和数据库交互的顶层类,通常将它与ThreadLocal绑定,一个会话使用一 个 SqlSession,并且在使用完毕后需要close (SqlSession是线程不安全的,因此我们使用完后要记得close) public class Default…
我使用springMVC集成mybatis,执行SQLMapper配置文件里的insert操作,发现程序没有报错,但数据库表里却没有刚才插入的记录.查了很多资料,终于在一篇博客上找到了答案:在执行完方法后,必须有 session.commit();这句话进行事务提交.因为在做Insert  Update  Delete的时候,会先开启事务,而Mybatis不会自动提交(或许可以设置,我还不知道),所以,必须手动提交事务.于是我才调用包含insert操作的方法之后添加session.commit(…
Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的雏形,在此对学习过程做一个记录首先,我们新建一个提供mybatis框架功能的工程IMybatis,这个工程中主要完成mybatis整个初始化和执行过程的功能开发. 该工程中用到的依赖 <?xml version="1.0" encoding="UTF-8"?>…
ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map<String, Statement>,将执行的sql作为key,将执行的Statement作为value保存,这样执行相同的sql时就可以使用已经存在的Statement,就不需要新创建了,源码及分析如下: /** * @author Clinton Begin */ public class ReuseExecutor extends BaseExecutor { private final Map<String,…
BatchExecutor:顾名思义就是进行批量操作,通过批量操作来提高性能 public class BatchExecutor extends BaseExecutor { public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002; /* Statement链表**/ private final List<Statement> statementList = new ArrayList<S…