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. mybatis家族

    mybatis 优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射. 备注:通过mapper实现数据库与实体类相互映射 MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果 ...

  2. 20145312 《Java程序设计》第四周学习总结

    20145312 <Java程序设计>第四周学习总结 学习笔记 Chapter 6 6.1何为继承 1.定义:面向对象中子类继承父类,避免重复的行为定义. 6.1.1 继承共同行为 1.以 ...

  3. 简单的Sqlite使用方法

    Sqlite的作用不言而喻,就是帮助开发者建立本地数据库,存储一些基本信息.不做过多阐述,需要的深入了解的可以找度娘,本文是针对Sqlite小白在使用上提供一些实例. 一.导入Sqlite.swift ...

  4. PHP爬取知乎日报图片显示不了问题

    在爬取知乎日报的内容时,虽然能拿到图片的地址,在窗口中也能打开图片,但是在前端却显示不了,报403错误. 经查证,这是因为知乎对图片做了防盗链处理,其中一个解决方法是添加meta标签: <met ...

  5. java quartz

     什么是Quartz Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触 ...

  6. Nginx解决post请求405问题

    和工商银行的一个合作项目,对方客户端需要请求我们的一个静态页面,但是客户端发送过来的请求方法用的post,日志显示405错误(请求方法错误),正常一个静态页面直接用get请求就可以了,工行那边说写死了 ...

  7. 解决 对路径bin\roslyn..的访问被拒绝

    使用visual studio开发,一重新编译就会报错: 对路径“bin\roslyn\System.Reflection.Metadata.dll”的访问被拒绝 一开始的解决办法就是把bin下的文件 ...

  8. 关于Spring Test 小结

    1.>public class CustomerPackagePrealertControllerTest  extends WebSpringBaseTest{} 2.> @WebApp ...

  9. 【三小时学会Kubernetes!(四) 】Deployment实践

    Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...

  10. php-fpm: 某项目网站频繁出现503问题解决( WARNING: [pool www] server reached pm.max_children setting (50), consider raising it)

    服务是nginx+php-fpm配置, 在运行过一段时间后,会经常出现: WARNING: [pool www] server reached pm.max_children setting (50) ...