本文介绍了Mybatis代码生成器的安装与配置,包括选择合适的代码生成器、编写配置文件、运行生成器等步骤,帮助开发者快速生成数据库访问层的代码,提高开发效率。此外,文章还详细讲解了如何动态配置生成规则和使用自定义模板生成代码,增强了代码生成的灵活性和扩展性。
Mybatis简介
Mybatis 是一个优秀的持久层框架,支持自定义 SQL 查询、存储过程以及多种数据库方言。通过 XML 或注解的方式,Mybatis 可以将 Java 方法和 SQL 语句映射起来,实现对数据库的查询、插入、更新和删除操作。
Mybatis的基本功能和特点
Mybatis 的主要功能包括:
- 持久化操作:通过 XML 或注解映射 Java 方法和 SQL 语句,实现数据库持久化操作。
- 自定义 SQL 查询:支持灵活编写 SQL 语句。
- 存储过程支持:支持调用存储过程。
- 数据库方言支持:支持多种数据库方言,自动处理不同数据库间的差异。
- 缓存机制:提供一级缓存和二级缓存,提高查询效率。
- 动态 SQL 支持:支持动态生成 SQL 语句,根据不同条件生成不同 SQL 语句。
- 插件机制:提供插件机制,方便扩展。
- 支持 Java API 和 XML 配置:通过 Java API 和 XML 文件进行配置,简化配置复杂度。
Mybatis的核心概念
- SqlSessionFactory:构建 SqlSession 的工厂,线程不安全。
- SqlSession:执行 SQL 语句的会话对象,线程不安全。
- Mapper 接口:用于编写 SQL 挡板,将 SQL 语句映射到 Java 方法上。
- Mapper XML 文件:编写 SQL 语句的地方,通过 XML 标签映射到 Java 方法上。
代码生成器简介
代码生成器是一种自动化工具,用于生成数据库访问层的代码,如 Mapper 接口、Mapper XML 文件、实体类等。这可以减少手动编写代码的工作量,提高开发效率。
代码生成器的作用
代码生成器的主要作用包括:
- 提高开发效率:快速生成数据库访问层代码,减少手动编写代码的工作量。
- 避免重复劳动:对于一些基础的数据库操作,如增删改查等,可以自动生成相关代码,避免重复劳动。
- 减少代码错误:生成的代码通常经过验证和测试,减少手动编写代码时可能引入的错误。
常见的代码生成器工具
常见的代码生成器工具包括:
- Mybatis Generator:开源代码生成器,支持生成 Mapper 接口、Mapper XML 文件、实体类等。
- Mybatis Plus:Mybatis 的增强工具,提供常用的 CRUD 操作,支持自动生成代码。
- Lombok:代码生成器,自动生成常用的代码,如构造函数、getter 和 setter 方法等。
- Jooq:生成器,可以生成 SQL 代码,提供多种数据库方言支持。
Mybatis代码生成器的选择
Mybatis 代码生成器可以根据不同的需求选择不同的工具。下面介绍一些常见的 Mybatis 代码生成器工具,并讨论如何选择合适的工具。
Mybatis代码生成器的分类
Mybatis 代码生成器主要分为以下几种类型:
- 基于 XML 的代码生成器:如 Mybatis Generator,可以通过 XML 配置文件进行配置。
- 基于注解的代码生成器:如 Mybatis Plus,可以通过注解的方式进行配置。
- 通用代码生成器:如 Lombok,可以生成 Java 代码中的常用代码片段。
- SQL 生成器:如 Jooq,可以生成 SQL 代码。
如何选择合适的Mybatis代码生成器
选择 Mybatis 代码生成器时,需要考虑以下几个因素:
- 需求分析:根据项目需求选择合适的代码生成器,如是否需要生成 Mapper 接口、Mapper XML 文件、实体类等。
- 使用场景:根据使用场景选择合适的代码生成器,如是否需要支持多种数据库方言。
- 社区支持:选择有活跃社区支持的代码生成器,可以方便地获取帮助和解决问题。
- 灵活性:选择灵活度高的代码生成器,可以方便地扩展和定制化。
例如,如果项目需要支持多种数据库方言,可以选择 Mybatis Generator 或 Jooq 这样的 SQL 生成器。如果项目需要生成 Mapper 接口、Mapper XML 文件等,可以选择 Mybatis Plus 或 Mybatis Generator 这样的代码生成器。
Mybatis代码生成器的安装与配置
在选择合适的 Mybatis 代码生成器后,可以进行安装与配置。以 Mybatis Generator 为例,介绍安装与配置步骤。
安装步骤
-
环境准备:
- 确保已经安装了 Java 开发环境。
- 确保已经安装了 Maven 或 Gradle。
-
添加依赖:
在项目的pom.xml
文件中添加 Mybatis Generator 依赖。<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>
-
编写配置文件:
编写 Mybatis Generator 的配置文件generatorConfig.xml
,配置生成规则。<generatorConfiguration> <context id="Default" targetRuntime="MyBatis3"> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis_generator" userId="root" password="password"/> <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"> <columnOverride column="id" javaType="Long"/> </table> </context> </generatorConfiguration>
-
运行生成器:
创建一个 Java 类来调用 Mybatis Generator 的生成方法。import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.exception.XMLParserException; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class MybatisGeneratorRunner { public void run() throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("src/main/resources/generator/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
配置生成规则
在 generatorConfig.xml
配置文件中,可以通过 <context>
标签配置生成规则。
-
数据库连接:
driverClass
:数据库驱动类。connectionURL
:数据库连接 URL。userId
:数据库用户名。password
:数据库密码。
-
生成 Java 模型:
targetPackage
:生成的 Java 类的包名。targetProject
:生成的 Java 类所在的项目路径。
-
生成 SQL 映射文件:
targetPackage
:生成的 SQL 映射文件的包名。targetProject
:生成的 SQL 映射文件所在的项目路径。
-
生成 Mapper 接口:
type
:生成方式,如 XMLMAPPER。targetPackage
:生成的 Mapper 接口的包名。targetProject
:生成的 Mapper 接口所在的项目路径。
- 指定表和列:
tableName
:要生成代码的表名。columnOverride
:覆盖某些列的 Java 类型。
使用Mybatis代码生成器生成代码
在配置完 Mybatis Generator 后,可以生成 Mapper 接口、Mapper XML 文件、实体类等。
生成Mapper接口
生成的 Mapper 接口代码示例如下:
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper {
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Long id);
int updateByPrimaryKey(User record);
int updateByPrimaryKeySelective(User record);
}
生成Mapper XML文件
生成的 Mapper 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="BIGINT" javaType="java.lang.Long" property="id"/>
<result column="name" jdbcType="VARCHAR" javaType="java.lang.String" property="name"/>
<result column="age" jdbcType="INTEGER" javaType="java.lang.Integer" property="age"/>
</resultMap>
<sql id="Base_Column_List">
id, name, age
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long">
SELECT
<include refid="Base_Column_List"/>
FROM
user
WHERE
id = #{id,jdbcType=BIGINT}
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO
user
(name, age)
VALUES
(#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.example.model.User">
INSERT INTO
user
(id, name, age)
VALUES
#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
UPDATE
user
SET
name = #{name,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER}
WHERE
id = #{id,jdbcType=BIGINT}
</update>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
UPDATE
user
SET
name = #{name,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER}
WHERE
id = #{id,jdbcType=BIGINT}
</update>
</mapper>
生成实体类
生成的实体类代码示例如下:
package com.example.model;
public class User {
private Long id;
private String name;
private Integer age;
// Getter and Setter methods
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Mybatis代码生成器的高级用法
Mybatis 代码生成器支持动态配置生成规则和自定义模板生成代码。
动态配置生成规则
可以通过 Java 代码动态配置生成规则,如改变生成的包名、生成的文件路径等。
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.Context;
import org.mybatis.generator.config.ConnectionConfiguration;
import org.mybatis.generator.config.JDBCConnectionConfiguration;
import org.mybatis.generator.config.PluginConfiguration;
import org.mybatis.generator.config.SqlMapGeneratorConfiguration;
import org.mybatis.generator.config.TableConfiguration;
import org.mybatis.generator.config.java.JavaClientGeneratorConfiguration;
import org.mybatis.generator.config.java.JavaModelGeneratorConfiguration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DynamicGeneratorRunner {
public void run() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("src/main/resources/generator/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
Context context = config.getContexts().get(0);
context.setTargetRuntime("MyBatis3");
ConnectionConfiguration connectionConfig = context.getConnectionConfiguration();
connectionConfig.setDriverClass("com.mysql.jdbc.Driver");
connectionConfig.setConnectionURL("jdbc:mysql://localhost:3306/mybatis_generator");
connectionConfig.setUserId("root");
connectionConfig.setPassword("password");
JavaModelGeneratorConfiguration javaModelConfig = context.getJavaModelGeneratorConfiguration();
javaModelConfig.setTargetPackage("com.example.dynamic.model");
javaModelConfig.setTargetProject("src/main/java");
SqlMapGeneratorConfiguration sqlMapConfig = context.getSqlMapGeneratorConfiguration();
sqlMapConfig.setTargetPackage("com.example.dynamic.mapper");
sqlMapConfig.setTargetProject("src/main/resources");
JavaClientGeneratorConfiguration javaClientConfig = context.getJavaClientGeneratorConfiguration();
javaClientConfig.setTargetPackage("com.example.dynamic.mapper");
javaClientConfig.setTargetProject("src/main/java");
TableConfiguration tableConfig = context.getTableConfigurations().get(0);
tableConfig.setTableName("user");
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
自定义模板生成代码
可以通过自定义模板来自定义生成的代码,如改变生成的 SQL 语句格式等。
-
添加模板文件:
在项目的src/main/resources/templates
目录下添加自定义的 SQL 映射文件模板。<?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="${basePackage}.${mapper}"> <resultMap id="BaseResultMap" type="${basePackage}.${model}"> <id column="id" jdbcType="BIGINT" javaType="java.lang.Long" property="id"/> <result column="name" jdbcType="VARCHAR" javaType="java.lang.String" property="name"/> <result column="age" jdbcType="INTEGER" javaType="java.lang.Integer" property="age"/> </resultMap> <sql id="Base_Column_List"> id, name, age </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long"> SELECT <include refid="Base_Column_List"/> FROM ${table} WHERE id = #{id,jdbcType=BIGINT} </select> <insert id="insert" parameterType="${basePackage}.${model}"> INSERT INTO ${table} (name, age) VALUES (#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}) </insert> <insert id="insertSelective" parameterType="${basePackage}.${model}"> INSERT INTO ${table} (id, name, age) VALUES #{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER} </insert> <update id="updateByPrimaryKeySelective" parameterType="${basePackage}.${model}"> UPDATE ${table} SET name = #{name,jdbcType=VARCHAR}, age = #{age,jdbcType=INTEGER} WHERE id = #{id,jdbcType=BIGINT} </update> <update id="updateByPrimaryKey" parameterType="${basePackage}.${model}"> UPDATE ${table} SET name = #{name,jdbcType=VARCHAR}, age = #{age,jdbcType=INTEGER} WHERE id = #{id,jdbcType=BIGINT} </update> </mapper>
-
配置模板文件:
在generatorConfig.xml
配置文件中,配置使用自定义模板。<generatorConfiguration> <context id="Default" targetRuntime="MyBatis3"> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis_generator" userId="root" password="password"/> <javaModelGenerator targetPackage="com.example.dynamic.model" targetProject="src/main/java"/> <sqlMapGenerator targetPackage="com.example.dynamic.mapper" targetProject="src/main/resources" templateLocation="templates/UserMapperTemplate.xml"/> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.dynamic.mapper" targetProject="src/main/java"/> <table tableName="user"> <columnOverride column="id" javaType="Long"/> </table> </context> </generatorConfiguration>
通过以上步骤,可以灵活地动态配置生成规则和自定义生成代码的模板,提高 Mybatis 代码生成器的灵活性和扩展性。
实际项目应用案例
假设有一个在线商城项目,需要生成用户表的 Mapper 接口、Mapper XML 文件和实体类。以下是具体配置和步骤:
-
环境准备:
- 确保已经安装了 Java 开发环境。
- 确保已经安装了 Maven 或 Gradle。
-
添加依赖:
在项目的pom.xml
文件中添加 Mybatis Generator 依赖。<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>
-
编写配置文件:
编写 Mybatis Generator 的配置文件generatorConfig.xml
,配置生成规则。<generatorConfiguration> <context id="Default" targetRuntime="MyBatis3"> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/onlineshop" userId="root" password="password"/> <javaModelGenerator targetPackage="com.onlineshop.model" targetProject="src/main/java"/> <sqlMapGenerator targetPackage="com.onlineshop.mapper" targetProject="src/main/resources"/> <javaClientGenerator type="XMLMAPPER" targetPackage="com.onlineshop.mapper" targetProject="src/main/java"/> <table tableName="user"> <columnOverride column="id" javaType="Long"/> </table> </context> </generatorConfiguration>
-
运行生成器:
创建一个 Java 类来调用 Mybatis Generator 的生成方法。import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.exception.XMLParserException; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class MybatisGeneratorRunner { public void run() throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("src/main/resources/generator/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
通过以上步骤,可以在实际项目中快速生成用户表的数据库访问层代码,提高开发效率并减少手动编写代码的工作量。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章