Mybatis从小白到小黑(一)Mybatis的原理介绍及超详细使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects。

听说微信搜《Java鱼仔》会让技术更进一步哦!


(一)MyBatis简单介绍:


MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects。


简而言之,MyBatis是一个能将传统JDBC变得很方便和易于维护的框架。我们只需要提供SQL语句,而建立连接,创建Statement,处理JDBC异常等工作都可以交给MyBatis去做。


mybatis官方中文网站:mybatis.org/mybatis-3/z…


学习技术还是强烈建议大家通过官网学习,并参考博客,形成自己的一份见解。本系列文章基于Mybatis官方文档编写。


(二)MyBatis环境搭建:


在这里我们使用maven仓库来引入对应的依赖,我们选一个用的最多的maven仓库

maven仓库:


<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency>

2.1 创建一个数据库用于mybatis的学习

create database `mybatis`;
use mybatis;
create table `user`(
  `id` INT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(40) DEFAULT NULL,
  primary key(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into user(name) values('javayz'),('zhangsan')

这里主要建了一个数据库,并新建一张user表,并往里面插入两条数据,虽然现在数据库的可视化工具很多,还是建议大家平常联系中手动编写sql语句。


2.2 新建项目


新建一个maven项目,并导入mybatis的相关依赖,我们需要在pom.xml中导入三个依赖:mysql驱动依赖、mybatis依赖以及junit依赖用于测试。


<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

2.3 创建mybatis配置文件


每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。


SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。


而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。


有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。


SqlSession 提供了在数据库执行 SQL 命令所需的所有方法


上面这几句话就是从官方中文文档中获取整合的,MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心,我们需要首先建立一个mybatis的配置文件。官方文档中把配置文件的名称叫做mybatis-config.xml。


我们在resources目录下新建这样一个配置文件mybatis-config.xml


<?xmlversion="1.0" encoding="UTF8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></dataSource></environment></environments><!--每个mapper.xml都需要在mybatis配置文件中进行配置--><mappers><mapperresource="com/javayz/mapper/UserMapper.xml"/></mappers></configuration>

这一段代码同样来自于官方文档,配置了事务管理器为JDBC,以及连接需要的一些属性,这些属性改成自己的配置。


最后mappers标签中需要加入接下来在代码中写的mapper.xml路径,不然运行时会报以下错误:


org.apache.ibatis.binding.BindingException: Type interface com.javayz.mapper.UserMapper is not known to the MapperRegistry.

2.4 编写工具类


接下来的步骤应该是去获取配置文件并构建SqlSessionFactory,官网提供了这样一段代码:


Stringresource="org/mybatis/example/mybatis-config.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

这里我们去编写一个工具类来实现以后需要多次实现的内容。


新建一个utils包,并在utils包下创建MybatisUtils类


publicclassMybatisUtils {
privatestaticSqlSessionFactorysqlSessionFactory;
static {
//获取SqlSessionFactory工厂类Stringresource="mybatis-config.xml";
InputStreaminputStream=null;
try {
inputStream=Resources.getResourceAsStream(resource);
        } catch (IOExceptione) {
e.printStackTrace();
        }
sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
    }
//通过SqlSessionFactory获取SqlSession实例publicstaticSqlSessiongetSqlSession(){
returnsqlSessionFactory.openSession();
    }
}

通过上面的工具类即可获取到sqlSession实例,剩下的就是对sqlSession一系列操作了。


(三) Mybatis代码实践


首先编写一个实体类User,这一块的代码不作介绍了


publicclassUser {
privateintid;
privateStringname;
//......//省略构造方法、get、set、toString方法}

SqlSession对数据库的操作既可以使用XML方式也可以使用注解的方式,我们这里先介绍XML的方式,还是参考官方中文文档里面的xml代码。


新建一个名称为mapper的包,在里面新建一个UserMapper接口以及UserMapper.xml


publicinterfaceUserMapper {
List<User>getUserList();
}

UserMapper.xml


<?xmlversion="1.0"encoding="UTF8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.javayz.mapper.UserMapper"><selectid="getUserList"resultType="com.javayz.pojo.User">select*fromuser;
</select></mapper>

xml文件中有几个点需要提一下,首先是namespace,每一个接口对应一个命名空间,这个命名空间就是接口的全路径。其次还需要注意resultType,也就是返回的类型,如果只填User也无法被找到。


最后在test包下编写测试类


publicclassUserMapperTest {
@Testpublicvoidtest(){
//获取SqlSessionSqlSessionsqlSession=MybatisUtils.getSqlSession();
//执行SqlUserMappermapper=sqlSession.getMapper(UserMapper.class);
List<User>userList=mapper.getUserList();
System.out.println(userList);
sqlSession.close();
    }
}

如果一切顺利这里就会输出正确结果,但是很有可能会出现下面这段报错信息

ErrorparsingSQLMapperConfiguration. Cause: java.io.IOException: Couldnotfindresourcecom/javayz/mapper/UserMapper.xml

意思是找不到UserMapper.xml这个文件,但我们明明有,这里的问题是maven在编译过程中没有将上面的xml文件导出,我们需要在pom.xml中增加下面一段来配置resources


<build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>

最终输出正确结果。


(四)作用域和生命周期


在上面编写工具类的时候,我们用到了三个类:SqlSessionFactoryBuilderSqlSessionFactorySqlSession


由于SqlSession不是线程安全的,意味着在并发情况下使用不当会造成很严重的并发问题,因此我们有必要讨论这三个类的作用域以及生命周期。


首先SqlSessionFactoryBuilder是用来创建SqlSessionFactory的,用完之后就可以丢弃,因此将SqlSessionFactoryBuilder放到方法作用域内即可。


SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,因此我们将它放到应用作用域,在工具类中我将其设置成一个静态变量,这样就不会多次去创建。


SqlSession 的实例不是线程安全的,SqlSession 只在一个方法或者一个请求中使用,并且使用完之后必须关闭它。参考我上面的UserMapperTest 类,创建SqlSession 以及关闭SqlSession 都在一个方法中完成。


注意如果你使用的是依赖注入框架如MyBatis-Spring,就不必关注生命周期,因为依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器


(五)总结


整体来看Mybatis的使用好像和jdbc相比没有方便多少,那是因为到现在为止我们做的都是各种配置,而等配置完成后,我们需要做的只不过是在mapper下写各种增删改查罢了。



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL XML Java
|
5月前
|
SQL XML Java
一文搞懂Mybatis执行原理
一文搞懂Mybatis执行原理
143 1
|
5月前
|
SQL Java 数据库连接
mybatis常见分页技术和自定义分页原理实战
mybatis常见分页技术和自定义分页原理实战
152 0
|
3月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List&lt;User&gt; users = userMapper.getAllUsers(); PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(users); 这使得分页查询变得简单且能获取总记录数等信息。
|
4月前
|
SQL Java 数据库连接
深入探索MyBatis Dynamic SQL:发展、原理与应用
深入探索MyBatis Dynamic SQL:发展、原理与应用
|
3月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
50 0
|
4月前
|
Java 数据库连接 数据库
MyBatis TypeHandler详解:原理与自定义实践
MyBatis TypeHandler详解:原理与自定义实践
|
4月前
|
SQL Java 数据库连接
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践
|
5月前
|
存储 缓存 Java
探秘MyBatis缓存原理:Cache接口与实现类源码分析
探秘MyBatis缓存原理:Cache接口与实现类源码分析
83 2
探秘MyBatis缓存原理:Cache接口与实现类源码分析
|
5月前
|
SQL 缓存 Java
MyBatis原理分析之获取SqlSessionFactory
MyBatis原理分析之获取SqlSessionFactory
182 0