• MyBatis通用Mapper:简化数据库操作的利器


    引言

    软件开发中,数据库操作是不可或缺的一部分。通常我们会使用mybatis,的MBG插件,自动生成表对应的基本操作语句xml。

    当我们的表字段发生变化的时候,我们需要修改实体类和Mapper文件定义的字段和方法。如果是增量维护,那么一个个文件去修改。如果是全量替换,我们还要去对比用MBG生成的文件。字段变动一次就要修改一次,维护起来非常麻烦。

    MBG

    mybatis 代码生成工具 (https://github.com/mybatis/generator

    MBG(MyBatis Generator)是一个针对MyBatis和iBATIS的代码生成工具。以下是关于MBG的详细简单介绍:

    1. 功能概述

    • 代码生成:MBG能够自动生成与数据库表结构相匹配的Java POJO(Plain Old Java Object,简单的Java对象)、Mapper文件(DAO接口)以及XML映射文件。
    • 支持版本:它支持所有版本的MyBatis以及iBATIS 2.2.0及以后的版本。
    • CRUD操作:MBG可以内省数据库表,并生成用于访问这些表的基础对象,从而简化了与数据库表进行交互时的对象和配置文件创建过程。它主要解决了简单的CRUD(创建、检索、更新、删除)操作。

    2. 生成的代码类型

    • Java POJO
      • 匹配表主键的类(如果存在主键)
      • 匹配表非主键字段的类(BLOB字段除外)
      • 包含BLOB字段的类(如果表具有BLOB字段)
      • 允许动态查询、更新和删除的类(如Example查询)
    • Mapper文件(DAO接口):与MyBatis 3.x或iBATIS 2.x兼容的Mapper接口。
    • XML映射文件:MyBatis/iBATIS兼容的SQL映射XML文件,包含用于简单CRUD操作的SQL语句。

    3. 优点

    • 提高开发效率:自动生成代码可以减少重复的编码工作,节省开发时间。
    • 提高代码质量:自动生成的代码基本上是经过测试的,可以减少一些错误,提高代码的质量。
    • 易于维护:自动生成的代码结构清晰,易于阅读和理解,方便维护。
    • 可自定义:可以根据自己的需求定制生成规则,满足项目的特定需求。

    4. 缺点

    • 生成的代码可能不符合项目需求:生成的代码可能不完全符合项目的需求,需要手动修改。
    • 学习成本:需要花时间学习生成工具的使用方法,可能需要一定的技术水平。
    • 可能会覆盖已有代码:生成的代码可能会覆盖已有的代码,导致一些问题。
    • 可能会导致代码冗余:生成的代码可能会存在冗余,需要手动清理。

    5. 使用方法

    • 配置MBG:在项目的构建配置文件中(如pom.xml)添加MBG的依赖,并创建MBG的配置文件(如generatorConfig.xml),配置数据库连接信息、Java模型生成器等相关设置。
    • 运行MBG:通过构建工具(如Maven)运行MBG,根据配置文件生成代码。

    6. 注意事项

    • 在使用MBG时,应确保数据库表结构的准确性和完整性,以避免生成的代码出现问题。
    • 根据项目的实际需求,合理配置MBG的生成规则,以满足项目的特定需求。
    • 在使用生成的代码时,应仔细检查和测试,确保代码的正确性和稳定性。

    通用Mapper的实现方案

    mapper继承

    第一个,因为MyBatis的Mapper是支持继承的(见:Can mybatis support mapper xml extend feature? · Issue #35 · mybatis/mybatis-3 · GitHub)。所以我们可以把我们的Mapper.xml和Mapper接口都分成两个文件。一个是MBG生成的,这部分是固定不变的。然后创建DAO类继承生成的接口,变化的部分就在DAO里面维护。

    1. public interface UserMapperExt extends UserMapper {
    2. public List<User> selectUserByName(String userName);
    3. }

    对应的映射文件

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.boge.vip.mapper.UserMapperExt" >
    4. <resultMap id="BaseResultMapExt" type="com.boge.vip.domain.User" >
    5. <id column="id" property="id" jdbcType="INTEGER" />
    6. <result column="user_name" property="userName" jdbcType="VARCHAR" />
    7. <result column="real_name" property="realName" jdbcType="VARCHAR" />
    8. <result column="password" property="password" jdbcType="VARCHAR" />
    9. <result column="age" property="age" jdbcType="INTEGER" />
    10. <result column="d_id" property="dId" jdbcType="INTEGER" />
    11. <result column="i_id" property="iId" jdbcType="INTEGER" />
    12. </resultMap>
    13. <select id="selectUserByName" resultMap="BaseResultMapExt" >
    14. select * from t_user where user_name = #{userName}
    15. </select>
    16. </mapper>

    当然在全局配置文件里面我们需要增加这个mapper的扫描

    1. <mappers>
    2. <mapper resource="mapper/UserMapper.xml"/>
    3. <mapper resource="mapper/UserMapperExt.xml"/>
    4. </mappers>

    所以以后只要修改Ext的文件就可以了。这么做有一个缺点,就是文件会增多。

    mybatis-plus

    推荐使用。官网如下:快速开始 | MyBatis-Plus

    这里贴一个例子,非常好用。

    添加依赖,引入 MyBatis-Plus Starter 依赖

    1. <dependency>
    2. <groupId>com.baomidou</groupId>
    3. <artifactId>mybatis-plus-boot-starter</artifactId>
    4. <version>3.5.6</version>
    5. </dependency>

    配置

    在 application.yml 配置文件中添加 H2 数据库的相关配置:

    application.yml

    1. # DataSource Config
    2. spring:
    3. datasource:
    4. driver-class-name: org.h2.Driver
    5. username: root
    6. password: test
    7. sql:
    8. init:
    9. schema-locations: classpath:db/schema-h2.sql
    10. data-locations: classpath:db/data-h2.sql

    上面的配置是任何一个 Spring Boot 工程都会配置的数据库链接信息,如果您使用的是其他数据库,如 MySQL,则需要修改相应的配置信息。

    在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

    Application.java

    1. @SpringBootApplication
    2. @MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
    3. public class Application {
    4. public static void main(String[] args) {
    5. SpringApplication.run(Application.class, args);
    6. }
    7. }

    编码

    编写实体类 User.java

    User.java

    1. @Data
    2. public class User {
    3. private Long id;
    4. private String name;
    5. private Integer age;
    6. private String email;
    7. }

    编写 Mapper 接口类 UserMapper.java

    1. public interface UserMapper extends BaseMapper<User> {
    2. }

    开始使用

    添加测试类,进行功能测试:

    1. @SpringBootTest
    2. public class SampleTest {
    3. @Autowired
    4. private UserMapper userMapper;
    5. @Test
    6. public void testSelect() {
    7. System.out.println(("----- selectAll method test ------"));
    8. List<User> userList = userMapper.selectList(null);
    9. Assert.isTrue(5 == userList.size(), "");
    10. userList.forEach(System.out::println);
    11. }
    12. }

    控制台输出:

    User(id=1, name=Jone, age=18, email=test1@baomidou.com)

    User(id=2, name=Jack, age=20, email=test2@baomidou.com)

    User(id=3, name=Tom, age=28, email=test3@baomidou.com)

    User(id=4, name=Sandy, age=21, email=test4@baomidou.com)

    User(id=5, name=Billie, age=24, email=test5@baomidou.com)

  • 相关阅读:
    2023校招美团第二次笔试
    浅谈ArrayList和LinkedList
    拥抱下一代前端工具链-Vue老项目迁移Vite探索
    混沌工程-经典案例分享
    Java的代理:静态代理、JDK/CGLIB的动态代理
    前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(二)
    131、LeetCode-583.两个字符串的删除操作
    【微信小程序入门到精通】— view 和 scroll-view 你学会了么?
    C++ 【2】
    ByteHouse云数仓版查询性能优化和MySQL生态完善
  • 原文地址:https://blog.csdn.net/migo_/article/details/139223268