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
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2、mybatis-config.xml
3、Mapper.xml
<mapper class="com.test.mybatis.mapper.UserMapper"></mapper>
Mybatis 全局配置详解:
1 annotation
public interface UserMapper {
@Select("select * from user where id=#{id}")
public User selectUser(Integer id);
}
注解和 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
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
</dependencies>
</plugin>
2、配置 mybatis-genrtator.xml
3、mybatis-generator:generate
XMLMAPPER|ANNOTATEDMAPPER
去掉注释:
生成的pojo类里面的注释
<commentGenerator >
<property name="suppressAllComments" value="true"/>
</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 ->返回类型对应
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
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
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
其实是不干事情的
org.apache.ibatis.executor.statement.StatementHandler
org.apache.ibatis.executor.statement.PreparedStatementHandler
org.apache.ibatis.executor.resultset.ResultSetHandler
org.apache.ibatis.executor.resultset.DefaultResultSetHandler
注解解析过程
@Select加载方式
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.MapperAnnotationBuilder
>org.apache.ibatis.binding.MapperRegistry.addMapper 构造函数
>org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse
>org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource
>org.apache.ibatis.session.Configuration.addMapper
>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 配置
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--<property name="mapperLocations" value="classpath*:mybatis/UserMapper.xml" />-->
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.test.mapper" />
</bean>
了解mybatis 的 1:N和 N:N