【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

目录

  • 一、学习内容
  • 二、数据库事务
  • 三、JDBC 的事务管理
  • 四、事务的四大特性
  • 五、MyBatis
  • 六、MyBatis 核心配置文件和基本使用
  • 七、查询 student 表
    • (1) 实体映射文件 mapper
    • (2) 读取核心配置文件, 拿到 SqlSession
  • 八、字段和属性名映射
    • (1) mapUnderscoreToCamelCase
    • (2) 完整的 settings 标签配置
  • 九、SqlSessionFactory 细节
  • 十、参数传递
    • (1) 参数占位符
    • (2) 代码测试
  • 十一、日志打印
  • 十二、多表查询
    • (1) 准备工作
    • (2) 多表查询

一、学习内容

  • SSM(Spring、SpringMVC、MyBatis)
  • Apache Shiro
  • SpringBoot

二、数据库事务

  • 事务:若将 N 个数据库操作(CRUD)放到同一个事务中,则这 N 个数据库操作最终要么全都生效,要么全都不生效

  • 开启事务【START TRANSACTION

  • 回滚事务:若事务中的某个数据库操作失败,其他所有数据库操作都需要回滚(恢复到开启事务之前的状态)【ROLLBACK

  • 提交事务:如果事务中的所有数据库操作都成功被执行,就提交事务(让这些操作正式生效)【COMMIT

在这里插入图片描述

【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第1张图片

三、JDBC 的事务管理

JDBC 中用 Connection 对象来管理事务
connection.setAutoCommit(false):开启事务(自己管理事务)
connection.rollback():回滚事务 (若执行某条语句的过程中出现异常,之前执行过的语句恢复到最初状态)
connection.commit()
提交事务 (若所有语句都被正常执行,没有出现异常,会正常提交事务,让所有语句的修改都生效)

四、事务的四大特性

① 原子性(Atomicity)
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行

② 一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是:数据库中的数据应满足完整性约束

③ 隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行

④ 持久性(Durability)
已被提交的事务对数据库的修改应该永久保存在数据库中

五、MyBatis

  • MyBatis 是一款优秀的持久层(Dao层)的框架

在这里插入图片描述

中文官网:https://mybatis.org/mybatis-3/zh/index.html

六、MyBatis 核心配置文件和基本使用

(1) 添加依赖(MyBatis 依赖喝 MySQL 数据库连接驱动包)

 <dependencies>
     
     <dependency>
         <groupId>mysqlgroupId>
         <artifactId>mysql-connector-javaartifactId>
         <version>5.1.49version>
     dependency>

     
     <dependency>
         <groupId>org.mybatisgroupId>
         <artifactId>mybatisartifactId>
         <version>3.5.5version>
     dependency>
 dependencies>

(2) 创建 MyBatis 的核心配置文件(文件名:mybatis-config.xml

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)

官方核心配置文件:https://mybatis.org/mybatis-3/zh/getting-started.html

【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第2张图片【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第3张图片


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
    
    <environments default="development">
        
        <environment id="development">
            
            <transactionManager type="JDBC"/>
            
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/study_mb"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            dataSource>
        environment>

        
        <environment id="production">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            dataSource>
        environment>
    environments>
configuration>

transactionManager 的 type 为 JDBC【采用 JDBC 方式来管理事务】
dataSource 的 type 为 POOLED【采用连接池的方式管理数据库连接】

【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第4张图片
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第5张图片


 CREATE TABLE `student` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(22) NOT NULL,
  `money` bigint(20) NOT NULL,
  `create_time` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
public class Student {
    private Long id;
    private String name;
    private Long money;
    private String createTime;

    public String getCreateTime() {
        return createTime;
    }


    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getMoney() {
        return money;
    }

    public void setMoney(Long money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", createTime='" + createTime + '\'' +
                '}';
    }
}

七、查询 student 表

(1) 实体映射文件 mapper

  • 实体映射文件
    ① 用于做实体类之间的映射
    ② 在 mapper 文件夹下创建
    【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第6张图片

  • 把映射文件的路径配置到核心配置文件(mybatis-config.xml)中
    ① 在核心配置文件中可通过 标签配置多个实体映射文件路径
    ② 在 标签中可配置多个 标签(每个 标签对应一个实体映射文件)
    【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第7张图片

【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第8张图片
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......_第9张图片


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="student">
    
    
    
    <select id="list" resultType="com.pojo.po.Student">
        SELECT * FROM student
    select>
mapper>

(2) 读取核心配置文件, 拿到 SqlSession

public class TestStudent {
    @Test
    public void testSelect() throws Exception {
        // 读取 MyBatis 的核心配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        // 创建工厂构建器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 创建工厂
        SqlSessionFactory factory = builder.build(reader);
        // 创建 SqlSession
        SqlSession sqlSession = factory.openSession();

        // 通过 sqlSession 执行 SQL 语句
        // 参数是  标签中的 namespace 和