当前位置: 首页 > ops >正文

MyBatis源码解读1(MyBatis回顾)

一、MyBatis回顾

我们先做一个MyBatis的简单回顾。

1.1、MyBatis是做什么

MyBatis是一个ORM框架,解决的的是数据库访问和操作的问题,是对现有的JDBC的封装。

1.2、搭建MyBatis环境

首先我们需要准备一下MyBatis所需要的依赖jar包。

<!-- myBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency>
​<!-- mysql驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency>

准备好依赖后我们就要去准备一下配置文件。MyBatis主要是有两类配置文件:

  1. 基本配置文件:mybatis-config.xml
  2. 写sql的文件:mapper.xml

1.2.1、mybatis-confi.xml

我们先来写一套mybatis-config的模板,然后根据每一个不同的板块详解。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ydlclass?characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="root"/></properties>
​<typeAliases><package name="com.ydlclass.mybatissourcestudy.entity"/></typeAliases>
​<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>
​<mappers><mapper resource="mappers/AccountMapper.xml"/></mappers>
</configuration>

我们首先来看environments这个标签。

    <environments default="myssql"><environment id="myssql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>

environments标签意味着我们可以配置多个,我们只需要在environments标签里面多加几个environment即可,但是要确保id不同即可。

<environments default="myssql"><environment id="myssql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment><environment id="orcal"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>

在设置完多个数据源以后,我们还需要一个默认开启的数据源,此时我们就可以在environments标签的default属性中写上我们需要默认开启的数据源即可。一旦涉及到了多数据源的话,就会出现一个特别恶心的事情,那即是我们的事务不好控制

1.2.2、测试MyBatis

首先我们需要引入必须的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
​<groupId>cn.linstudy</groupId><artifactId>MyBatisSource</artifactId><version>1.0-SNAPSHOT</version>
​<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
​<dependencies><!-- myBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency>
​<!-- mysql驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
​<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency>
​<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.0.7</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency>
​<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency></dependencies>
​
</project>

然后简单的创建一张表dept。

CREATE TABLE `dept` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

然后创建实体类。

package cn.linstudy.pojo;
​
import lombok.Data;
​
/*** @Description* @Date 2023/6/18* @Author XiaoLin*/
@Data
public class Dept {
​private Integer id;private String name;
}
​

接着开始写mapper接口和mapper.xml

package cn.linstudy.mapper;
​
import cn.linstudy.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
​
import java.util.List;
​
/*** @Description* @Date 2023/6/18* @Author XiaoLin*/
@Mapper
public interface DeptMapper {
​List<Dept> listAllDept();
}
​
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.linstudy.mapper.DeptMapper">
​<select id="listAllDept" resultType="cn.linstudy.pojo.Dept">select id , name from dept;</select>
</mapper>
​

最后就可以开始测试了。

package cn.linstudy;
​
import cn.linstudy.mapper.DeptMapper;
import cn.linstudy.pojo.Dept;
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.Test;
​
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
​
/*** @Description* @Date 2023/6/18* @Author XiaoLin*/
public class TestMyBatis {
​@Testpublic void test1() throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);List<Dept> depts = deptMapper.listAllDept();for (Dept dept : depts) {System.out.println(dept);}
​}
​
}

运行测试类,出现了我们表中的数据即表示我们的环境搭建是成功的。

image-20230618125027921

这段代码中比较重要的一句话就是通过IO获取输入流。

 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

通过IO方式打开输入流,获取mybatis-config.xml以及xxxMapper.xml,因为在mybatis-config.xml中已经配置好了mapper文件的路径,所以在以一次的IO中把两者的信息都读到了。

如果有知道ibatis(mybatis的前身)的话,还有另外一种比较古老的写法。他的区别是在于不再通过sqlSession.getMapper()方法去获取mapper,而是通过sqlSession.selectList(),里面传入对应的mapper的全路径以及对应的方法名来获取到对应的数组对象。

    @Testpublic void test2() throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();List<Dept> depts = sqlSession.selectList("cn.linstudy.mapper.DeptMapper.listAllDept");for (Dept dept : depts) {System.out.println(dept);}}

这两种方法的实现效果是一样的,但是哪一种比较好呢?当然是第一种比较好,因为我们平时写的就是第一种。答案是因为第一种表达的概念更加清晰,就更加直观,deptMapper.listAllDept()很明显就是deptMapper的listAllDept方法,而且是对部门进行操作的,这种方式更符合面向对象的概念。

那么第一种是如何实现的呢?其实很简单,其实第一种本质上是对第二种的进一步封装,封装的实现方法是使用了代理设计模式。

http://www.xdnf.cn/news/5463.html

相关文章:

  • 微调重排序模型:Reranking从入门到实践
  • GPU Gems1-Effective Water Simulation from Physical Models
  • RHCSA Linux系统 Web页面 论坛 网盘的搭建
  • 沈燕谈艺:把现代科学基因融入古典笔墨中
  • OrangePi Zero 3学习笔记(Android篇)6 - hid-ft260
  • Redis设计与实现——单机Redis实现
  • 光线传感器BH1750
  • springboot3学习
  • 部署Superset BI(五)连接oracle数据库失败
  • LangChain入门(七) 提取和输出结构化数据
  • 【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析
  • Day116 | 灵神 | 二叉树 | 二叉搜索树中第K小的元素
  • 软件测试复习第五章
  • 利用类型别名定义复杂联合类型和交叉类型
  • cheat engine: Scan error no readable memory found
  • 学习通刷课稳定版(美化面板+完全免费)
  • 【RP2350】香瓜树莓派RP2350之新建工程
  • JAVA 锁—— synchronized
  • linux 三剑客命令学习
  • C++基本知识 —— 缺省参数·函数重载·引用
  • 蓝桥杯14届国赛 合并数列
  • 【Python 算法零基础 2.模拟 ⑤ 基于栈和队列】
  • 【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式
  • 【AI智能推荐系统】第八篇:可解释AI在推荐系统中的实践与价值
  • 深度优先与广度优先:如何用算法思维优化学习策略?
  • 250510-Linux离线配置N8N环境+屏蔽外网请求
  • python使用AES进行加密和解密
  • JavaSE基础
  • python: 为项目创建单独的虚拟环境步骤
  • QSS样式表的选择器