Java框架MyBatis工作流程是怎样的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java框架MyBatis工作流程是怎样的?相关的知识,希望对你有一定的参考价值。
一、Mybatis介绍
MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果。MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素、Map接口和POJOs(普通java对 象)到数据库中的记录。
二、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)返回处理结果将最终的处理结果返回。
orm工具的基本思想
无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:
从配置文件(通常是XML配置文件中)得到 sessionfactory.
由sessionfactory 产生 session
在session 中完成对数据的增删改查和事务提交等.
在用完之后关闭session 。
在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。
功能架构
Java框架篇---Mybatis 入门
Mybatis的功能架构分为三层:
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
多需要添加的驱动包:
Java框架篇---Mybatis 入门
下面进行快速入门:
目录如下:
Java框架篇---Mybatis 入门
实体类User
package com.oumyye.model;
public class User
private String id;
private String name;
private int age;
public String getId()
return id;
public void setId(String id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
@Override
public String toString()
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
映射文件UserMapping.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.oumyye.mapping.UserMapping">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="com.oumyye.model.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
-->
<!--
根据id查询得到一个user对象
-->
<select id="getUser" parameterType="String"
resultType="com.oumyye.model.User">
select * from user where id=#id
</select>
</mapper>
资源文件mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/oumyye/mapping/userMapping.xml"/>
</mappers>
</configuration>
测试类:
package test;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.oumyye.model.User;
public class Tests
@Test
public void test()
String resource = "mybatis.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = Tests.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的标识字符串,
* com.oumyye.mapping.UserMapping是userMapper.xml文件中mapper标签的namespace属性的值,
* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "com.oumyye.mapping.UserMapping.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, "1123");
System.out.println(user.toString());
结果:
参考技术Amybatis主要通过两个配置文件(sqlMapConfig.xml和Mapper.xml),来配置数据库和对象的关系
sqlMapConfig.xml:
Mybatis的全局配置文件,主要配置mybatis的环境参数、映射对象运行参数。
mybatis的环境参数:数据源配置、事务控制
映射对象运行参数:映射对象的别名设置、映射对象配置文件加载
案例:
参考技术B 1、加载配置并初始化;2、接收调用请求;
3、处理操作请求触发条件:API接口层传递请求过来;
4、返回处理结果将最终的处理结果返回。 参考技术C
(1)加载配置并初始化:触发条件:加载配置文件.配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求:触发条件:调用Mybatis提供的API。传入参数:为SQL的ID和传入参数对象。处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理操作请求 触发条件:API接口层传递请求过来。传入参数:为SQL的ID和传入参数对象
(4)返回处理结果将最终的处理结果返回。
MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果。MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素、Map接口和POJOs(普通java对 象)到数据库中的记录。
Java单体应用 - 常用框架 - 08.MyBatis
原文地址:http://www.work100.net/training/monolithic-frameworks-mybatis.html
更多教程:光束云 - 免费课程
MyBatis 简介
序号 | 文内章节 | 视频 |
---|---|---|
1 | 什么是MyBatis | - |
2 | MyBatis体系结构 | - |
3 | MyBatis的工作流程 | - |
4 | MyBatis与Hibernate | - |
5 | MyBatis的特点 | - |
请参照如上章节导航
进行阅读
1.什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动
、创建 Connection
、配置 Statement
等繁杂过程。
Mybatis 通过 xml
或注解
的方式将要执行的各种 Statement(Statement、PreparedStatement 等)配置起来,并通过 Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射成 Java 对象并返回。
2.MyBatis体系结构
接口层
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
3.MyBatis的工作流程
首先在 MyBatis 启动的时候我们需要去解析配置文件,包括全局配置文件( mybatis-config.xml
)以及映射器配置文件,这里面包含了我们怎么控制 MyBatis 的行为和我们要对数据库下达的指令,也就是我们的 SQL
的信息,我们会把这些信息解析成一个 Configuration
对象。
接下来就是我们操作数据库的接口,它在应用程序和数据库中间,代表我们和数据库之间的一次连接,这个就是 SqlSession
对象。
我们要获得一个会话,必须有一个会话工厂 SqlSessionFactory
,SqlSessionFactory 中又必须包含我们所有的配置信息,所以 MyBatis 通过一个 builder
来创建 SqlSessionFactory。
我们知道 MyBatis 是对 JDBC
的封装,也就意味着底层一定会出现 JDBC 的一些核心对象,比如执行 SQL
的 Statement
,结果集 ResultSet
。
在 MyBatis 里面,SqlSession
只是提供给应用的一个接口,还不是 SQL 的真正执行对象。
通过代码中可以看到,SqlSession 中持有一个 Executor
对象,用来封装对数据库的操作。
在执行器 Executor 执行 query
或者 update
操作的时候,我们会创建一系列的对象来处理参数,执行 SQL,处理结果集。
我们可以简化成一个 StatementHandler
对象,下面是 MyBatis 的主要流程图:
SqlSessionFactoryBuilder
每一个 MyBatis 的应用程序的入口是 SqlSessionFactoryBuilder
,它的作用是通过XML配置文件创建 Configuration
对象(当然也可以在程序中自行创建),然后通过 build
方法创建 SqlSessionFactory
对象。
没有必要每次访问 Mybatis 就创建一次 SqlSessionFactoryBuilder
,通常的做法是创建一个全局的对象就可以了。
SqlSessionFactory
SqlSessionFactory
对象由 SqlSessionFactoryBuilder
创建。
它的主要功能是创建 SqlSession
对象,和 SqlSessionFactoryBuilder
对象一样,没有必要每次访问 Mybatis 就创建一次 SqlSessionFactory
,通常的做法是创建一个全局的对象就可以了。
SqlSessionFactory
对象一个必要的属性是 Configuration
对象,它是保存 Mybatis 全局配置的一个配置对象,通常由 SqlSessionFactoryBuilder
从 XML 配置文件创建。
SqlSession
SqlSession
对象的主要功能是完成一次数据库的访问和结果的映射,它类似于数据库的 session
概念,由于不是线程安全的,所以 SqlSession
对象的作用域需限制方法内。
SqlSession
的默认实现类是 DefaultSqlSession
,它有两个必须配置的属性:
- Configuration
- Executor
Executor
Executor
对象在创建 Configuration
对象的时候创建,并且缓存在 Configuration
对象里。
Executor
对象的主要功能是调用 StatementHandler
访问数据库,并将查询结果存入缓存中(如果配置了缓存的话)。
StatementHandler
StatementHandler
是真正访问数据库的地方,并调用 ResultSetHandler
处理查询结果。
ResultSetHandler
处理查询结果。
4.MyBatis与Hibernate
区分 | 数据库封装机制(ORM) | 说明 |
---|---|---|
Hibernate |
全自动 |
实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行。 |
MyBatis |
半自动 |
其着力点,是在 POJO 类与 SQL 语句之间的映射关系。 |
也就是说,MyBatis 并不会为程序员自动生成 SQL 语句。
具体的 SQL 需要程序员自己编写,然后通过 SQL 语句映射文件,将 SQL 所需的参数,以及返回的结果字段映射到指定 POJO。
因此,MyBatis 成为了“全自动”ORM 的一种有益补充。
5.MyBatis的特点
- 在 XML 文件中配置 SQL 语句,实现了 SQL 语句与代码的分离,给程序的维护带来了很大便利。
- 因为需要程序员自己去编写 SQL 语句,程序员可以结合数据库自身的特点灵活控制 SQL 语句,因此能够实现比 Hibernate 等全自动 ORM 框架更高的查询效率,能够完成复杂查询。
- 简单,易于学习,易于使用,上手快。
上一篇:Spring MVC
下一篇:Druid 简介
以上是关于Java框架MyBatis工作流程是怎样的?的主要内容,如果未能解决你的问题,请参考以下文章