1、Mybatis的作用

Mybatis的主要作用可以用下面的一段代码解释

  1. Class.forName("com.mysql.jdbc.Driver");
  2. Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");
  3. String sql = "select * from tab_user where id= ?";
  4. // prepare sql
  5. PreparedStatement pstmt = connection.prepareStatement(sql);
  6. // set parameter
  7. pstmt.setInt(1, 18);
  8. ResultSet rs = pstmt.executeQuery();
  9. User user = null;
  10. // extract resultset
  11. while (rs.next()) {
  12. user = new User(rs.getInt("id"), rs.getString("name"));
  13. System.out.println(user);
  14. }
  15. // release resource
  16. rs.close();
  17. pstmt.close();
  18. connection.close();

2、Mybatis的demo

Mysql数据库创建表tab_user

  1. CREATE TABLE `tab_user` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(100) NOT NULL,
  4. `birthday` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  5. PRIMARY KEY (`id`)
  6. );
  7. INSERT INTO `tab_user` VALUES ('18', 'jack', '2017-01-24 22:15:03');

新建demo工程在classpath下新建config/mybatis-config.xml配置文件和config/mapper/UserMapper.xml映射文件

mybatis-config.xml文件内容

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC" />
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver" />
  11. <property name="url" value="jdbc:mysql://127.0.0.1:3306/test" />
  12. <property name="username" value="root" />
  13. <property name="password" value="root" />
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="config/mapper/UserMapper.xml" />
  19. </mappers>
  20. </configuration>

UserMapper.xml文件内容

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="UserMapper">
  6. <select id="selectUser" parameterType="int" resultType="com.fit.bean.User">
  7. select * from tab_user where id = #{id}
  8. </select>
  9. </mapper>

Java代码(引入依赖jar包:mysql-connector.jar和mybatis-3.3.x.jar)

  1. SqlSession sqlSession = null;
  2. try {
  3. String resource = "config/mybatis-config.xml";
  4. InputStream inputStream = Resources.getResourceAsStream(resource);
  5. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //start
  6. sqlSession = sqlSessionFactory.openSession();
  7. User user = sqlSession.selectOne("UserMapper.selectUser", 18); //query db
  8. System.out.println(user);
  9. user = sqlSession.selectOne("UserMapper.selectUser", 18);
  10. System.out.println(user);
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. } finally {
  14. if (sqlSession != null)
  15. sqlSession.close(); //release resource
  16. }

实体类User.java

  1. import java.io.Serializable;
  2. public class User implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private int id;
  5. private String name;
  6. public User() {
  7. super();
  8. }
  9. public User(int id, String name) {
  10. super();
  11. this.id = id;
  12. this.name = name;
  13. }
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. @Override
  27. public String toString() {
  28. return "{id=" + id + ", name=" + name + "}";
  29. }
  30. }

demo工程结构

正常情况下就可以输出一个user对象信息

3、Mybatis执行过程分析

3.1启动

  1. String resource = "config/mybatis-config.xml";
  2. InputStream inputStream = Resources.getResourceAsStream(resource);
  3. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

上面的demo可以看出实现过程是先读取mybatis配置文件,通过SqlSessionFactoryBuilder基于文件输入流创建SqlSessionFactory。

具体实现过程:

SqlSessionFactoryBuiler的build(inputStream)最终调用了下面的方法

  1. public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
  2. try {
  3. XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
  4. return build(parser.parse());
  5. } catch (Exception e) {
  6. throw ExceptionFactory.wrapException("Error building SqlSession.", e);
  7. } finally {
  8. ErrorContext.instance().reset();
  9. try {
  10. inputStream.close();
  11. } catch (IOException e) {
  12. // Intentionally ignore. Prefer previous error.
  13. }
  14. }
  15. }

XMLConfigBuilder的parse()方法主要就是解析mybatis-config.xml,通过configuraton根节点具体解析的属性如下

  1. private void parseConfiguration(XNode root) {
  2. try {
  3. //issue #117 read properties first
  4. propertiesElement(root.evalNode("properties"));
  5. Properties settings = settingsAsProperties(root.evalNode("settings"));
  6. loadCustomVfs(settings);
  7. typeAliasesElement(root.evalNode("typeAliases"));
  8. pluginElement(root.evalNode("plugins"));
  9. objectFactoryElement(root.evalNode("objectFactory"));
  10. objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
  11. reflectionFactoryElement(root.evalNode("reflectionFactory"));
  12. settingsElement(settings);
  13. // read it after objectFactory and objectWrapperFactory issue #631
  14. environmentsElement(root.evalNode("environments"));
  15. databaseIdProviderElement(root.evalNode("databaseIdProvider"));
  16. typeHandlerElement(root.evalNode("typeHandlers"));
  17. mapperElement(root.evalNode("mappers"));
  18. } catch (Exception e) {
  19. throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  20. }
  21. }

根据配置文件生成Configuration对象,这个对象非常重要,是全局的配置信息,其中比较重要的包括根据plugin标签配置生成用户配置的自定义插件(比如用户可以实现mysql分页插件)、全局的setting属性配置(二级缓存配置等)、mapper映射文件信息读取。

最后用生成的configuration对象生成DefaultSqlSessionFactory对象

  1. public SqlSessionFactory build(Configuration config) {
  2. return new DefaultSqlSessionFactory(config);
  3. }

3.2执行增删改查

  1. sqlSession = sqlSessionFactory.openSession();
  2. User user = sqlSession.selectOne("UserMapper.selectUser", 18);

通过3.1已经获取了SqlSessionFactory,通过SqlSessionFactory创建SqlSession,Mybatis对数据库的操作主要也就是由SqlSession接口定义,由DefaultSqlSession实现。

首先看一下SqlSession接口的定义(定义了增删改查等基本数据库操作和一些事务的操作)

//TODO:解析sql文件、根据入参赋值预编译sql、处理结果集

3.3释放资源

    1. sqlSession.close();

Mybatis的执行过程的更多相关文章

  1. mybatis源码分析(五)------------SQL的执行过程

    在对SQL的执行过程进行分析前,先看下测试demo: /** * @author chenyk * @date 2018年8月20日 */ public class GoodsDaoTest { pr ...

  2. MyBatis 源码分析 - SQL 的执行过程

    * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...

  3. 一图看懂mybatis执行过程

    一图看懂mybatis执行过程,不再懵B了

  4. Mybatis拦截器执行过程解析

    上一篇文章 Mybatis拦截器之数据加密解密 介绍了 Mybatis 拦截器的简单使用,这篇文章将透彻的分析 Mybatis 是怎样发现拦截器以及调用拦截器的 intercept 方法的 小伙伴先按 ...

  5. mybatis源码学习(二):SQL的执行过程

    从上一篇文章中,我们了解到MapperMethod将SQL的执行交给了sqlsession处理.今天我们继续往下看处理的过程. SqlSession接口除了提供获取Configuration,Mapp ...

  6. 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  7. 精尽MyBatis源码分析 - SQL执行过程(二)之 StatementHandler

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  8. 精尽MyBatis源码分析 - SQL执行过程(三)之 ResultSetHandler

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  9. 精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

随机推荐

  1. Activiti工作流引擎数据库表结构

    Activiti工作流引擎数据库表结构 一.数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. ACT_RE_ ...

  2. 照着官网来安装openstack pike之glance安装

    镜像服务image service(glance)的安装还是在控制节点上进行: 1.前提条件,数据库为glance创建库和账户密码来连接数据库 # mysql -u root -p MariaDB [ ...

  3. 20145328 《Java程序设计》第3周学习总结

    20145328 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 对象Object:存在的具体实体,具有明确的状态和行为 类Class:具有相同属性和行为的一组对象的集合,用 ...

  4. MR案例:小文件处理方案

    HDFS被设计来存储大文件,而有时候会有大量的小文件生成,造成NameNode资源的浪费,同时也影响MapReduce的处理效率.有哪些方案可以合并这些小文件,或者提高处理小文件的效率呢? 1). 所 ...

  5. nfs报错 - No route to host

    nfs报错 - No route to host ______________________________ 因为防火墙阻止的原因. 解决方法:服务器rhel7系统下,打开firewall-conf ...

  6. 多线程资源隔离之ThreadLocal

    上篇讲到多线程线程安全问题的解决思路,这篇将详细讲解资源隔离ThreadLocal的实践. ThreadLocal也叫线程局部变量,类似Map结构,以当前线程为key.既然是以资源隔离的思想保证线程安 ...

  7. Elasticsearch之几个重要的分词器

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

  8. vue编译环境和线上环境url切换

    新建一个配置js,导入到接口请求管理类,可以自动根据环境切换if (process.env.NODE_ENV == 'development') { baseUrl = ''; }else{ base ...

  9. mysql 索引相关问题

    mysql中key .primary key .unique key 与index区别 https://blog.csdn.net/nanamasuda/article/details/5254317 ...

  10. 用gitolite搭建git server

    在Ubuntu上测试安装一下git server,为后面项目的代码管理做准备.记录流水账如下, 中间关于git 命令的使用说明不做过多解释,需要了解的请google或者直接git help: 我用到了 ...