mybatis官网:http://www.mybatis.org/mybatis-3/zh/index.html
mybatis spring官网:http://www.mybatis.org/spring/zh/index.html
mybatis-plus 官网:http://mp.baomidou.com/guide/#%E7%89%B9%E6%80%A7

传统 JDBC 的弊端:
总结:
1、jdbc 底层没有用连接池、操作数据库需要频繁的创建和关联链接。消耗很大的资源
2、写原生的 jdbc 代码在 java 中,一旦我们要修改 sql 的话,java 需要整体编译,不利于系
统维护
3、使用 PreparedStatement 预编译的话对变量进行设置 123 数字,这样的序号不利于维护
4、返回 result 结果集也需要硬编码。

一、mybatis 介绍:

Mybatyis:Object relation mapping 对象关系映射
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
快速开始 mybatis (xml 方式):
1、maven

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>x.x.x</version>
  5. </dependency>

2、mybatis-config.xml
3、Mapper.xml

  1. <mapper class="com.test.mybatis.mapper.UserMapper"></mapper>

Mybatis 全局配置详解:
Mybatis - 图1

1 annotation

  1. public interface UserMapper {
  2. @Select("select * from user where id=#{id}")
  3. public User selectUser(Integer id);
  4. }

注解和 xml 优缺点:
Xml:增加 xml 文件、麻烦、条件不确定、容易出错,特殊字符转义
注释:不适合复杂 sql,收集 sql 不方便,重新编译

2 # 与$ 区别:

参数标记符号
#预编译,防止 sql 注入(推荐)
$可以 sql 注入,代替作用

3 parameterType 与 与 parameterMap 区别:

通过 parameterType 指定输入参数的类型,类型可以是简单类型、hashmap、pojo 的包装
类型

4 resultType 与 与 resultMap 区别:

使用 resultType 进行输出映射,只有查询出来的列名和 pojo 中的属性名一致,该列才可以
映射成功。
mybatis 中使用 resultMap 完成高级输出结果映射。

二、Mybatis 逆向工程:

1 什么是逆向工程:

MyBatis 的一个主要的特点就是需要程序员自己编写 sql,那么如果表太多的话,难免会很
麻烦,所以 mybatis 官方提供了一个逆向工程,可以针对单表自动生成 mybatis 执行所需要
的代码(包括 mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是
通过数据库的表生成代码
1、引入 jar

  1. <plugin>
  2. <groupId>org.mybatis.generator</groupId>
  3. <artifactId>mybatis-generator-maven-plugin</artifactId>
  4. <version>1.3.7</version>
  5. <dependencies>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>${mysql-connector-java.version}</version>
  10. </dependency>
  11. </dependencies>
  12. </plugin>

2、配置 mybatis-genrtator.xml
3、mybatis-generator:generate
XMLMAPPER|ANNOTATEDMAPPER

去掉注释: 生成的pojo类里面的注释

  1. <commentGenerator >
  2. <property name="suppressAllComments" value="true"/>
  3. </commentGenerator>

三、mybatis 核心概念

Configuration、 、SqlSessionFactory、 、Session、 、Executor、 、MappedStatement、 、StatementHandler、 、
ResultSetHandler

名称 意义
Configuration 管理 mysql-config.xml 全局配置关系类
SqlSessionFactory Session 管理工厂接口
Session SqlSession 是一个面向用户(程序员)的接口。SqlSession 中提


供了很多操作数据库的方法 | | Executor | 执行器是一个接口(基本执行器、缓存执行器)
作用:SqlSession 内部通过执行器操作数据库 | | MappedStatement | 底层封装对象
作用:对操作数据库存储封装,包括 sql 语句、输入输出参数 | | StatementHandler | 具体操作数据库相关的 handler 接口 | | ResultSetHandler | 具体操作数据库返回结果的 handler 接口 |

1 整体认识 mybatis 源码包

├─annotations ->注解相关 比如 select insert
├─binding -> mapper 相关
├─builder ->解析 xml 相关
├─cache ->缓存
├─cursor -> 返回结果 resultset
├─datasourcer ->数据管理
├─exceptionsr -> 异常
├─executorr -> 执行器
├─io ->classloader
├─jdbc ->jdbc
├─lang ->jdk7 jdk8
├─logging ->日志相关
├─mapping ->mapper 相关的封装
├─parsing ->xml 相关解析
├─plugin ->拦截器
├─reflection ->反射相关
├─scripting ->数据厂家
├─session ->sessiomn
├─transaction ->事务
└─type ->返回类型对应

Mybatis - 图2

2 Configuration

org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration

2.1 Properties 文件解析:

org.apache.ibatis.builder.xml.XMLConfigBuilder#propertiesElement

2.2 Setting 文件解析:

org.apache.ibatis.builder.xml.XMLConfigBuilder#settingsElement

2.3 environments 文件解析:

org.apache.ibatis.builder.xml.XMLConfigBuilder#environmentsElement

3 Session

Mybatis - 图3
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
org.apache.ibatis.transaction.TransactionFactory.newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)
org.apache.ibatis.session.Configuration.newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
org.apache.ibatis.executor.SimpleExecutor
org.apache.ibatis.executor.CachingExecutor 一级缓存 自动
org.apache.ibatis.plugin.InterceptorChain.pluginAll 责任链模式拦截器

4 Mapper

Mybatis - 图4
org.apache.ibatis.session.defaults.DefaultSqlSession.getMapper
org.apache.ibatis.session.Configuration.getMapper
org.apache.ibatis.binding.MapperRegistry.getMapper
org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.session.SqlSession)
org.apache.ibatis.binding.MapperMethod.execute

5 Sql

org.apache.ibatis.binding.MapperMethod.execute
>org.apache.ibatis.session.SqlSession.selectOne(java.lang.String, java.lang.Object)
>org.apache.ibatis.executor.BaseExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)
>org.apache.ibatis.mapping.MappedStatement.getBoundSql

6 Executor

Mybatis - 图5
Mybatis - 图6

其实是不干事情的
org.apache.ibatis.executor.statement.StatementHandler
org.apache.ibatis.executor.statement.PreparedStatementHandler
org.apache.ibatis.executor.resultset.ResultSetHandler
org.apache.ibatis.executor.resultset.DefaultResultSetHandler
注解解析过程

  1. @Select加载方式
  2. org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.MapperAnnotationBuilder
  3. >org.apache.ibatis.binding.MapperRegistry.addMapper 构造函数
  4. >org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse
  5. >org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource
  6. >org.apache.ibatis.session.Configuration.addMapper
  7. >org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement

四、Mybatis 集成 Spring

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。 使用这个类库中的类,
Spring 将会加载必要的 MyBatis 工厂类和 session 类。 这个类库也提供一个简单的方式
来注入 MyBatis 数据映射器和 SqlSession 到业务层的 bean 中。 而且它也会处理事务,
翻译 MyBatis 的异常到 Spring 的 DataAccessException 异常(数据访问异常,译者注)中。最
终,它并 不会依赖于 MyBatis,Spring 或 MyBatis-Spring 来构建应用程序代码。

1 配置

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis-spring</artifactId>
  4. <version>1.3.0</version>
  5. </dependency>
  6. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  7. <property name="dataSource" ref="dataSource" />
  8. <!--<property name="mapperLocations" value="classpath*:mybatis/UserMapper.xml" />-->
  9. </bean>
  10. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  11. <property name="basePackage" value="com.test.mapper" />
  12. </bean>

了解mybatis 的 1:N和 N:N