快速入门

续接上节,完成了基本的 MyBatis 的配置,在不依赖 Spring 的情况下。这里开始对增删改的内容进行补充。

新增数据

<insert id="insert" parameterType="icu.wzk.model.UserInfo">
    INSERT INTO
        user_info
    VALUES(0, #{username}, #{password}, #{age})
</insert>

Java 代码:

public class WzkIcu02 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserInfo userInfo = UserInfo
                .builder()
                .username("wzk2")
                .password("icu2")
                .age(25)
                .build();
        sqlSession.insert("icu.wzk.mapper.UserInfoMapper.insert", userInfo);
        sqlSession.commit();
        sqlSession.close();
    }
}

注意的问题:

  • 插入语句使用 INSERT 标签
  • 在映射文件中使用 parameterType 属性指定要插入的数据类型
  • SQL 语句使用 #{} 来引入实体中的属性值
  • 插入操作使用的 API 是 sqlSession.insert(“命名空间.id”, 实体对象)
  • 插入操作涉及到数据库数据变化,所以要使用 sqlSession 对象显示的提交事务,即 sqlSession.commit()

更新数据

<update id="update" parameterType="icu.wzk.model.UserInfo">
    UPDATE
        user_info
    SET
        username=#{username}, password=#{password}, age=#{age}
    WHERE
        id=#{id}
</update>

Java 代码:

public class WzkIcu03 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserInfo userInfo = UserInfo
                .builder()
                .id(2L)
                .username("wzk2-update")
                .password("icu2-update")
                .age(25)
                .build();
        sqlSession.update("icu.wzk.mapper.UserInfoMapper.update", userInfo);
        sqlSession.commit();
        sqlSession.close();
    }
}

注意的问题:

  • 修改语句需要使用 update 标签
  • 操作的是 sqlSession.update(“命名空间.id”, 实体对象)

删除数据

<delete id="delete" parameterType="icu.wzk.model.UserInfo">
  DELETE FROM
      user_info
  WHERE
      id=#{id}
</delete>

Java 代码:

public class WzkIcu04 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserInfo userInfo = UserInfo
                .builder()
                .id(2L)
                .build();
        sqlSession.update("icu.wzk.mapper.UserInfoMapper.delete", userInfo);
        sqlSession.commit();
        sqlSession.close();
    }
}

注意的问题:

  • 删除使用 delete
  • 操作的是 sqlSession.delete(“命名空间.id”, 实体对象)

映射概述

MyBatis 的映射主要由 XML 映射文件 和 注解方式 实现,将数据库的表结构映射到 Java 对象上。MyBatis 映射通过 XML 和注解方式提供了灵活的 SQL 控制能力,适合需要手动编写 SQL 的场景。XML 映射文件适合复杂逻辑,而注解方式更适合简单场景。掌握 MyBatis 的映射能力,可以更高效地完成数据持久化操作,同时保持代码的可维护性和可读性。

核心概念

XML 映射文件

XML 是 MyBatis 映射的核心组件,通常以 .xml 文件形式存在,与映射的 Java 类对应。它包含了 SQL 语句、映射关系以及其他配置。

注解方式

通过 Java 注解的形式,将 SQL 直接嵌入到 Mapper 接口中,适合简单的 CRUD 操作。

重要标签

  • mapper: 顶级标签,声明该文件为 Mapper 文件,namespace 对应 Java 接口的全限定名。
  • resultMap: 自定义对象与数据库字段的映射关系,支持复杂映射。
  • select: 定义查询语句,可通过 resultType 或 resultMap 映射结果。
  • insert: 定义插入语句,使用 #{} 占位符传递参数。
  • update: 定义更新语句。
  • delete: 定义删除语句。

常用配置

enviroment

数据库环境配置,支持对环境配置。其中,事务管理器(transactionManager)类型有两种:

JDBC: JDBC 事务管理方式直接使用了 Java 数据库连接(JDBC)的事务控制机制。它通过从数据源获取的 Connection 对象来管理事务作用域,开发者需要显式调用 connection.commit() 提交事务或 connection.rollback() 回滚事务。

MANAGED: MANAGED 事务管理方式将事务管理完全委托给容器(如 J2EE 应用服务器)处理。它不会主动提交或回滚事务,而是由容器根据上下文环境自动管理事务的生命周期。

数据源

数据源有三种不同的配置方式:

  1. UNPOOLED(非池化数据源): 每次数据库请求时都会创建一个新的连接,使用完毕后立即关闭。适合小型应用或测试环境。

  2. POOLED(池化数据源): 维护一个连接池,预先创建多个连接并缓存起来。适合生产环境中的高并发应用。

  3. JNDI(Java命名和目录接口)数据源): 通过JNDI服务查找和使用容器管理的数据源,由应用服务器统一管理连接。适合EJB或应用服务器环境。

mapper

作用是加载映射,加载方式有如下几种:

使用相对于类路径的资源应用:

<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

使用完全限定资源定位符(URL):

<mapper url="file:///var/mappers/AuthorMapper.xml"/>

使用映射接口实现类的完全限定类名:

<mapper class="org.mybatis.builder.AuthorMapper"/>

将包内的映射接口实现全部注册为映射器:

<package name="org.mybatis.builder"/>