MyBatis是什么?

MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果。MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素、Map接口和POJOs(普通java对象)到数据库中的记录。

简介

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
 
 
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
 

MyBatis工作流程

(1)加载配置并初始化
触发条件:加载配置文件
配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理操作请求 触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。
 
 

功能架构

 
我们把Mybatis的功能架构分为三层:

1、API接口层:

 
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

2、数据处理层:

 
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

3、基础支撑层:

 
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。  
 

从XML中构建SqlSessionFactory

  1. String resource = "com/accp/mybatis/data/Configuration.xml";
  2. Reader reader = Resources.getResourceAsReader(resource);
  3. sqlMapper = new SqlSessionFactoryBuilder().build(reader);
 

MyBatis主配置文件

MyBatis配置文件中大标签configuration下子标签包括:

configuration

|--- properties

|--- settings

|--- typeAliases

|--- typeHandlers

|--- objectFactory

|--- plugins

|--- environments

|--- |--- environment

|--- |--- |--- transactionManager

|--- |--- |__ dataSource

|__ mappers

XML <configuration>配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。
 
  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. <!--在下面的datasource中可以使用占位符来引用属性文件中的值-->
  7. <properties resource="properties/datasource.properties" />
  8. <settings>
  9. <setting name="cacheEnabled" value="true" />
  10. <setting name="lazyLoadingEnabled" value="true" />
  11. <setting name="multipleResultSetsEnabled" value="true" />
  12. <setting name="useColumnLabel" value="true" />
  13. <setting name="useGeneratedKeys" value="false" />
  14. <setting name="defaultExecutorType" value="SIMPLE" />
  15. <setting name="defaultStatementTimeout" value="25000" />
  16. </settings>
  17. <!-- 配置别名 类型别名是Java 类型的简称。它仅仅只是关联到XML 配置,简写冗长的JAVA 类名。-->
  18. <typeAliases>
  19. <typeAlias type="com.accp.mybatis.model.Blog" alias="Blog"/>
  20. </typeAliases>
  21. <!-- 使用这个配置,"Blog"就能在任何地方代替"com.accp.mybatis.model.Blog"被使用。-->
  22. <!--
  23. java 中一些简单类型的别名
  24. 别名  映射的类型
  25. _byte  byte
  26. _long  long
  27. _short  short
  28. _int   int
  29. _integer   int
  30. _double  double
  31. _float   float
  32. _boolean  boolean
  33. string  String
  34. byte  Byte
  35. long  Long
  36. short  Short
  37. int   Integer
  38. integer   Integer
  39. double  Double
  40. float   Float
  41. boolean  Boolean
  42. date  Date
  43. decimal  BigDecimal
  44. bigdecimal  BigDecimal
  45. object  Object
  46. map  Map
  47. hashmap  HashMap
  48. list  List
  49. arraylist  ArrayList
  50. collection  Collection
  51. iterator  Iterator
  52. -->
  53. <!-- 每个数据库(environment)对应一个SqlSessionFactory 实例-->
  54. <environments default="accp">
  55. <!--
  56. environments对于一个应用可能连接多个数据库,那就需要配置不同的环境来连接不同的数据库,
  57. 每一个SqlSessionFactory对应一个environments也可以设置不同的环境应用于开发或测试的环境如果环境被忽略,
  58. 那么默认环境将会被加载,也就是default="development"的作用了
  59. -->
  60. <environment id="accp">
  61. <transactionManager type="JDBC" />
  62. <!--
  63. transactionManager设置事物的管理类型是 type=”[JDBC|MANAGED]”
  64. JDBC使用datasource的连接来管理事物范围。
  65. MANAGED自己不进行事物的提交和回滚,依靠容器来管理事物,设置closeConnection为false,取消自动关闭连接
  66. -->
  67. <dataSource type="POOLED">
  68. <!--
  69. dataSource设置数据源[UNPOOLED|POOLED|JNDI]
  70. POOLED:每次被请求时简单打开和关闭连接
  71. POOLED:JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
  72. poolMaximumActiveConnections –  在任意时间存在的活动(也就是正在使用)连接的数量。默认值:10
  73. poolMaximumIdleConnections –  任意时间存在的空闲连接数。
  74. oolMaximumCheckoutTime –  在被强制返回之前,池中连接被检查的时间。默认值:20000 毫秒(也就是 20 秒)
  75. poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败)。 默认值:20000 毫秒(也就是 20 秒)
  76. poolPingQuery –  发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。默认是“NO PING QUERY SET”,这会引起许多数据库驱动连接由一个错误信 息而导致失败。
  77. poolPingEnabled  –  这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置 poolPingQuery 属性。默认值:false。
  78. poolPingConnectionsNotUsedFor  –  这是用来配置 poolPingQuery 多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测。默认值:0 (也就是所有连接每一时刻都被侦测-但仅仅当 poolPingEnabled 为 true 时适用)。
  79. JNDI –  这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
  80. initial_context  –  这个属性用来从初始上下文中寻找环境(也就是initialContext.lookup(init ial——context))。这是个可选属性,如果被忽略,那么data_source 属性将 会直接以 init ialContext 为背景再次寻找。
  81. data_source  –  这是引用数据源实例位置的上下文的路径。它会以由 init ial_context查询返回的环境为背景来查找,如果 init ial_context 没有返回结果时,直接以初始上下 文为环境来查找。
  82. -->
  83. <property name="driver" value="${driver}" />
  84. <property name="url" value="${url}" />
  85. <property name="username" value="${username}" />
  86. <property name="password" value="${password}" />
  87. <property name="driver.encoding" value="${encoding}" />
  88. </dataSource>
  89. </environment>
  90. </environments>
  91. <!--mappers是告诉MyBatis 去哪寻找映射SQL 的语句。可以使用类路径中的资源引用,或者使用字符,输入确切的URL 引用。-->
  92. <mappers>
  93. <mapper resource="com/accp/mybatis/data/BlogMapper.xml" />
  94. </mappers>
  95. </configuration>

从SqlSessionFactory中获取SqlSession

通过以下代码获得SqlSession实例。
  1. SqlSession session = sqlMapper.openSession();
MyBatis包和sql脚本  mysql的

MyBatis 入门到精通(一) 了解MyBatis获取SqlSession的更多相关文章

  1. 转)mybatis实战教程(mybatis in action),mybatis入门到精通

    mybatis实战教程(mybatis in action),mybatis入门到精通 http://limingnihao.iteye.com/blog/781671 http://blog.csd ...

  2. MyBatis从入门到精通(二):MyBatis XML方式的基本用法之Select

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 明确需求 书中提到的需求是一个基 ...

  3. MyBatis从入门到精通(三):MyBatis XML方式的基本用法之多表查询

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 多表查询 上篇博客中,我们示例的 ...

  4. MyBatis从入门到精通(四):MyBatis XML方式的基本用法之增删改

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. insert用法 1.1 简单的 ...

  5. MyBatis从入门到精通(六):MyBatis动态Sql之if标签的用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动 ...

  6. MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中实现查 ...

  7. MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使 ...

  8. MyBatis从入门到精通(1):MyBatis入门

    作为一个自学Java的自动化专业211大学本科生,在学习和实践过程中"趟了不少雷",所以有志于建立一个适合同样有热情学习Java技术的参考"排雷手册". 最近在 ...

  9. mybatis实战教程(mybatis in action),mybatis入门到精通

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...

随机推荐

  1. hdu 2717 Catch That Cow(BFS,剪枝)

    题目 #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> ...

  2. POJ 1182 食物链(种类并查集)

    记得第一次做这道题的时候,推关系感觉有点复杂,而且写完代码后一直WA,始终找不出错误. 在A了十几道并查集后,再做这道题,发现太小儿科了.发现原来之所以WA,就在于查找根节点时,没有同步更新子节点相对 ...

  3. Asp.net 身份验证

    Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个 web应用就会连同这个身份Cookie一起 ...

  4. hdu 4430 Yukari's Birthday

    思路: 分析知道1<=r<40:所以可以枚举r,之后再二分k. 代码如下: #include<iostream> #include<stdio.h> #includ ...

  5. 转:UGUI与NGUI的区别与优缺点

    1. NGUI与UGUI的区别 1) uGUI的Canvas 有世界坐标和屏幕坐标   2) uGUI的Image可以使用material     3) UGUI通过Mask来裁剪,而NGUI通过Pa ...

  6. 分布式内存对象缓存系统Memcached-概述

    全面掌握Memcached 1.       概述 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,是为了加快网站http://www. ...

  7. jvm垃圾回收的时间问题

    1.系统崩溃前的一些现象: 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4.5s FullGC的次数越来越多,最频繁时隔不到1分钟就进行一 ...

  8. Socket称"套接字"

    Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 二.利用Socket建立网络连接的步骤 建立Socket连接至少需要一对 ...

  9. 如何在Android应用程序中使用传感器模拟器SensorSimulator

    原文地址; 如何在Android应用程序中使用传感器模拟器 - 移动平台应用软件开发技术 - 博客频道 - CSDN.NET http://blog.csdn.net/pku_android/arti ...

  10. IntelliJ IDEA 15开发Java Maven项目

    1.安装好之后开始创建项目