MyBatis Generator(简称MBG)是一个强大的代码生成工具,能够自动生成MyBatis所需的Mapper接口、XML映射文件和Java实体类,大幅减少开发人员的手动编写工作量。本文将详细介绍Mybatis官方生成器入门知识,包括安装配置、基本用法以及一些高级用法和实战案例。通过本文,你将快速掌握这一实用工具,提升开发效率。
MyBatis生成器简介1.1 MyBatis生成器的作用
MyBatis Generator(简称MBG)是一个自动化的代码生成工具,能够根据数据库表自动生成MyBatis所需的Mapper接口、XML映射文件和Java实体类。MBG显著减少了开发人员手动编写这些基础代码的工作量,提高了开发效率。
1.2 MyBatis生成器的优势
使用MBG的优势包括:
- 提升开发效率:自动化生成基础代码,节省手动编写时间。
- 减少错误:减少手动编写带来的潜在错误。
- 代码规范:生成的代码符合MyBatis最佳实践,增强了代码的一致性。
- 易于维护:一旦数据库表结构发生变更,只需重新生成代码即可,无需手动修改大量代码。
2.1 搭建开发环境
首先,需要搭建Java开发环境。这里以JDK 1.8作为示例。安装JDK后,配置环境变量JAVA_HOME
,设置PATH
包含%JAVA_HOME%\bin
。
然后,搭建IDE(如IntelliJ IDEA或Eclipse)。
接下来,安装Maven,用于构建项目。下载Maven并配置MAVEN_HOME
环境变量,确保PATH
包含%MAVEN_HOME%\bin
。
最后,创建一个Maven项目,并在pom.xml
中添加必要的依赖。
示例的pom.xml
配置如下:
<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>com.example</groupId>
<artifactId>mybatis-generator</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- MyBatis Generator 依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</project>
2.2 下载并配置MyBatis Generator
下载MyBatis Generator的jar包,可以去Maven仓库下载。下载完成后,将jar包添加到项目中,并配置mybatis-generator.xml
文件。
配置文件示例(mybatis-generator.xml
):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<!-- 设置生成日期 -->
<property name="dateFormat" value="yyyy-MM-dd"/>
</commentGenerator>
<jdbcConnection driverType="MYSQL">
<!-- 数据库连接信息 -->
<property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="connection.username" value="root"/>
<property name="connection.password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="./src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="./src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="./src/main/java"/>
<!-- 配置要生成的表 -->
<table tableName="user"/>
</context>
</generatorConfiguration>
MyBatis生成器的基本用法
3.1 生成器配置文件详解
配置文件mybatis-generator.xml
包含了生成器的所有配置信息。其中,<context>
标签用来定义生成器上下文,可以配置多个上下文,每个上下文可以生成不同的目标代码。
- <commentGenerator>:配置生成的注释信息。例如,设置是否生成所有注释和日期格式。
- <jdbcConnection>:配置数据库连接信息,包括驱动类、URL、用户名和密码。
- <javaModelGenerator>:配置生成实体类的信息,如包名、生成文件存放位置等。
- <sqlMapGenerator>:配置生成XML映射文件的信息,如包名、生成文件存放位置等。
- <javaClientGenerator>:配置生成Mapper接口的信息,如包名、生成文件存放位置等。
- <table>:配置需要生成代码的表信息,如表名。
示例:
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="dateFormat" value="yyyy-MM-dd"/>
</commentGenerator>
<jdbcConnection driverType="MYSQL">
<property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="connection.username" value="root"/>
<property name="connection.password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="./src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="./src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="./src/main/java"/>
<table tableName="user" domainObjectName="User">
<ignoreGeneratedAlwaysColumns>true</ignoreGeneratedAlwaysColumns>
</table>
</context>
</generatorConfiguration>
3.2 生成Mapper接口与XML文件
配置好生成器配置文件后,可以通过命令行执行生成器,或者在IDE中配置任务来生成Mapper接口和XML文件。
示例代码:
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class MyBatisGeneratorDemo {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
boolean overwrite = true;
InputStream stream = MyBatisGeneratorDemo.class.getResourceAsStream("/mybatis-generator.xml");
ConfigurationParser parser = new ConfigurationParser(warnings);
Configuration config = parser.parseConfiguration(stream);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
3.3 生成实体类
通过配置mybatis-generator.xml
文件中的<javaModelGenerator>
标签,可以指定实体类的生成位置和包名。
示例代码:
<javaModelGenerator targetPackage="com.example.model" targetProject="./src/main/java"/>
生成的实体类示例:
package com.example.model;
import java.sql.Date;
public class User {
private Integer id;
private String username;
private String password;
private Date createDate;
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;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
MyBatis生成器的高级用法
4.1 自定义生成规则
可以在mybatis-generator.xml
文件中自定义生成规则,例如重命名字段、修改生成的类名等。
示例:
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<columnOverride column="id" property="userId"/>
<columnOverride column="username" property="userUsername"/>
</table>
4.2 配置多数据源
在配置文件中可以添加多个<context>
节点,每个节点可以配置不同的数据源。这在需要连接多个数据库时非常有用。
示例:
<generatorConfiguration>
<context id="DB1Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverType="MYSQL">
<property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connection.url" value="jdbc:mysql://localhost:3306/db1"/>
<property name="connection.username" value="root"/>
<property name="connection.password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.modelDb1" targetProject="./src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapperDb1" targetProject="./src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapperDb1" targetProject="./src/main/java"/>
<table tableName="user"/>
</context>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverType="MYSQL">
<property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connection.url" value="jdbc:mysql://localhost:3306/db2"/>
<property name="connection.username" value="root"/>
<property name="connection.password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.modelDb2" targetProject="./src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapperDb2" targetProject="./src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapperDb2" targetProject="./src/main/java"/>
<table tableName="user"/>
</context>
</generatorConfiguration>
MyBatis生成器实战案例
5.1 实战案例一:简单CRUD操作
本节通过一个简单的用户表,演示如何使用MBG生成CRUD操作的代码。
首先,创建一个用户表users
:
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(45) NOT NULL,
`password` VARCHAR(45) NOT NULL,
`create_date` DATE NOT NULL,
PRIMARY KEY (`id`)
);
然后,配置mybatis-generator.xml
文件:
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverType="MYSQL">
<property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="connection.username" value="root"/>
<property name="connection.password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="./src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="./src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="./src/main/java"/>
<table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
执行生成器命令,生成的代码包括User
实体类、UserMapper
接口、UserMapper.xml
文件。
示例的UserMapper
接口:
package com.example.mapper;
import com.example.model.User;
import java.util.List;
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);
List<User> selectAll();
}
示例的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" />
<result column="create_date" jdbcType="DATE" property="createDate" />
</resultMap>
<sql id="Base_Column_List">
id, username, password, create_date
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
SELECT
<if test="columnList != null and columnList.length > 0">
${columnList}
</if>
<if test="columnList == null or columnList.length == 0">
id, username, password, create_date
</if>
FROM users
WHERE id = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO users (username, password, create_date)
VALUES (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{createDate,jdbcType=DATE})
</insert>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
DELETE FROM users WHERE id = #{id,jdbcType=INTEGER}
</delete>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
UPDATE users SET username = #{username,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR}, create_date = #{createDate,jdbcType=DATE}
WHERE id = #{id,jdbcType=INTEGER}
</update>
<select id="selectAll" resultMap="BaseResultMap">
SELECT
<if test="columnList != null and columnList.length > 0">
${columnList}
</if>
<if test="columnList == null or columnList.length == 0">
id, username, password, create_date
</if>
FROM users
</select>
</mapper>
5.2 实战案例二:复杂查询操作
本节通过复杂的查询操作,演示如何使用MBG生成复杂的Mapper代码。
首先,创建一个订单表orders
:
CREATE TABLE `orders` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`product_id` INT NOT NULL,
`quantity` INT NOT NULL,
`total_price` DECIMAL(10, 2) NOT NULL,
`order_date` DATE NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`user_id`) REFERENCES users(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
FOREIGN KEY (`product_id`) REFERENCES products(id) ON DELETE RESTRICT ON UPDATE RESTRICT
);
然后,创建一个产品表products
:
CREATE TABLE `products` (
`id` INT NOT NULL AUTO_INCREMENT,
`product_name` VARCHAR(100) NOT NULL,
`price` DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (`id`)
);
接着,配置mybatis-generator.xml
文件:
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverType="MYSQL">
<property name="connection.driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="connection.url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="connection.username" value="root"/>
<property name="connection.password" value="password"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="./src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="./src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="./src/main/java"/>
<table tableName="orders" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
<table tableName="products" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
</context>
</generatorConfiguration>
执行生成器命令,生成的代码包括Order
和Product
实体类、OrderMapper
和ProductMapper
接口、OrderMapper.xml
和ProductMapper.xml
文件。
示例的OrderMapper
接口:
package com.example.mapper;
import com.example.model.Order;
import java.util.List;
public interface OrderMapper {
int deleteByPrimaryKey(Integer id);
int insert(Order record);
int insertSelective(Order record);
Order selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Order record);
int updateByPrimaryKey(Order record);
List<Order> selectAll();
}
示例的OrderMapper.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.OrderMapper">
<resultMap id="BaseResultMap" type="com.example.model.Order">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="user_id" jdbcType="INTEGER" property="userId" />
<result column="product_id" jdbcType="INTEGER" property="productId" />
<result column="quantity" jdbcType="INTEGER" property="quantity" />
<result column="total_price" jdbcType="DECIMAL" property="totalPrice" />
<result column="order_date" jdbcType="DATE" property="orderDate" />
</resultMap>
<sql id="Base_Column_List">
id, user_id, product_id, quantity, total_price, order_date
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
SELECT
<if test="columnList != null and columnList.length > 0">
${columnList}
</if>
<if test="columnList == null or columnList.length == 0">
id, user_id, product_id, quantity, total_price, order_date
</if>
FROM orders
WHERE id = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.Order">
INSERT INTO orders (user_id, product_id, quantity, total_price, order_date)
VALUES (#{userId,jdbcType=INTEGER}, #{productId,jdbcType=INTEGER}, #{quantity,jdbcType=INTEGER}, #{totalPrice,jdbcType=DECIMAL}, #{orderDate,jdbcType=DATE})
</insert>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
DELETE FROM orders WHERE id = #{id,jdbcType=INTEGER}
</delete>
<update id="updateByPrimaryKey" parameterType="com.example.model.Order">
UPDATE orders SET user_id = #{userId,jdbcType=INTEGER}, product_id = #{productId,jdbcType=INTEGER}, quantity = #{quantity,jdbcType=INTEGER}, total_price = #{totalPrice,jdbcType=DECIMAL}, order_date = #{orderDate,jdbcType=DATE}
WHERE id = #{id,jdbcType=INTEGER}
</update>
<select id="selectAll" resultMap="BaseResultMap">
SELECT
<if test="columnList != null and columnList.length > 0">
${columnList}
</if>
<if test="columnList == null or columnList.length == 0">
id, user_id, product_id, quantity, total_price, order_date
</if>
FROM orders
</select>
</mapper>
常见问题与解决方案
6.1 常见错误及解决方法
- 找不到数据库驱动:确保已下载数据库驱动jar包,并将其添加到项目类路径中。
- 数据库连接失败:检查数据库连接信息是否正确,确保数据库服务正常运行。
- 生成的代码有错误:确保生成器配置文件正确无误,特别是数据库表名和字段名。
- 生成文件未更新:尝试关闭IDE,手动删除生成的文件,重新生成。
6.2 使用过程中遇到的常见问题
- 生成的代码不满足需求:可以自定义生成规则,如重命名字段、修改生成类名等。
- 生成代码后无法运行:确保生成的代码与项目其他部分兼容,检查生成的Mapper接口和XML文件是否正确配置。
- 生成器性能问题:优化生成过程,如减少生成的表数量,使用更高效的生成规则。
通过以上指南,你应该能够顺利使用MyBatis Generator生成代码,提高开发效率。更多高级用法和配置细节可以在官方文档中查找。
共同学习,写下你的评论
评论加载中...
作者其他优质文章