本文介绍了MyBatis的基本概念、工作原理以及MyBatis官方生成器的作用和使用场景。文章详细讲解了安装和配置MyBatis官方生成器的步骤,并展示了如何生成Java模型类、Mapper接口和XML文件。通过实践案例和常见问题解答,进一步帮助读者理解和使用MyBatis官方生成器。
Mybatis的基本概念MyBatis简介
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(普通老式Java对象)映射成数据库中的记录。MyBatis提供了强大的映射语句和存放结果映射及增删改查等操作的支持,简化了数据访问层的开发工作。
MyBatis的工作原理
MyBatis的工作流程主要包括以下几个步骤:
- 读取配置文件:MyBatis读取配置文件(如
mybatis-config.xml
)来配置数据库连接信息和映射文件路径。 - 构建SqlSessionFactory:使用
SqlSessionFactoryBuilder
类创建SqlSessionFactory
。SqlSessionFactory
是一个工厂类,用于创建SqlSession
。 - 创建SqlSession:通过
SqlSessionFactory
创建SqlSession
,SqlSession
提供了执行SQL语句的接口。 - 执行SQL语句:通过
SqlSession
执行SQL语句,进行数据库的增删改查操作。 - 处理结果:MyBatis自动将查询结果映射到Java对象,提供了一种简单的方式来处理复杂的数据库操作。
官方生成器的作用
MyBatis Generator是MyBatis的一个官方工具,用于生成数据库的映射文件和Java模型类。它能够简化项目中数据访问层的开发工作,减少手动编写SQL映射文件和Java模型类的时间和错误。
官方生成器的使用场景
MyBatis Generator主要适用于以下场景:
- 代码自动生成:当表结构复杂,需要频繁更新时,使用MyBatis Generator可以自动生成映射文件和模型类。
- 简化开发流程:对于新项目,MyBatis Generator可以快速生成基本的数据访问层代码。
- 降低手动编码错误:使用MyBatis Generator生成代码可以减少手动编写SQL和Java代码的错误。
准备开发环境
- 安装JDK:确保已安装Java开发工具包(JDK),并配置好环境变量。
- IDE配置:使用IntelliJ IDEA或Eclipse等IDE进行开发。
- 数据库配置:安装MySQL等数据库,并创建相应的数据库和表。
下载和配置生成器
-
下载MyBatis Generator:从MyBatis Generator的GitHub仓库下载最新版本的jar包。具体下载地址和版本信息可以在MyBatis Generator的官方文档中找到。
- 配置生成器:在项目的
resources
目录下创建generatorConfig.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_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 数据库驱动类 -->
<classPathEntry value="mysql-connector-java-8.0.22.jar"/>
<!-- 数据库连接信息 -->
<jdbcConnection driverType="MySQL">
<property name="connectionURL" value="jdbc:mysql://localhost:3306/test"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="password" value="password"/>
<property name="userId" value="root"/>
</jdbcConnection>
<!-- 实体类生成配置 -->
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<!-- Mapper接口生成配置 -->
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<!-- Java Mapper接口生成配置 -->
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<!-- 表映射 -->
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
使用MyBatis官方生成器生成代码
配置生成器XML文件
generatorConfig.xml
文件用于配置MyBatis Generator的各个生成器插件和数据库连接信息。每个<context>
标签内可以配置多个<table>
标签,每个标签代表一个数据库表的生成配置。
以下是一个配置文件示例:
<?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_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<classPathEntry value="mysql-connector-java-8.0.22.jar"/>
<jdbcConnection driverType="MySQL">
<property name="connectionURL" value="jdbc:mysql://localhost:3306/test"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="password" value="password"/>
<property name="userId" value="root"/>
</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" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
生成Java模型类
MyBatis Generator根据数据库表结构生成Java模型类。以下是一个生成的模型类示例:
package com.example.model;
import java.util.Date;
public class User {
private Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
生成Mapper接口和XML文件
MyBatis Generator生成Mapper接口和对应的XML文件。以下是一个生成的Mapper接口示例:
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);
}
以下是一个生成的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="name" jdbcType="VARCHAR" property="name" />
<result column="email" jdbcType="VARCHAR" property="email" />
</resultMap>
<sql id="Base_Column_List">
id, name, email
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select
<if test="select != null">
${select}
</if>
<if test="select == null">
*
</if>
from user
<where>
<if test="id != null">
and id = #{id, jdbcType=INTEGER}
</if>
</where>
</select>
<insert id="insert" parameterType="com.example.model.User">
insert into user (id, name, email)
values (#{id, jdbcType=INTEGER}, #{name, jdbcType=VARCHAR}, #{email, jdbcType=VARCHAR})
</insert>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from user
where id = #{id, jdbcType=INTEGER}
</delete>
<update id="updateByPrimaryKeySelective" parameterType="com.example.model.User">
update user
<set>
<if test="name != null">
name = #{name, jdbcType=VARCHAR},
</if>
<if test="email != null">
email = #{email, jdbcType=VARCHAR},
</if>
</set>
where id = #{id, jdbcType=INTEGER}
</update>
</mapper>
生成器的高级配置
自定义生成的代码模板
MyBatis Generator允许自定义生成的代码模板。你可以在generatorConfig.xml
文件中配置模板文件路径。以下是一个配置示例:
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java" fileEncoding="UTF-8">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
<property name="modelType" value="flat"/>
<property name="templateLocation" value="src/main/resources/templates"/>
</javaModelGenerator>
将模板文件放置在src/main/resources/templates
位置,并指定modelType
属性为flat
。
配置DAO层的生成规则
MyBatis Generator允许自定义生成的DAO层规则。你可以在generatorConfig.xml
文件中配置生成的DAO层规则。以下是一个配置示例:
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="additionalProperties" value="beginningOfLineWithColon=true"/>
</javaClientGenerator>
实践案例及常见问题解答
生成器的典型应用场景
-
新项目初始化:
- 在新项目启动时,使用MyBatis Generator生成数据访问层的基本代码模板。例如,生成用户表的映射文件和模型类:
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
- 数据库表结构调整:
- 当数据库表结构发生变化时,可以使用MyBatis Generator重新生成更新后的映射文件和模型类。
- 代码维护:
- 在项目维护阶段,可以通过MyBatis Generator生成新的代码模板,减少手动编写代码的工作量。
常见问题及解决方法
- 生成器配置文件错误:
- 确保
generatorConfig.xml
文件配置正确,包括数据库连接信息、表名等。
- 确保
- 生成代码不正确:
- 检查数据库表结构是否与配置文件中的表名一致。
-
生成代码不更新:
- 解决方法:清除生成代码缓存,重新运行生成器。例如:
mvn mybatis-generator:generate
- 生成代码出现编译错误:
- 解决方法:检查生成的代码文件路径是否正确,IDE编译设置是否正确,确保生成的文件与项目结构一致。