图解Mybatis框架原理及使用
1、前言
努力学习完ssm框架之后,终于也成功的把三大框架的使用以及配置文件细节忘得一干二净。为了努力捡起来以及方便今后的复习,决定写一篇博客记录一下。
- 本博客的所有分析都是在持久层接口以及接口中的方法已经创建的基础上进行的。
- 本博客对于Mybatis中标签的细节属性不做过多探讨,主要着重于Mybatis框架的底层原理和大体使用步骤。
- 本博客着重于以Mybatis的xml配置方式为主,作源码分析。
- 本博客中的所有图片均为原创,如需原图,请联系作者。
2、 mybatis简介
持久层框架Mybatis,该框架涉及Java与数据库的交互,有一下几个特点:
(1)采用了高大上的ORM(Object-Relation Mapper) 思想,其作用也就是将关系型数据库(mysql,oracle等)中的表与Java中的类作一个映射,从而使得在需要操作数据库时,可以直接操作java中的对象完成操作。
- 实际使用时的体现:将Java中的类名与数据库表中的列名保持一致
- 优点:解耦,操作简便
- 缺点:影响性能(使用缓存技术解决),复杂查询困难。
(2)使用了构建者模式以及工厂模式。构建者模式了解不多,而工厂模式则在创建对象和设置缓存时起到了极为重要的作用。
(3)使用动态代理创建持久层对象,得利于该方法,在使用mybatis框架进行持久层操作时,不需要实现定义好的java接口,只需在配置文件中使用合适标签完成需要的sql语句操作即可。
(4)与原始的JDBC相比,使用Mybatis能让我们的注意力放在SQL语句的编写上,而屏蔽了注册驱动,建立连接和获取执行SQL语句的statement对象等一系列操作。(虽然这些操作都反映在了配置文件中,但是我们还是假装看不到吧…)
3、 Mybatis配置文件
Mybatis通常都是有一个主配置文件和多个映射配置文件。主配置文件定义在项目中的resources包下,主配置文件中有各个映射配置文件的路径,而每个映射配置文件就对应Dao层中定义好的接口,映射配置文件的位置也要和dao的文件位置保持一致,具体见下图:
3.1、主配置文件
首先,我们需要知道主配置文件的主要功能是什么,从我的现阶段的学习来说,主配置文件的功能主要有以下四个方面:
- 配置数据库连接
- 映射其他配置文件位置
- 起别名简化操作
- 设置缓存
那么,如何实现这些功能,此处先将主配置文件的内容展示如下:
<configuration>
<!--引入外部数据库连接池的配置文件jdbcConfig.properties-->
<properties resource="jdbcConfig.properties"/>
<!--开始配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务-->
<transactionManager type="JDBC"/>
<!--配置数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件的位置-->
<mappers>
<package name="com.zjl.dao"></package>
<mapper resource="com/zjl/dao/UserDao.xml"/>
<mapper class="com.zjl.dao.UserDao"/>
</mappers>
</configuration>
第一步,从数据库的连接开始,对代码中的数据库配置的图解分析如下:
第二步,确定映射配置文件的位置,这一阶段的开启标签是mapper,对于代码的图解分析如下:
在映射文件路径的配置中,我们可以直接通过package标签进行别名的配置,故而就不再论述。
对于提及的缓存配置,因为所牵涉的细节过多,且在不进行配置的情况下,其默认设置可以符合我们大多数场景的需求,在此处就不再过多论述,之后可能会另写一篇博客记录一下标签的详细使用细节。
3.2、映射配置文件
在主配置文件创建完成的情况下,我们应该依照主配置文件中指定的映射配置文件路径创建映射配置文件,并根据对应的dao层中接口的方法编写好映射配置文件,而映射配置文件的功能即:
- 使用标签编写sql语句,从而对dao层中接口的方法进行实现
要实现该功能,我们需要知道想要通过一个映射文件实现一个接口中定义好的方法,所必备的因素有哪些?列举如下:
- 接口及方法名
- 方法输出参数类型
- 方法返回参数类型
- 方法实现的功能
有了以上的大致分析,再列举出一个映射文件书写的例子进行分析:
首先,我们dao接口UserDao中定义的方法如下:
<mapper namespace="com.zjl.dao.UserDao">
<!--添加用户-->
<insert id="saveUser" parameterType="com.zjl.domain.User">
<!--配置插入操作后,获取插入用户的id-->
<!--keyProperty对应与实体类中属性的名称-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.zjl.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{uid};
</delete>
<!--查询一个用户-->
<select id="findById" parameterType="INT" resultType="com.zjl.domain.User">
select * from user where id=#{uid};
</select>
<!--根据姓名查询(模糊查询)用户-->
<select id="findByName" resultType="com.zjl.domain.User" parameterType="String">
select * from user where username like #{name};
</select>
</mapper>
对于配置文件对应以上接口的联合图解分析如下:
在完成了主配置文件和映射配置文件的编写之后,实际上我们已经能够根据这两种配置文件的内容去连接数据库,并且对接口中的方法进行实现从而完成dao层的操作了,而mybatis框架正是封装了从配置文件实现dao层操作,所需要的各种方法和对象。
4、 Mybatis实现原理
从我们之前的经验可以知道,实现dao层的操作,获取可以对数据库进行操作Connection连接对象以及PrepareStatement执行sql语句的对象是最重要的,在主配置文件中,我们已经配置了数据库连接的信息,那么Mybatis是如何通过xml文件中的信息完成数据库连接呢?我们先对数据库连接做分析,首先mybatis使用时的代码如下:
public class mybatisTest {
private UserDao userDao;
private InputStream in;
private SqlSessionFactoryBuilder builder;
private SqlSessionFactory factory;
private SqlSession sqlSession;
public void init() throws IOException {
//读取配置文件,生成字节码文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//使用构建者模式,创建SqlSessionfactory工厂
builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
//使用工厂模式,创建sqlSession
sqlSession = factory.openSession();
//使用sqlsession中的方法获取UserDao的代理对象,相当于对UserDao接口进行实现
userDao = sqlSession.getMapper(UserDao.class);
}
对于以上的代码,分步做以下图解:
在通过SqlSession.getMapper()方法获得接口的实现类之后,即可使用接口实现类直接调用方法即可。
5、 Mybatis小结
想要深入Mybatis的原理细节,有几个重要的对象需要去熟悉:
- Configuration:虽然并未直接在代码中出现,但其却贯穿Mybatis框架始终;
- SqlSession:Mybatis的核心对象;
- Executor:执行sql语句的执行器;
- MapperRegister:动态代理的开端,SqlSession.getMapper()方法的后端实现。
框架的学习往往繁杂易忘,希望自己有足够的耐心去阅读源码,深入分析。
图解Mybatis框架原理及使用的更多相关文章
- MyBatis框架原理4:插件
插件的定义和作用 首先引用MyBatis文档对插件(plugins)的定义: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许使用插件来拦截的方法调用 ...
- MyBatis框架原理3:缓存
上一篇[MyBatis框架原理2:SqlSession运行过程][1]介绍了MyBatis的工作流程,其中涉及到了MyBatis缓存的使用,首先回顾一下工作流程图: 如果开启了二级缓存,数据查询执行过 ...
- MyBatis框架原理2:SqlSession运行过程
获取SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); 首先通过SqlSessionFactory的openSessi ...
- (二)mybatis框架原理(图解)
目录 mybatis 框架原理图(粗略版) mybatis 框架原理图(粗略版)
- MyBatis框架原理(三)
一.框架结构原理图 二.MyBatis框架执行流程 三.总结 原理详解: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置, ...
- MyBatis框架原理1:构建SqlSessionFactory的过程
SqlSessionFactoryBuilder 首先创建了一个SqlSessionFactoryBuilder对象,然后调用该对象的build方法加载全局XML配置的流文件构建出一个SqlSessi ...
- IDEA 中生成 MyBatis 逆向工程实践
IDEA 逆向 MyBatis 工程时,不像支持 Hibernate 那样有自带插件,需要集成第三方的 MyBatis Generator. MyBatis Generator的详细介绍 http:/ ...
- Mybatis框架_part1
mybatis介绍 mybatis就是一个封装了jdbc的持久层框架,它的前身是ibatis.Mybatis与hibernate一样都是持久层框架,但是它与hibernate不同的是,它不是一个完全的 ...
- MyBatis 学习入门
mybatis 第一天 mybatis的基础知识 持久层的框架,对jdbc的封装 课程安排 第一天:基础知识(重点,内容量多) 最简单的jdbc程序 public class JdbcTest{ pu ...
随机推荐
- Python开发:在mac系统中安装pip
pip用来安装python项目的依赖库. 大多数比较新的python版本都自带pip,所以先检查下pip是否有安装. 终端输入:pip --version 如果没有安装pip,那么就用接下来的方式安装 ...
- Spring Boot Shiro 使用教程
Apache Shiro 已经大名鼎鼎,搞 Java 的没有不知道的,这类似于 .Net 中的身份验证 form 认证.跟 .net core 中的认证授权策略基本是一样的.当然都不知道也没有关系,因 ...
- 什么是Rogue Histogram?
Rogue Histogram可以理解为AP的“流氓直方图”,这里大概记录了该AP附近的其他AP的信道和频宽. 例如如下图:可以通过show ap auto-rf 802.11a AP-name / ...
- Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data
在常见业务开发中,POST请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用Postman测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-form- ...
- 零基础入门深度学习(6) - 长短时记忆网络(LSTM)
代码: def forward(self, x): ''' 根据式1-式6进行前向计算 ''' self.times += 1 # 遗忘门 fg = self.calc_gate(x, self.Wf ...
- Update(Stage4):sparksql:第5节 SparkSQL_出租车利用率分析案例
目录: 1. 业务2. 流程分析3. 数据读取5. 数据清洗6. 行政区信息 6.1. 需求介绍 6.2. 工具介绍 6.3. 具体实现7. 会话统计 导读 本项目是 SparkSQL 阶段的练习项目 ...
- MySQL高可用之MHA配置
本文简单介绍了MySQL的高可用实现方式之一的MHA MHA:Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点:通过提升某一从节点为新的主节点,基于主 ...
- 「Luogu P5080 Tweetuzki 爱序列」
题目大意 给出一些数,需要求出 \(\frac{a_{i+1}}{3}=a_i\) 或 \(a_{i+1}=2 \times a_i\) 时最长的序列 \(a\). 分析 可以发现符合条件的序列 \( ...
- [ DLPytorch ] 文本分类&图像增强
图像增强 图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模.图像增广的另一种解释是,随机改变训练样本可以降低模 ...
- 凤凰系统(Phoenix OS)PC版安装,电脑上体验功能丰富的安卓系统
PC版(X86版)ISO镜像下载地址:http://www.phoenixos.com/download_x86 下载完成后,可按照官方给出的安装教程进行安装. 凤凰系统帮助中心:http://www ...