MyBatis介绍及教程

2023-11-19

MyBatis简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis的优缺点

优点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
  • 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。

缺点:

  • 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  • SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  • 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
  • 二级缓存机制不佳

MyBatis如何安装?

如果使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。

github下载地址(https://github.com/mybatis/mybatis-3/releases)

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

<dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis</artifactId>  <version>x.x.x</version></dependency>

MyBatis开发流程

1、准备工作

在数据库中建表,并且添加几条数据

在这里插入图片描述

将相关jar包导入项目
在这里插入图片描述

druid:数据源,替换mybatis自带的数据源(不替换也可以)

log4j:日志

lombok:可以省去写get,set等冗长的方法(详细看关于lombok.jar的使用_橘子恶霸、的博客-CSDN博客

mybatis:mybaris(必须)

mysql-connector:mysql驱动(必须)

2、创建实体类与dao层

在这里插入图片描述

Book.java:

package com.dyit.entity;

import java.io.Serializable;
import java.util.Date;

import org.apache.ibatis.type.Alias;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Alias("Book")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book implements Serializable{

	private Integer id;
	private String isbn;//出版编号
	private String title;//书籍名称
	private String author;//作者
	private String cover;//封面
	private Double price;//价格
	private Date date;//出版日期
}

说明:@Alias(“Book”)为类的别名

IBookMapper.java

package com.dyit.mapper;

import org.apache.ibatis.annotations.Param;

import com.dyit.entity.Book;

public interface IBookMapper {
    //添加树
	void updateAuthorOrPrice(@Param("id")int id,@Param("price")Double price,@Param("author")String author);
    //通过id查找书
	Book findById(@Param("id") int id);
}

说明:@Param(注解绑定参数)

3、数据库配置信息

在src\resource\druid下创建druid.properties(使用的是druid数据源)

druid.driver = com.mysql.cj.jdbc.Driver
druid.url = jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
druid.username=root
druid.password=123456

按照自己的数据库配置

4、创建并编写MyBatis配置文件(mybatis-config.xml)

在src/resource/config下创建mybatis-config.xml
在这里插入图片描述

mybatis-config.xml初始模板:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--配置标签的顺序:(properties?, settings?, typeAliases?,
        typeHandlers?, objectFactory?, objectWrapperFactory?,
        reflectorFactory?, plugins?, environments?,
        databaseIdProvider?, mappers?)-->


</configuration>

配置相关信息

<?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>
	<!-- 读取数据源配置文件 -->
	<properties resource="resource/druid/druid.properties"/>
	<!-- 读取实体类别名 -->
	<typeAliases>
		<package name="com.dyit.entity"/>
	</typeAliases>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/><!-- 配置数据库事务管理 -->
				<dataSource type="com.dyit.util.MybatisDataSource"><!-- 读取数据源信息 -->
					<property name="driverClassName" value="${druid.driver}"/>
					<property name="url" value="${druid.url}"/>
					<property name="username" value="${druid.username}"/>
					<property name="password" value="${druid.password}"/>
				</dataSource>			
		</environment>
	</environments>
	
	<!-- 加载xxx.mapper.xml -->
	<mappers>
		<mapper resource="resource/mapper/Book.mapper.xml"/>
	</mappers>
</configuration>

在environments标签项中配置相关信息,default属性和id属性可根据自己意愿填写(其实就是个名字而已),我们在这选用的不是是MyBatis默认的连接池,使用dataSource 标签的type属性读取druid

5、日志配置

在src下创建log4j.properties配置日志信息

log4j.rootLogger=debug,stdout,logfile
#console output
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.appender.stdout.PatternLayout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}<-->%F<-->%p<-->%m%n 
#file output
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=D:/logs/log.log
log4j.appender.logfile.layout=org.apache.log4j.SimpleLayout
log4j.appender.logfile.PatternLayout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}<-->%F<-->%p<-->%m%n

#mybatis log 
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG


6、配置xxx.mapper.xml

IBookMapper.java中的抽象方法,如何去实现它们呢?

这就要靠我们的Mapper配置文件了,一个Dao接口文件对应一个Mapper配置文件。MyBatis替我们封装了数据访问的其他操作,我们只需要关注Sql语句本身就可以了,而Sql语句写在哪呢?就是Mappe配置文件中。

在src\resource\mapper下创建Book.mapper.xml

下面是Mapper文件的初始模板:

<?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.dao.UserDao">


</mapper>
<?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.dyit.mapper.IBookMapper">
    
	<cache/><!-- 开启二级缓存 -->

	<resultMap type="Book" id="BookMap">
		<id property="id" column="book_id"/>
		<result property="isbn" column="book_isbn"/>
		<result property="title" column="book_title"/>
		<result property="author" column="book_author"/>
		<result property="price" column="book_price"/>
		<result property="cover" column="book_cover"/>
		<result property="date" column="book_date"/>
	</resultMap>
	
	<insert id="save">
		INSERT INTO book_tab(book_isbn,book_title,book_author,book_date,book_price,book_cover)
		 VALUES(#{isbn},#{title},#{author},#{date},#{price},#{cover})
	</insert>
	
	<select id="findById" resultMap="BookMap">
		SELECT * FROM book_tab WHERE book_id = #{id}
	</select>
	
</mapper>

resultMap 标签就是属性关系映射,来解决字段名不一致的问题,当我们需要用的时候,将select标签的resultType属性改为resultMap就可以了。

7、编写测试类

新建个test包创建单元测试

package test;

import com.dyit.entity.*;
import java.io.IOException;
import java.io.Reader;
import java.util.Date;
import java.util.List;

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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.dyit.mapper.IBookMapper;

public class TestMybatis {
	
	private SqlSession sqlSession;
	
	@Before
	public void before() throws IOException {
		//读取mybatis-config.xml获取一个字符流
		Reader in = Resources.getResourceAsReader("resource/config/mybatis-config.xml");
		//通过字符流获取sqlSession工厂
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		//拿到sqlSession
		sqlSession = sqlSessionFactory.openSession();
	}
	
	@After
	public void after() {
		//事务提交,关闭资源
		sqlSession.commit();
		sqlSession.close();
	}

	@Test
	public void testsave() throws IOException {
		IBookMapper mapper = sqlSession.getMapper(IBookMapper.class);
		
		Book book = new Book(null,"dyit-03","c#入门","张三","java.png",77.00,new Date());
		
		mapper.save(book);		
	}
	
	
	@Test
	public void testfindById() throws IOException {
		
		IBookMapper mapper = sqlSession.getMapper(IBookMapper.class);
		
		Book book = mapper.findById(1);
		System.out.println(book.toString());
		
	}	
	
}


savetest()测试结果

在这里插入图片描述

testfindById()测试结果

在这里插入图片描述

MyBatis的工作原理以及核心流程介绍

原文:(http://www.mybatis.cn/archives/706.html)

MyBatis的底层操作封装了JDBC的API,MyBatis的工作原理以及核心流程与JDBC的使用步骤一脉相承,MyBatis的核心对象(SqlSession,Executor)与JDBC的核心对象(Connection,Statement)相互对应。本文的核心观点是:从JDBC入手并立足于JDBC,才能深入的理解MyBatis的工作原理以及核心流程。

1、如何掌握MyBatis的工作原理?

关于MyBatis的工作原理,网上的文章是汗牛充栋,但是站长觉得,要结合JDBC来理解MyBatis的工作原理往往才能更透彻。我们知道,JDBC有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表

而MyBatis也有四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法【1】。类似于JDBC里面的Connection 【2】。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。

2、MyBatis的工作原理以及核心流程详解

MyBatis的工作原理如下图所示:在这里插入图片描述
上面中流程就是MyBatis内部核心流程,每一步流程的详细说明如下文所述:

(1)读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。

(2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。

(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。

(5)Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。

(6)MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。

(7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。

(8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。

备注

备注【1】的说明如下:

在JDBC中,Connection不直接执行SQL方法,而是利用Statement或者PrepareStatement来执行方法。

在使用JDBC建立了连接之后,可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。

而在MyBatis中,SqlSession对象包含了执行SQL语句的所有方法。但是它是委托Executor执行的。

从某种意义上来看,MyBatis里面的SqlSession类似于JDBC中的Connection,他们都是委托给其他类去执行。

最后说一点,虽然SqlSession对象包含了执行SQL语句的所有方法,但是它同样包括了:

<T> T getMapper(Class<T> type);

所以SqlSession也可以委托给映射器来执行数据的增删改查操作。如下代码所示:

// 获得mapper接口的代理对象
PersonMapper pm = session.getMapper(PersonMapper.class);
// 直接调用接口的方法,查询id为1的Peson数据
Person p2 = pm.selectPersonById(1);

这上面来看,SqlSession是不是也类似于JDBC中的Connection呢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis介绍及教程 的相关文章

随机推荐

  • 什么是架构,架构的本质是什么

    不论是开发人员还是架构师 我们都一直在跟软件系统打交道 架构是在工作中出现最频繁的术语之一 那么 到底什么是架构 你可能有自己的答案 也有可能没有答案 对 架构 的理解需要我们不断在实践中思考 归纳 演绎 形成自己的认知 一 什么是软件架构
  • Dinic算法学至大佬,学以致用【挂上相应的题目】

    这个巨佬讲的超级厉害 学起来很快 还有优化的说呢 Dinic算法 研究总结 网络流 网络流是信息学竞赛中的常见类型 笔者刚学习了最大流Dinic算法 简单记录一下 网络流基本概念 什么是网络流 在一个有向图上选择一个源点 一个汇点 每一条边
  • 11年做安卓开发至今,我失业了,我跟CSDN的缘分

    今天来写篇自己的文章 自己工作的文章 11年毕业到现在 我彻底失业了 是真的失业了 不过失业我觉得没什么可怕 至少干了这些年 也攒下了一些生活费 至少饿不死就行了 我失业也是因为自己有业 并不害怕 从11年做开发 那个时候就边做开发 边思考
  • 学习-Java输入输出之File类之获取文件信息(1)

    任务描述 本关任务 判断给定的字符串是目录 文件路径还是其它 相关知识 File 对象既可以表示文件 又可以表示目录 下面我们来了解一下更多关于 File 对象的操作 获取文件信息常用方法 已知在C Users yy Desktop fil
  • Unity编辑器扩展——进度条显示通用方法

    在我们使用Unity编辑器扩展做一些批处理的工具时 通常会需要显示一个进度条 这样不会让Unity一直卡住不动 使得使用者不知道当前的进展 那么如何显示进度条呢 涉及的相关API有 EditorUtility ClearProgressBa
  • 运用transport tablespace进行快速oracle版本升级(9i-10g)

    运用transport tablespace进行快速oracle版本升级 9i 10g 大家可能都知道在进行oracle数据库版本升级的时候会有2种方式 1 通过dbua database upgrade assistant 2 exp i
  • 竞逐对话式AI,百度、字节各有千秋

    随着OpenAI陆续发布的ChatGPT引发了AI界热议 新一代的AI热度便开始持续走高 与此同时 以ChatGPT模型为代表的大型预训练模型的出现 也使得对话式AI的生成能力和智能水平得到了飞跃式的提升 得益于此 对话式AI的发展又开始受
  • GPIO使用( 一 )

    一 GPIO的两大功能 通用输入输出端口GPIO具有两大功能 一种是作为一个可控的端口引脚 另外一种是通过端口映射功能连接到芯片外设 最为常用的功能是 可以作为一个可控的端口引脚 配置该引脚为输入或者输出 输出功能包括强推挽输出和开漏输出两
  • Laddernet:基于UNet的医学分割多路径网络

    摘要 UNet是医学图像分割中的主流网络 以往的对于UNet网络的修改都是有一个跳跃连接的编码器和解码器组成 这种结构的信息流路径是有限的 本文提出的Laddernet 可以看成是一个由多个UNet组成的链 与原始的UNet不同 Ladde
  • 基于springboot,vue手机商城系统

    开发工具 IDEA 服务器 Tomcat9 0 jdk1 8 项目构建 maven 数据库 mysql5 7 系统分前后台 项目采用前后端分离 前端技术 vue elementUI 服务端技术 springboot mybatis plus
  • ubuntu下Gflags安装、配置、使用

    一 基础知识 1 Gflags是一种命令行解析工具 处理命令行参数的库 主要用于解析用命令行执行可执行文件时传入的参数 在gflags中flag可以分散的定义在各个文件之中 而不用定义在一起 这就意味着在我们可以在一个单独的文件中只定义这个
  • org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    idea下Maven项目 Spring Mybatis 查询时报错 org apache ibatis binding BindingException Invalid bound statement not found 解决方案 org
  • UE4 如何使用C++代码实现 在指定范围内随机生成同一个种类的不同物品(怪物,NPC,拾取物)的 自定义蓝图

    一 引言 在游戏世界中有特别多的物品 NPC 怪物 使用UE4中的蓝图我们可以摆放这些事务 但是如何在指定范围内随机生成同一个种类的不同事物呢 这就需要UE4 实现 C 自定义 蓝图功能 二 构思 首先我们构思一下实现上诉功能 应该怎么做
  • 抖音怎么上传无损画质_抖音上传视频为什么会模糊?如何才能上传高清无损视频?...

    很多初入抖音的朋友 制作好的视频本地预览没有问题 上传视频到抖音就模糊的不行不行的 特别是竖屏 小时候的黑白电视都比它强 最近私我的小伙伴问这个问题的一定多 所以干脆写篇回答 不知道你们有没有这种情况 今天小编就为大家分析一下产生模糊视频的
  • IE Sieve, Memory Leak detector for Internet Explorer

    IE Sieve Memory Leak detector for Internet Explorer sIEve is a project to get rid of memory leaks due to some limitation
  • 7.Simulink基础建模操作——选择判决运算

    欢迎订阅 FPGA MATLAB SIMULINK系列教程 目录 1 基于Simulink的选择判决运算模块简介 2 判决运算模块建模案例1
  • IOS开发-表视图LV3导航控制器

    学到这里感觉有点难了 其实这篇文章再草稿箱里放了好久了 最近对于学习的热情下降了 这不行 抓紧学习走起 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用 首先要了解一些概念 1 导航控制器 UINavigationContro
  • HTTP 协议中的 Transfer-Encoding

    HTTP 协议中的 Transfer Encoding 文章目录 Persistent Connection Content Length Transfer Encoding chunked 本文作为我的博客 HTTP 相关 专题新的一篇
  • 随机森林(RFC)实现模型优化与特征提取

    随机森林既可以进行分类也可以进行回归预测 这里通过随机森林 RFC 模型对汽油辛烷值RON进行特征提取与模型优化 一 导入相关的数据库 import matplotlib pyplot as plt from sklearn ensembl
  • MyBatis介绍及教程

    MyBatis简介 MyBatis 是支持定制化 SQL 存储过程以及高级映射的优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以对配置和原生Map使用简单的 XML 或注解