通用 Mapper 封装
通用 Mapper 是基于 MyBatis 框架的插件,旨在简化单表的增删改查操作。通过这些特性,通用 Mapper 降低了开发复杂度,帮助开发者更专注于业务逻辑的实现。要使用该插件,开发者需要在 Maven 项目的 pom.xml
中添加相应的依赖,并确保 MyBatis 和数据库驱动的版本兼容。
# 通用 Mapper 概述
通用 Mapper 是基于 MyBatis 框架实现的一个插件,旨在简化单表的增删改查操作。其核心优势在于:
- 减少 SQL 编写 :开发人员无需手动编写 SQL 语句,通过配置和简单的注解即可实现数据的增删改查。
- 简化 DAO 层:无需在 DAO 接口中定义具体的方法,只需 遵循一定的命名规则 或 使用注解 ,即可调用预定义的 CRUD 方法。
- 快速开发:只需要定义好实体类,即可自动支持相应的增删改查功能,大大提高了开发效率。
通过这些特性,通用 Mapper 显著降低了开发复杂度,使得开发者可以更加专注于业务逻辑的实现。
# 新一代通用 Mapper
https://mapper.mybatis.io/ (opens new window)
# 如何使用
首先在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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72插一句,答疑解惑:什么是Active Record模式?
Active Record模式 (opens new window)
说一说 ActiveRecord 模式的应用场景。
在一个简单的增删改查系统中,如果用不到 service 层,那就可以直接在 controller 层用实体类进行直接的CRUD。
但是在一个有 service 层的系统中,如果要实现模块的隔离,就需要考虑实体类只能在 service 层使用, 不能让实体类逸出到其他层,因此在和 controller 层交互时就需要有 VO 或 DTO 进行数据转换, 这样才能保证实体类调用 CRUD 方法不出错。
Mybatis配置文件中完成配置
<mappers> <!-- 扫描指定的包 --> <package name="space.terwer.mapper"/> </mappers>
1
2
3
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; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25测试代码
/** * @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(); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21结果如下:
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]
1
2
3
4
5
6
7
8
9
10
11
12
13
查看数据库:
# 通用 Mapper 代码
编辑 (opens new window)
上次更新: 2024/12/04, 09:16:23