通用 Mapper 封装

通用 Mapper 概述

通用 Mapper 是基于 MyBatis 框架实现的一个插件,旨在简化单表的增删改查操作。其核心优势在于:

  • 减少 SQL 编写 :开发人员无需手动编写 SQL 语句,通过配置和简单的注解即可实现数据的增删改查。
  • 简化 DAO 层:无需在 DAO 接口中定义具体的方法,只需 遵循一定的命名规则使用注解 ,即可调用预定义的 CRUD 方法。
  • 快速开发:只需要定义好实体类,即可自动支持相应的增删改查功能,大大提高了开发效率。

通过这些特性,通用 Mapper 显著降低了开发复杂度,使得开发者可以更加专注于业务逻辑的实现。

新一代通用 Mapper

https://mapper.mybatis.io/

如何使用

  1. 首先在maven项目,在pom.xml中引入mapper的依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>space.terwer</groupId>
        <artifactId>mybatis-general-mapper</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>mybatis-general-mapper</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
            <jdk.version>17</jdk.version>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
        </properties>
    
        <dependencies>
            <!--mybatis坐标-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.6</version>
            </dependency>
            <dependency>
                <groupId>org.jboss</groupId>
                <artifactId>jboss-vfs</artifactId>
                <version>3.2.15.Final</version>
            </dependency>
            <!--mysql驱动坐标-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.28</version>
                <scope>runtime</scope>
            </dependency>
            <!--mysql mapper坐标-->
            <dependency>
                <groupId>io.mybatis</groupId>
                <artifactId>mybatis-mapper</artifactId>
                <version>2.2.5</version>
            </dependency>
            <!-- 使用 Service 层封装时 -->
            <dependency>
                <groupId>io.mybatis</groupId>
                <artifactId>mybatis-service</artifactId>
                <version>2.2.5</version>
            </dependency>
            <!-- 使用 ActiveRecord 模式时 
            <dependency>
              <groupId>io.mybatis</groupId>
              <artifactId>mybatis-activerecord</artifactId>
              <version>2.2.5</version>
            </dependency>
            -->
            <dependency>
                <groupId>io.mybatis</groupId>
                <artifactId>mybatis-jakarta-jpa</artifactId>
                <version>2.2.5</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
  2. 插一句,答疑解惑:什么是Active Record模式?

    Active Record模式

    说一说 ActiveRecord 模式的应用场景。

    在一个简单的增删改查系统中,如果用不到 service 层,那就可以直接在 controller 层用实体类进行直接的CRUD。

    但是在一个有 service 层的系统中,如果要实现模块的隔离,就需要考虑实体类只能在 service 层使用, 不能让实体类逸出到其他层,因此在和 controller 层交互时就需要有 VO 或 DTO 进行数据转换, 这样才能保证实体类调用 CRUD 方法不出错。

  3. Mybatis配置文件中完成配置

    <mappers>
        <!-- 扫描指定的包 -->
        <package name="space.terwer.mapper"/>
    </mappers>
    
  4. 实体类设置主键

    /**
     * @author terwer on 2024/12/4
     */
    @Entity.Table("user")
    public class User {
        @Entity.Column(id = true)
        private Integer id;
        private String username;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    
  5. 测试代码

    /**
     * @author terwer on 2024/12/4
     */
    public class UserTest {
        @Test
        public void test1() throws IOException {
            InputStream resourceAsStream =
                    Resources.getResourceAsStream("sqlMapConfig.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                User user = new User();
                user.setUsername("测试4");
                user.setId(4);
                // insert 接口
                // 保存一个实体,null值也会保存,不会使用数据库默认值
                userMapper.insert(user);
                sqlSession.commit();
            }
        }
    }
    
  6. 结果如下:

    Checking to see if class space.terwer.mapper.UserMapper matches criteria [is assignable to Object]
    cacheKey - space.terwer.mapper.UserMapper.insert :
    <script>
    INSERT INTO user(id,username) VALUES (#{id},#{username})
    </script>
    
    Opening JDBC Connection
    Created connection 527829831.
    Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1f760b47]
    ==>  Preparing: INSERT INTO user(id,username) VALUES (?,?)
    ==> Parameters: 4(Integer), 测试4(String)
    <==    Updates: 1
    Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1f760b47]
    

查看数据库:

image

通用 Mapper 代码

mybatis-general-mapper

posted @ 2024-12-04 16:56  灯塔下的守望者  阅读(10)  评论(0编辑  收藏  举报