一、 MyBatis了解

  1. MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects,普通 Java 对象)为数据库中的记录。---来自官网

二、MyBatis 整体架构

image.png

2.1 MyBatis 执行SQL流程图示

MyBatis之入门 - 图2

2.2 各个组件解析了解

2.2.1 Mybatis配置文件(mybatis-config.xml)

https://mybatis.org/mybatis-3/zh/configuration.html

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 配置设置
  7. https://mybatis.org/mybatis-3/zh/configuration.html
  8. -->
  9. <settings>
  10. <setting name="" value=""/>
  11. </settings>
  12. <!-- 标签用于配置环境信息-->
  13. <environments default="development">
  14. <environment id="development">
  15. <transactionManager type="JDBC"/>
  16. <dataSource type="POOLED">
  17. <property name="driver" value="org.h2.Driver"/>
  18. <property name="url" value="jdbc:h2:/home/hdj/db/h2db"/>
  19. <property name="username" value="admin"/>
  20. <property name="password" value="admin"/>
  21. </dataSource>
  22. </environment>
  23. </environments>
  24. <!-- Mapper文件-->
  25. <mappers>
  26. <mapper resource="mybatis/UserMapper.xml"/>
  27. </mappers>
  28. </configuration>

2.2.2 SqlSessionFactory

SqlSessionFactory使用SqlSessionFactoryBuilder对象获得的,SqlSessionFactoryBuilder可以通过预先定制的configuration或者xml配置文件的实例构建出SqlSessionFactory,SqlSessionFactory是线程安全的,一旦被创建,应用在执行期间都会存在,SqlSessionFactory也是创建SqlSession的工厂。可以通过SqlSession.openSession()创建SqlSession对象。

2.2.3 SqlSession

SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。

2.2.4 Executor执行器
  • SimpleExecutor
  • ResueExecutor
  • BatchExecutor

Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。

image.png

2.2.5 MappedStatement

MappedStatement:MappedStatement用于描述Mapper中的SQL配置信息,是对MapperXML配置文件中等标签或者@Select/@Update等注解配置信息的封装。

2.2.6 TypeHandler 类型转换器

TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。

2.3 MyBatis 中的工具类了解

  • SQL 语句构建器
  • ScriptRunner 执行sql脚本
  • SqlRunner操作数据库
  • MetaObject 反射工具类
  • ObjectFactory是MyBatis中的对象工厂
  • ProxyFactory是MyBatis中的代理工厂

三、MyBatis 入门例子

3.1 创建Maven项目,引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>MyBatis-Learning</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <mybatis-version>3.5.5</mybatis-version>
  11. <h2-version>1.4.200</h2-version>
  12. <lombox-version>1.18.12</lombox-version>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.mybatis</groupId>
  17. <artifactId>mybatis</artifactId>
  18. <version>${mybatis-version}</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.h2database</groupId>
  22. <artifactId>h2</artifactId>
  23. <version>${h2-version}</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.projectlombok</groupId>
  27. <artifactId>lombok</artifactId>
  28. <version>${lombox-version}</version>
  29. <scope>provided</scope>
  30. </dependency>
  31. </dependencies>
  32. <build>
  33. <resources>
  34. <resource>
  35. <!-- 描述存放资源的目录,该路径相对POM路径-->
  36. <directory>src/main/java</directory>
  37. <includes>
  38. <include>**/*.xml</include>
  39. </includes>
  40. </resource>
  41. </resources>
  42. </build>
  43. </project>

3.2 创建表数据(自行连接H2)

  1. CREATE TABLE `user` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` varchar(100) NOT NULL,
  4. `age` int(11) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. );
  7. insert into `user` (`id`,`name`,`age`) values (1, 'Jerry', 27);
  8. insert into `user` (`id`,`name`,`age`) values (2, 'Angel', 25);

3.4 创建MyBatis 配置文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 标签用于配置环境信息-->
  7. <environments default="development">
  8. <environment id="development">
  9. <transactionManager type="JDBC"/>
  10. <dataSource type="POOLED">
  11. <property name="driver" value="org.h2.Driver"/>
  12. <property name="url" value="jdbc:h2:/home/hdj/db/h2db;AUTO_SERVER=TRUE"/>
  13. <property name="username" value="admin"/>
  14. <property name="password" value="admin"/>
  15. </dataSource>
  16. </environment>
  17. </environments>
  18. <!-- Mapper文件-->
  19. <mappers>
  20. <mapper resource="mybatis/UserMapper.xml"/>
  21. </mappers>
  22. </configuration>

3.5 MyBatis 操作

  • 实体类

    1. @Data
    2. public class User {
    3. private Integer id;
    4. private String name;
    5. private Integer age;
    6. }
  • DAO接口

    1. public interface UserMapper {
    2. List<User> selectAll();
    3. }
  • UserMapper.xml 文件(与UserMapper接口同一文件夹下)

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="cn.hdj.mybatis.demo.dao.UserMapper">
    6. <select id="selectAll" resultType="cn.hdj.mybatis.demo.entity.User">
    7. select * from user
    8. </select>
    9. </mapper>
  • 查询 ```xml public class SqlSessionFactoryBuildWithXml {

    public static void main(String[] args) throws IOException {

    1. //读取配置文件
    2. String resource = "mybatis-config.xml";
    3. InputStream inputStream = Resources.getResourceAsStream(resource);
    4. //构造SqlSessionFactory
    5. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    6. //创建SqlSession
    7. try (SqlSession session = sqlSessionFactory.openSession()) {
    8. //获取Mapper接口
    9. UserMapper mapper = session.getMapper(UserMapper.class);
    10. //执行sql
    11. List<User> users = mapper.selectAll();
    12. System.out.println(users);
    13. }

    }

```

四、扩展知识点

4.1 MyBatis 命名空间的作用有两个

  • 利用更长的全限定名来将不同的语句隔离开来
  • 实现了SQL语句与接口的绑定

    4.2 Java SPI 机制

    https://crossoverjie.top/2020/02/24/wheel/cicada8-spi/

    4.3 JDBC 连接步骤

  • (1)与数据源建立连接。

  • (2)执行SQL语句。
  • (3)检索SQL执行结果。
  • (4)关闭连接。

    4.4 JDBC事务

  • 自动提交模式

  • 事务隔离级别
    • 脏读
    • 不可重读
    • 幻影读
  • 保存点

4.5 如何自定义存放Mapper.xml文件路径

  1. UserMapper 接口与UserMapper.xml 不在同一文件夹内,会报错?
    https://my.oschina.net/wangdaoliang/blog/652266

项目地址

https://github.com/h-dj/Mybatis-Learning

参考