跳至主要內容
javaweb - Mybatis7

Mybatis详解5

动态SQL

批处理 ExecutorType.BATCH

在之前JDBC讲解的时候,我们就提到过批量执行语句的问题,当我们要执行很多条语句时,可能会一个一个地提交:

//现在要求把下面所有用户都插入到数据库中
List<String> users = List.of("小刚", "小强", "小王", "小美", "小黑子");
//使用for循环来一个一个执行insert语句
for (String user : users) {
    statement.executeUpdate("insert into user (name, age) values ('" + user + "', 18)");
}

codejavawebmybatis大约 5 分钟
javaweb - Mybatis8

Mybatis详解6

缓存机制

其实缓存机制我们在之前学习IO流的时候已经提及过了,我们可以提前将一部分内容放入缓存,下次需要获取数据时,就可以直接从缓存中读取,这样的话相当于直接从内存中获取而不是再去向数据库索要数据,效率会更高,缓存的概念在我们后续的学习中还会经常遇见,它也是现在提高数据获取效率的良好解决方案。

Mybatis为了查询效率,同样内置了一个缓存机制,我们在查询时,如果Mybatis缓存中存在数据,那么我们就可以直接从缓存中获取,而不是再去向数据库进行请求,节省性能开销。

alt text

codejavawebmybatis大约 7 分钟
javaweb - Mybatis9

Mybatis详解7

使用注解开发

在之前的学习中,我们已经体验到Mybatis为我们带来的便捷了

我们只需要编写对应的映射器,并将其绑定到一个接口上,即可直接通过该接口执行我们的SQL语句,极大的简化了我们之前JDBC那样的代码编写模式。

那么,能否实现无需XML映射器配置,而是直接使用注解在接口上进行配置呢?

我们可以直接删除掉所有的Mapper.xml文件了,只保留Mapper相关的接口。


codejavawebmybatis大约 7 分钟
javaweb - Mybatis5

Mybatis详解3

复杂查询

一对一查询

首先来看最简单的一对一查询,假设我们每个用户都有一个自己的详细信息表:

alt text

这里的id与用户id一致,作为用户id的逻辑外键,表示对应用户的详细信息。对应的实体类为:

@Data
public class UserDetail {
    int id;
    String description;
    Date register;
    String avatar;
}

@Data
public class User {
    int id;
    String name;
    int age;
    UserDetail detail;
}

codejavawebmybatis大约 6 分钟
javaweb - Mybatis6

Mybatis详解4

DML 操作

前面我们介绍了查询操作,我们接着来看修改相关操作(增、删、改)。

Mybatis为我们的DML操作提供了几个预设方法:

int insert(String statement);
int insert(String statement, Object parameter);
int update(String statement);
int update(String statement, Object parameter);
int delete(String statement);
int delete(String statement, Object parameter);

codejavawebmybatis大约 4 分钟
javaweb - Mybatis3

Mybatis详解1

由于SqlSessionFactory一般只需要创建一次,因此我们可以创建一个工具类来集中创建SqlSession,这样会更加方便一些:

public class MybatisUtil {

    //在类加载时就进行创建
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取一个新的会话
     * @param autoCommit 是否开启自动提交(跟JDBC是一样的,如果不自动提交,则会变成事务操作)
     * @return SqlSession对象
     */
    public static SqlSession getSession(boolean autoCommit){
        return sqlSessionFactory.openSession(autoCommit);
    }
}

codejavawebmybatis大约 7 分钟
javaweb - Mybatis4

Mybatis详解2

指定构造方法

(一般不咋用) 通过前面的学习,我们已经知道如何使用Mybatis进行各种查询操作。我们知道,Mybatis在执行完查询语句后,会自动将查询的结果转换为我们所需要的实体类

实际上Mybatis一开始会通过我们实体类默认的无参构造得到一个最初的对象,然后通过反射进行赋值,我们可以手动编写一个带调试信息的无参构造:

public User() {
    System.out.println("????");
}

codejavawebmybatis大约 7 分钟
javaweb - Mybatis1

Mybatis1

在前面JDBC的学习中,虽然我们能够通过JDBC来连接和操作数据库,但是哪怕只是完成一个SQL语句的执行,都需要编写大量的代码,更不用说如果我还需要进行实体类映射,将数据转换为我们可以直接操作的实体类型,JDBC很方便,但是还不够方便,我们需要一种更加简洁高效的方式来和数据库进行交互。

再次强调: 学习厉害的框架或是厉害的技术,并不是为了一定要去使用它,而是它们能够使得我们在不同的开发场景下,合理地使用这些技术,以灵活地应对需要解决的问题。

image-20230306163528771

codejavawebmybatis大约 4 分钟