MyBatis 介绍

MyBatis 是一款优秀的 ORM(Object Relational Mapping,对象关系映射)框架,它可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它是 Apache 提供的一个开源项目,之前的名字叫做 iBatis,2010 年迁移到了 Google Code,并且将名字改为我们现在所熟知的 MyBatis,又于 2013 年 11 月迁移到了 Github。

MyBatis 提供了普通 SQL 查询、事务、存储过程等功能,它的优缺点如下。

优点

  • 相比于 JDBC 需要编写的代码更少
  • 使用灵活,支持动态 SQL
  • 提供映射标签,支持对象与数据库的字段关系映射

缺点

  • SQL 语句依赖于数据库,数据库移植性差
  • SQL 语句编写工作量大,尤其在表、字段比较多的情况下

总体来说,MyBatis 是一个非常优秀和灵活的数据持久化框架,适用于需求多变的互联网项目,也是当前主流的 ORM 框架。

MyBatis 重要组件

MyBatis 中的重要组件如下:

  • Mapper 配置:用于组织具体的查询业务和映射数据库的字段关系,可以使用 XML 格式或 Java 注解格式来实现;
  • Mapper 接口:数据操作接口也就是通常说的 DAO 接口,要和 Mapper 配置文件中的方法一一对应;
  • Executor:MyBatis 中所有的 Mapper 语句的执行都是通过 Executor 执行的;
  • SqlSession:类似于 JDBC 中的 Connection,可以用 SqlSession 实例来直接执行被映射的 SQL 语句;
  • SqlSessionFactory:SqlSessionFactory 是创建 SqlSession 的工厂,可以通过 SqlSession openSession() 方法创建 SqlSession 对象。

MyBatis 执行流程

MyBatis 完整执行流程如下图所示:

MyBatis 执行流程说明:

  1. 首先加载 Mapper 配置的 SQL 映射文件,或者是注解的相关 SQL 内容。
  2. 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
  3. 创建会话,根据会话工厂,MyBatis 就可以通过它来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含了对数据库操作的增、删、改、查方法。
  4. 创建执行器,因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
  5. 封装 SQL 对象,在这一步,执行器将待处理的 SQL 信息封装到一个对象中(MappedStatement),该对象包括 SQL 语句、输入参数映射信息(Java 简单类型、HashMap 或 POJO)和输出结果映射信息(Java 简单类型、HashMap 或 POJO)。
  6. 操作数据库,拥有了执行器和 SQL 信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。

MyBatis XML 版

MyBatis 使用分为两个版本:XML 版和 Java 注解版。接下来我们使用 Spring Boot 结合 MyBatis 的 XML 版,来实现对数据库的基本操作,步骤如下。

1)创建数据表

  1. drop table if exists `t\_user`;
  2. create table `t\_user` (
  3. `id` bigint(20) not null auto_increment comment '主键id',
  4. `username` varchar(32) default null comment '用户名',
  5. `password` varchar(32) default null comment '密码',
  6. `nick\_name` varchar(32) default null,
  7. primary key (`id`)
  8. ) engine=innodb auto_increment=1 default charset=utf8;

2)添加依赖

在项目添加对 MyBatis 和 MySQL 支持的依赖包,在 pom.xml 文件中添加如下代码:

  1. \<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --\>
  2. \<dependency\>
  3. \<groupId\>org.mybatis.spring.boot\</groupId\>
  4. \<artifactId\>mybatis-spring-boot-starter\</artifactId\>
  5. \<version\>2.1.0\</version\>
  6. \</dependency\>
  7. \<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --\>
  8. \<dependency\>
  9. \<groupId\>mysql\</groupId\>
  10. \<artifactId\>mysql-connector-java\</artifactId\>
  11. \<version\>8.0.16\</version\>
  12. \</dependency\>

mybatis-spring-boot-starter 是 MyBatis 官方帮助我们快速集成 Spring Boot 提供的一个组件包,mybatis-spring-boot-starter 2.1.0 对应 MyBatis 的版本是 3.5.2。

3)增加配置文件

在 application.yml 文件中添加以下内容:

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/learndb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  4. username: root
  5. password: root
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. mybatis:
  8. config-location: classpath:mybatis/mybatis-config.xml
  9. mapper-locations: classpath:mybatis/mapper/*.xml
  10. type-aliases-package: com.interview.mybatislearning.model

其中:

  • mybatis.config-location:配置 MyBatis 基础属性;
  • mybatis.mapper-locations:配置 Mapper 对应的 XML 文件路径;
  • mybatis.type-aliases-package:配置项目中实体类包路径。

注:如果配置文件使用的是 application.properties,配置内容是相同的,只是内容格式不同。

4)创建实体类

  1. public class UserEntity implements Serializable {
  2. private static final long serialVersionUID = -5980266333958177104L;
  3. private Integer id;
  4. private String userName;
  5. private String passWord;
  6. private String nickName;
  7. public UserEntity(String userName, String passWord, String nickName) {
  8. this.userName = userName;
  9. this.passWord = passWord;
  10. this.nickName = nickName;
  11. }
  12. public Integer getId() {
  13. return id;
  14. }
  15. public void setId(Integer id) {
  16. this.id = id;
  17. }
  18. public String getUserName() {
  19. return userName;
  20. }
  21. public void setUserName(String userName) {
  22. this.userName = userName;
  23. }
  24. public String getPassWord() {
  25. return passWord;
  26. }
  27. public void setPassWord(String passWord) {
  28. this.passWord = passWord;
  29. }
  30. public String getNickName() {
  31. return nickName;
  32. }
  33. public void setNickName(String nickName) {
  34. this.nickName = nickName;
  35. }
  36. }

5)创建 XML 文件

mybatis-config.xml(基础配置文件):

  1. \<?xml version="1.0" encoding="UTF-8" ?\>
  2. \<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"\>
  3. \<configuration\>
  4. \<typeAliases\>
  5. \<typeAlias alias="Integer" type="java.lang.Integer"/\>
  6. \<typeAlias alias="Long" type="java.lang.Long"/\>
  7. \<typeAlias alias="HashMap" type="java.util.HashMap"/\>
  8. \<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/\>
  9. \<typeAlias alias="ArrayList" type="java.util.ArrayList"/\>
  10. \<typeAlias alias="LinkedList" type="java.util.LinkedList"/\>
  11. \</typeAliases\>
  12. \</configuration\>

mybatis-config.xml 主要是为常用的数据类型设置别名,用于减少类完全限定名的长度,比如:resultType="Integer" 完整示例代码如下:

  1. \<select id="getAllCount" resultType="Integer"\>
  2. select
  3. count(*)
  4. from t_user
  5. \</select\>

UserMapper.xml(业务配置文件):

  1. \<?xml version="1.0" encoding="UTF-8" ?\>
  2. \<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" \>
  3. \<mapper namespace="com.interview.mybatislearning.mapper.UserMapper"\>
  4. \<resultMap id="BaseResultMap" type="com.interview.mybatislearning.model.UserEntity" \>
  5. \<id column="id" property="id" jdbcType="BIGINT" /\>
  6. \<result column="username" property="userName" jdbcType="VARCHAR" /\>
  7. \<result column="password" property="passWord" jdbcType="VARCHAR" /\>
  8. \<result column="nick\_name" property="nickName" jdbcType="VARCHAR" /\>
  9. \</resultMap\>
  10. \<sql id="Base\_Column\_List" \>
  11. id, username, password, nick_name
  12. \</sql\>
  13. \<sql id="Base\_Where\_List"\>
  14. \<if test="userName != null and userName != ''"\>
  15. and userName = #{userName}
  16. \</if\>
  17. \</sql\>
  18. \<select id="getAll" resultMap="BaseResultMap" \>
  19. SELECT
  20. \<include refid="Base\_Column\_List" /\>
  21. FROM t_user
  22. \</select\>
  23. \<select id="getOne" parameterType="Long" resultMap="BaseResultMap" \>
  24. SELECT
  25. \<include refid="Base\_Column\_List" /\>
  26. FROM t_user
  27. WHERE id = #{id}
  28. \</select\>
  29. \<insert id="insert" parameterType="com.interview.mybatislearning.model.UserEntity" \>
  30. INSERT INTO
  31. t_user
  32. (username,password,nick_name)
  33. VALUES
  34. (#{userName}, #{passWord}, #{nickName})
  35. \</insert\>
  36. \<update id="update" parameterType="com.interview.mybatislearning.model.UserEntity" \>
  37. UPDATE
  38. t_user
  39. SET
  40. \<if test="userName != null"\>username = #{userName},\</if\>
  41. \<if test="passWord != null"\>password = #{passWord},\</if\>
  42. nick_name = #{nickName}
  43. WHERE
  44. id = #{id}
  45. \</update\>
  46. \<delete id="delete" parameterType="Long" \>
  47. DELETE FROM
  48. t_user
  49. WHERE
  50. id =#{id}
  51. \</delete\>
  52. \</mapper\>

以上配置我们增加了增删改查等基础方法。

6)增加 Mapper 文件

此步骤我们需要创建一个与 XML 对应的业务 Mapper 接口,代码如下:

  1. public interface UserMapper {
  2. List\<UserEntity\> getAll();
  3. UserEntity getOne(Long id);
  4. void insert(UserEntity user);
  5. void update(UserEntity user);
  6. void delete(Long id);
  7. }

7)添加 Mapper 包扫描

在启动类中添加 @MapperScan,设置 Spring Boot 启动的时候会自动加载包路径下的 Mapper。

  1. @SpringBootApplication
  2. @MapperScan("com.interview.mybatislearning.mapper")
  3. public class MyBatisLearningApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(MyBatisLearningApplication.class, args);
  6. }
  7. }

8)编写测试代码

经过以上步骤之后,整个 MyBatis 的集成就算完成了。接下来我们写一个单元测试,验证一下。

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class MybatislearningApplicationTests {
  4. @Resource
  5. private UserMapper userMapper;
  6. @Test
  7. public void testInsert() {
  8. userMapper.insert(new UserEntity("laowang", "123456", "老王"));
  9. Assert.assertEquals(1, userMapper.getAll().size());
  10. }
  11. }

总结

通过本文我们知道 MyBatis 是一个优秀和灵活的数据持久化框架,MyBatis 包含 Mapper 配置、Mapper 接口、Executor、SqlSession、SqlSessionFactory 等几个重要的组件,知道了 MyBatis 基本流程:MyBatis 首先加载 Mapper 配置和 SQL 映射文件,通过创建会话工厂得到 SqlSession 对象,再执行 SQL 语句并返回操作信息。我们也使用 XML 的方式,实现了 MyBatis 对数据库的基础操作。


欢迎关注我的公众号,回复关键字“Java” ,将会有大礼相送!!! 祝各位面试成功!!!



%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.png)

MyBatis 介绍的更多相关文章

  1. MyBatis - 介绍、简单入门程序

    JDBC编程中的问题     1. 将SQL语句硬编码到Java代码,不利于系统维护.         设想如何解决:将SQL单独抽取出来,在配置文件(xml方式.properties文件)进行配置. ...

  2. Mybatis学习笔记(一) —— mybatis介绍

    一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

  3. (转)MyBatis框架的学习(一)——MyBatis介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/71699343 MyBatis介绍 MyBatis本是apache的一个开源项目iBatis,2 ...

  4. mybatis介绍--基于个人学习JavaWeb的使用

    mybatis介绍 该博文放在javaWeb系列下,目的是记录我们javaWeb阶段所学的知识 @time=2022/3/11/11:52(最近休息玩了两天,今天重新启动生活) 一.mybatis发展 ...

  5. mybatis介绍与环境搭建

    一.不用纯jdbc的原因,即缺点. 1.数据库理解,使用时创建,不用时释放,会对数据库进行频繁的链接开启和关闭,造成数据库的资源浪费,影响数据库的性能.设想:使用数据库的连接池.2.将sql语句硬编码 ...

  6. 深入浅出MyBatis:JDBC和MyBatis介绍

    JDBC相关概念 Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,JDBC是由SUN公司提出的一些列规范,只定义了接口规范,具体实现由各个数据库厂商去实现,它是一种典型的桥接模式. ...

  7. MyBatis介绍及使用

    一.介绍: 1.MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 2.和数据库打交道的技术有: 原生的JDBC技术--->Spring的JdbcTe ...

  8. mybatis介绍安装

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

  9. Mybatis介绍(一)

    这里介绍的mybatis比较简单, 我做为一个初学者, 记录下个人在学习中方法, 如果那里出错, 希望读者朋友们见谅. 首先这里介绍一下我们下面用的表结构: author表是保存了作者的个人信息, 因 ...

随机推荐

  1. DOCKER学习_008:Docker容器的运行最佳实践

    一 容器分类 容器按用途大致可分为两类: 服务类容器,如 web server. database等 工具类容器,如cur容器, Iredis-cli容器 通常而言,服务类容器需要长期运行,所以使用 ...

  2. js对当前时间进行处理

    //1.JS获取两个日期之间相差的天数 function getDaysBetween(dateString1, dateString2) { var startDate = Date.parse(d ...

  3. 对sql server查询速度的优化

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...

  4. 20191017-8 alpha week 2/2 Scrum立会报告+燃尽图 07

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9804 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐 ...

  5. 洛谷$P2050\ [NOI2012]$美食节 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...

  6. HDU3709 Balanced Number 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题目大意: 求区间 \([x, y]\) 范围内"平衡数"的数量. 所谓平衡 ...

  7. js绑定下拉框数据源

    ··· buildRule:function (ruleId) { var ruleList = internal.ruleList; if(ruleList){ var programme_sel= ...

  8. 【一起学源码-微服务】Eureka+Ribbon+Feign阶段性总结

    前言 想说的话 这里已经梳理完Eureka.Ribbon.Feign三大组件的基本原理了,今天做一个总结,里面会有一个比较详细的调用关系流程图. 说明 原创不易,如若转载 请标明来源! 博客地址:一枝 ...

  9. Eclipse自动添加注释模板

    Eclipse使用自动注释:在Eclipse工具的Window\preferences\JAVA\Code Style\Code templates\Comments下设置以下模版 文件(Files) ...

  10. 【转】7本免费的Java电子书和教程

    本文由 ImportNew - 唐小娟 翻译自 Javapapers.如需转载本文,请先参见文章末尾处的转载要求. 1. Thinking in Java (Third Edition) 本书的作者是 ...