本文介绍了MyBatis官方生成器(MyBatis Generator)的功能、配置及使用方法,帮助开发者快速生成MyBatis所需的映射文件、实体类和DAO接口,从而减少手动编码的工作量。MyBatis Generator支持多种数据库,通过简单的配置文件即可实现自动生成代码,提高开发效率。此外,文章还详细介绍了MyBatis的核心概念,以便让读者更好地理解MyBatis的工作原理。
MyBatis概述MyBatis简介
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它通过 XML 或注解的方式将 SQL 语句与 Java 代码进行分离,使得系统更易维护。MyBatis 可用于任何种类的关系数据库,并且与数据库驱动程序无关。MyBatis 的设计目标是简化数据库操作,提高开发效率,减少代码量。
MyBatis的核心概念
MyBatis 的核心概念包括:
- 配置文件:位于
mybatis-config.xml
文件中,定义了数据库连接信息、映射文件位置等全局配置。 - 映射文件(Mapper XML):定义了 SQL 语句及如何将 SQL 语句返回的结果映射到 Java 对象中的属性。
- SqlSessionFactory:它是 MyBatis 工作的中心,负责创建 SqlSession 实例。
- SqlSession:用于执行 SQL 语句的会话对象,它提供了一系列方法用于执行数据库操作。
- Mapper 接口:定义了数据库操作的 Java 接口,与 XML 映射文件中的 SQL 语句一一对应。
下面是一个简单的示例,展示如何配置 mybatis-config.xml
文件:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
什么是MyBatis官方生成器
生成器的作用
MyBatis 官方生成器(MyBatis Generator)是一个代码生成工具,可自动生成 MyBatis 的映射文件(Mapper XML)、Java 实体类、DAO 接口等。它通过解析数据库的元数据自动生成对应的代码,从而大大减少开发人员手动编写这些代码的工作量。生成器支持多种数据库,如 MySQL、Oracle、SQL Server 等。
生成器的工作原理
MyBatis Generator 通过 JDBC 连接到数据库,获取数据库中的表信息(如表名、字段名、字段类型、主键等),然后根据这些信息生成对应的 SQL 映射文件(Mapper XML)、Java 实体类和 DAO 接口。生成器支持自定义配置文件(generatorConfig.xml
),用户可以指定生成的代码的格式和位置。
以下是一个简单的 generatorConfig.xml
配置示例:
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<jdbcConnection driverType="MYSQL">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="user" domainObjectName="User"/>
</context>
</generatorConfiguration>
从上面的配置文件中可以看出,生成器明确指出了数据库连接信息、生成的 Java 和 XML 代码的位置以及生成的表名和对应的 Java 类名。
如何安装和配置MyBatis官方生成器安装步骤详解
- 下载和安装 Maven:MyBatis Generator 需要通过 Maven 来安装。首先确保已经安装了 Maven。
- 添加 MyBatis Generator 依赖:在 Maven 项目的
pom.xml
文件中添加 MyBatis Generator 的依赖。
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
</dependencies>
- 配置
generatorConfig.xml
文件:配置数据库连接信息和生成代码的位置,例如:
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<jdbcConnection driverType="MYSQL">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="user" domainObjectName="User"/>
</context>
</generatorConfiguration>
配置文件解析
generatorConfig.xml
文件中定义了生成器的配置信息,主要包括以下几个部分:
- JDBC 连接信息:通过
<jdbcConnection>
标签提供数据库的连接信息。 - Java Model 生成配置:通过
<javaModelGenerator>
标签定义生成 Java 实体类的位置。 - SQL Map 生成配置:通过
<sqlMapGenerator>
标签定义生成 SQL 映射文件的位置。 - Java Client 生成配置:通过
<javaClientGenerator>
标签定义生成 DAO 接口的位置。 - 表配置:通过
<table>
标签定义需要生成代码的表信息。
例如,生成 User 表的代码:
<table tableName="user" domainObjectName="User">
<generatedKey column="id" sqlType="INTEGER" identity="true" />
</table>
在 <table>
标签中,tableName
指定了数据库表名,domainObjectName
指定了生成的 Java 类名。<generatedKey>
标签用于指定主键生成规则。
生成器参数配置
MyBatis Generator 可以通过命令行或者 Maven 插件来运行。以下是如何通过 Maven 插件运行生成器的步骤:
- 在
pom.xml
中添加 Maven 插件配置:
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
- 运行生成器:在 Maven 项目的根目录下运行以下命令:
mvn mybatis-generator:generate
生成代码示例
假设有一个 user
表,包含以下字段:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
生成器会根据以上表信息自动生成以下文件:
Java 实体类 User.java
package com.example.model;
public class User {
private int id;
private String username;
private String password;
public User() {}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
SQL 映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.model.User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="int">
SELECT `id`, `username`, `password` FROM `user`
WHERE `id` = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO `user` (`username`, `password`) VALUES (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR})
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
UPDATE `user` SET
<set>
<if test="username != null">
`username` = #{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
`password` = #{password,jdbcType=VARCHAR},
</if>
</set>
WHERE `id` = #{id,jdbcType=INTEGER}
</update>
</mapper>
DAO 接口 UserMapper.java
package com.example.mapper;
import com.example.model.User;
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
MyBatis官方生成器的高级功能
常见问题解答
-
生成的代码是否可以修改?
- 可以修改生成的代码,但建议修改
<table>
标签中的enableInsert
,enableDelete
,enableUpdate
,enableSelectByPrimaryKey
,enableSelectByExample
,enableCountByExample
,enableUpdateByExample
参数来控制生成的代码。
- 可以修改生成的代码,但建议修改
- 如何自定义生成的代码格式?
- 通过修改
generatorConfig.xml
文件中的配置项来控制生成代码的格式,例如修改 Java 实体类的布局或 SQL 映射文件中的 SQL 语句格式。
- 通过修改
功能扩展和自定义配置
-
自定义实体类生成器
- 可以通过自定义
JavaModelGenerator
类来控制 Java 实体类的生成逻辑,例如修改实体类的命名规则或属性的命名规则。
- 可以通过自定义
-
自定义 SQL 语句生成器
- 可以通过自定义
SqlMapGenerator
类来控制 SQL 映射文件的生成逻辑,例如修改 SQL 语句的格式或添加自定义的 SQL 语句模板。
- 可以通过自定义
- 自定义 DAO 接口生成器
- 可以通过自定义
JavaClientGenerator
类来控制 DAO 接口的生成逻辑,例如修改接口方法的命名规则或添加自定义的方法。
- 可以通过自定义
以下是一个自定义实体类生成器的示例:
package com.example.generator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.TopLevelClass;
public class CustomJavaModelGenerator extends PluginAdapter {
@Override
public boolean validate(IntrospectedTable introspectedTable) {
return true;
}
@Override
public void clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 自定义接口生成逻辑
}
@Override
public void modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 自定义实体类生成逻辑
topLevelClass.addImportedType("java.time.LocalDate");
for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
Field field = topLevelClass.getField(introspectedColumn.getActualColumnName());
if ("date".equals(introspectedColumn.getJdbcType().toString().toLowerCase())) {
field.setType("LocalDate");
}
}
}
}
实际案例应用
项目实践
假设有一个电商项目,需要从数据库中读取商品信息。可以使用 MyBatis Generator 生成商品表 product
的相关代码,包括 Java 实体类、SQL 映射文件和 DAO 接口。
商品表结构
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`description` text,
`price` decimal(10, 2) NOT NULL,
`quantity` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
生成器配置文件 generatorConfig.xml
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<jdbcConnection driverType="MYSQL">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="product" domainObjectName="Product"/>
</context>
</generatorConfiguration>
生成的 Java 实体类 Product.java
package com.example.model;
import java.math.BigDecimal;
public class Product {
private int id;
private String name;
private String description;
private BigDecimal price;
private int quantity;
public Product() {}
public Product(int id, String name, String description, BigDecimal price, int quantity) {
this.id = id;
this.name = name;
this.description = description;
this.price = price;
this.quantity = quantity;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
生成的 SQL 映射文件 ProductMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.mapper.ProductMapper">
<resultMap id="BaseResultMap" type="com.example.model.Product">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="price" jdbcType="DECIMAL" property="price" />
<result column="quantity" jdbcType="INTEGER" property="quantity" />
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="int">
SELECT `id`, `name`, `description`, `price`, `quantity` FROM `product`
WHERE `id` = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.Product">
INSERT INTO `product` (`name`, `description`, `price`, `quantity`) VALUES (#{name,jdbcType=VARCHAR}, #{description,jdbcType=LONGVARCHAR}, #{price,jdbcType=DECIMAL}, #{quantity,jdbcType=INTEGER})
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.example.model.Product">
UPDATE `product` SET
<set>
<if test="name != null">
`name` = #{name,jdbcType=VARCHAR},
</if>
<if test="description != null">
`description` = #{description,jdbcType=LONGVARCHAR},
</if>
<if test="price != null">
`price` = #{price,jdbcType=DECIMAL},
</if>
<if test="quantity != null">
`quantity` = #{quantity,jdbcType=INTEGER},
</if>
</set>
WHERE `id` = #{id,jdbcType=INTEGER}
</update>
</mapper>
生成的 DAO 接口 ProductMapper.java
package com.example.mapper;
import com.example.model.Product;
public interface ProductMapper {
int deleteByPrimaryKey(Integer id);
int insert(Product record);
int insertSelective(Product record);
Product selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Product record);
int updateByPrimaryKey(Product record);
}
生成器在项目中的优势
- 减少开发时间:通过自动生成代码,可以大大减少开发人员编写 SQL 语句和 Java 代码的时间。
- 提高代码质量:生成的代码经过了严格的测试和优化,通常比手动编写的代码更健壮。
- 维护简单:将数据库结构和 Java 代码分离,便于维护和扩展。
- 一致性保证:生成的代码遵循一致的编码规范,减少了人为错误。
共同学习,写下你的评论
评论加载中...
作者其他优质文章