Mybastis总结
1.什么是mybatis?为什么使用mybatis?
mybatis的前身是ibatis。MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。通俗的说,mybatis是用来简化Java后台和数据库之间交互的工具。具体简化内容见下文。文末讲解----使用jdbc开发时,和mybatis相比的不足。---- ----mybatis和hibernate的区别。----
mybatis框架,是一个持久层框架,是apache下的顶级项目。mybatis让程序员将主要精力放在sql上,通过mytabis提供的映射方式,自动生成满足需要的sql语句mybatis可以向PreparedStatement中输入参数自动进行输入映射,将查询结果集灵活的映射成Java对象(输出映射),输入映射和输出映射这是mybatis的核心 。
==为什么使用mybatis?==MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
2.mybatis框架执行流程图
1.执行流程
1.Mybatis 读取config.xml配置文件(mybatis全局配置文件)后会将内容放在一个Configuration类中。
2.SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory。
3.SqlSessionFactory根据需求创建SqlSession(类似connection)(每次访问数据库都需要一个SqlSession)
4.底层(不需要程序员管理)封装对象,向数据库输入参数。
5.使用sqlsession直接或间接(mapper)操作(Update、Select、Insert、Delete)数据库
6.底层使用executor执行器执行操作数据库。
7.底层封装对象,数据库向后台返回所需求的值,也就是针对于数据库来说是输出结果(值或对象)。
2.对于执行流程的详细琐碎解释:
1.Mybatis 读取mybatis-config.xml配置文件(mybatis全局配置文件)后会将内容放在一个Configuration类中,Configuration类会存在整个Mybatis生命周期,以便重复读取。SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory。
2.Mybatis中SqlSessionFactiory、SqlSession等都为接口,Mybatis默认使用的实现类为DefaultSqlSessionFactory和DefaultSqlSession类。
3.SqlSession用途主要有两种
①. 获取对应的Mapper,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
②. 直接使用SqlSession,通过命名信息去执行SQL返回结果,该方式是IBatis版本留下的,SqlSession通过Update、Select、Insert、Delete等方法操作。
针对Mapper方式,Mybatis底层利用JDK动态代理技术实现该接口,底层最后还是使用的IBatis中SqlSession通过Update、Select、Insert、Delete等方法操作。
4.关于对象的生命周期:
①. SqlSessionFactoryBuilder的作用是创建SqlSessionFactiory,在创建完成后就会被回收,所以它的生命周期只存在于局部方法。
②.SqlSessionFactiory是单例的,作用就是创建SqlSession,每次访问数据库都需要一个SqlSession,所以SqlSessionFactiory的生命周期是贯穿整个Mybatis生命周期的,SqlSessionFactiory采用单例的原因是减少数据库连接资源。
③. SqlSession是一个会话,类似于jdbc的connection,它的生命周期是在请求数据库处理事务过程中,他是一个线程不安全的对象。多线程操作时因多注意他的隔离级别和数据库锁等。SqlSession使用需及时关闭。
④. Mapper是一个接口,它的作用是发送SQL,返回结果,因此他的生命周期不会大于SqlSession。
5.关于SqlSessionFactory的创建,Mybatis采用构造模式来完成创建。
第一步:XMLConfigBuilder解析XML配置,读出配置参数,存入Configuration类中。(底层实现)
第二步:SqlSessionFactoryBuilder会读取Configuration类中的信息创建SqlSessionFactory。
inputStream = Resources.getResourceAsStream(“mybatis-config.xml”);
sqlSessionFactory = new SqlSessionFactoryBuilder.builder(inputStream)inputStream为读取配置文件的流;
6.映射器由MappedStatement、SqlSource、BoundSql三部分组成。
①. MappedStatement,它保存着映射器的一个节点(select|update|insert|delete)。包括许多我们配置的SQL、SQL的ID、缓存信息、resultMap、parameterType、resultType等配置内容。
②. SqlSource,它提供BoundSql对象。是MappedStatement的一个属性。、
③. BoundSql,它是建立SQL和参数的地方,常用的三个属性:SQL、parameterObject、parameterMappings;
parameterObject就是我们传入的参数;
parameterMappings实则是List,ParameterMapping描述了我们的参数,包括属性、名称、表达式、javaType、jdbcType、typeHandler等重要信息,通过它实现参数和SQL的结合,以便PreparedStatement能够通过它找到parameterObject对象的属性并设置参数。
3.代码Mybatis工具类
package com.sz.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;// 保证单例,由生命周期决定
static{
String resource = "mybatis.cfg.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//返回Sqlsession,用其来直接增删查改数据库或者间接通过mapper来操作。
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
3.具体代码展示,快速入门。简单例子。
1.首先导入关于mybatis的jar包
我这里用的是maven,所以直接在pom.xml中添加依赖即可。因为mybatis是简化后台与数据库交互的,所以我这里添加了MySQL的依赖和log4J日志依赖,方便查看操作。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.后台与数据库交互,那必然得有数据库连接的信息了,所以得有jdbc.properties
url=jdbc:mysql://localhost:3306/mybatis3
username=root
password=123456
driver=com.mysql.jdbc.Driver
3.我这里用到了log4j日志依赖,方便查操作,所以增加了log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.sz.mapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=