一、什么是Mybatis
- Mybatis是一个半ORM(对象关系映射)框架,
底层封装了JDBC
,是程序员在开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 - MyBatis 可以
使用简单的 XML文件 或注解方式来配置和映射原生信息
,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 - 通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行
映射生成最终执行的sql语句
,最后由mybatis框架执行sql并将结果映射
为java对象并返回。(从执行sql到返回result的过程)。
JDBC流程
加载驱动程序->获得数据库连接->声明SQL,预编译SQL,传参,执行->处理数据库响应结果集并返回结果
代码示例:
public class DbUtil {
public static final String URL = "jdbc:mysql://localhost:3306/imooc";
public static final String USER = "liulx";
public static final String PASSWORD = "123456";
private static Connection conn = null;
static{
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
return conn;
}
}
// 一个删除方法
public void delGoddess(){
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "delete from imooc_goddess where id=?";
//预编译SQL,减少sql执行
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setInt(1, id);
//执行
ptmt.execute();
}
// 一个查询方法
public Goddess get(){
Goddess g = null;
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "select * from imooc_goddess where id=?";
//预编译SQL,减少sql执行
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setInt(1, id);
//执行
ResultSet rs = ptmt.executeQuery();
while(rs.next()){
g = new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
}
return g;
}
思考:MyBatis与Hibernate有哪些不同?
1、Mybatis是一个半自动的ORM框架,在查询关联对象或关联集合对象时,需要手动编写sql语句
来完成;
Hibernate是全自动
ORM映射工具,查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,不需要编写sql.
2、Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,
非常适合对性能要求高,需求变化频繁的项目
;但是如果涉及到较多的字段或者关联多表时,sql语句编写量大且对开发人的sql语句编写功底要求高。
Hibernate对象/关系映射能力强,数据库无关性好,适合需求变化不大的项目
,使用hibernate开发可以节省很多代码,提高效率。
二、Mybatis三层架构
① API接口层
提供给外部使用的接口API
,开发人员通过这些本地API来操纵数据库
。接口层一接收到调用请求就会调用数据处理层
来完成具体的数据处理。
② 数据处理层
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作
。
③ 基础支撑层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
三、Mybatis原理
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
总结:
加载器得到xml对象
SqlSessionFactoryBuilder对象生成SqlSessionFactory对象
SqlSessionFactory对象生成SqlSession对象
SqlSession对象(调用Executor调用StatementHandler调用ResultSetHandler),获取 sql 语句,获取连接通道,获取连接对象,执行sql语句,获取结果集,关闭连接对象/通道,返回结果。
理解:
1、SqlSessionFactoryBuilder【全局的对象】
每一个Mybatis的应用程序的入口是:SqlSessionFactoryBuilder。
它的作用是通过XML配置文件创建Configuration对象
(当然也可以在程序中自行创建),然后通过build方法创建SqlSessionFactory对象
。
2、SqlSessionFactory【全局的对象】
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
SqlSessionFactory是由SqlSessionFactoryBuilder 从 XML 配置文件或通过Java的方式构建出 的实例,主要功能是创建SqlSession(会话)对象
;SqlSessionFactory对象一个必要的属性是Configuration对象
;
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在
,建议使用单例模式或者静态单例模式。一个SqlSessionFactory对应配置文件中的一个环境(environment),如果你要使用多个数据库就配置多个环境分别对应一个SqlSessionFactory。
3、 SqlSession
作为Mybatis工作的主要顶层API,表示和数据库交互的会话
,完成必要数据库增删改查功能。SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
。
SqlSession是一个接口,它有2个实现类,分别是DefaultSqlSession(默认使用)以及SqlSessionManager;默认使用DefaultSqlSession,它有两个必须配置的属性:Configuration和Executor
,SqlSession通过内部存放的执行器(Executor)来对数据进行CRUD。
由于不是线程安全的,所以SqlSession对象的作用域需限制方法内
;每一次操作完数据库后都要调用close对其进行关闭,官方建议通过try-finally来保证总是关闭SqlSession
。
4、 Executor
MyBatis执行器,是MyBatis 调度的核心。Executor对象在创建Configuration对象的时候创建,并且缓存在Configuration对象里。Executor:负责SQL语句的生成,调用StatementHandler
访问数据库,查询缓存的维护;
Executor(负责动态SQL的生成和查询缓存的维护
)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象;
Executor(执行器)接口有两个实现类,其中BaseExecutor有三个继承类分别是BatchExecutor(重用语句并执行批量更新),ReuseExecutor(重用预处理语句prepared statements),SimpleExecutor(普通的执行器)。
5、 StatementHandler
封装了JDBC Statement操作,负责对JDBCstatement的操作,如设置参数、将Statement结果集转换成List集合,是真正访问数据库的地方,并调用ResultSetHandler
处理查询结果。
6、ResultSetHandler
ParameterHandler
负责将用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
处理查询结果。
TypeHandler
负责java数据类型和jdbc数据类型之间的映射和转换
7、 MappedStatement
MappedStatement就是用来存放我们SQL映射文件中的信息
包括sql语句,输入参数,输出参数等等。一个SQL节点对应一个MappedStatement对象
。
借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
8、 SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句
,将信息封装到BoundSql对象中,并返回
BoundSql
表示动态生成的SQL语句以及相应的参数信息
Configuration
MyBatis所有的配置信息都维持在Configuration对象之中