Mybatis官方生成器(Mybatis Generator)是一个强大的工具,用于生成Mybatis的映射文件和DAO接口,能够减少手工代码编写,提高开发效率。本文将详细介绍如何配置Mybatis官方生成器,包括生成器的配置文件编写、输出目录和包名配置以及映射规则配置。通过自动生成代码,可以快速搭建数据库操作的基础环境。
Mybatis环境搭建Mybatis是一个优秀的持久层框架,它是SqlSession的简单封装,提供了动态SQL、存储过程等功能。Mybatis能够通过简单的配置和Java对象来完成大部分SQL操作,对于用户来说,只需要关注自己的业务逻辑,其他都由Mybatis框架负责处理。本文将详细介绍如何搭建Mybatis环境。
Mybatis简介Mybatis是一个开源的持久层框架,它简化了数据库操作,使得开发者能够通过简单的配置和Java对象来完成大部分SQL操作。Mybatis的核心思想是将SQL语句配置在XML文件中,或注解在Java对象中,然后通过Mybatis提供的API执行SQL语句,并将结果映射为Java对象。这种编程方式使得数据库操作变得非常灵活,同时也大大降低了数据库操作的复杂度。
下载Mybatis并引入项目为了在项目中使用Mybatis,首先需要下载Mybatis的jar包并将其引入到项目中。
-
下载Mybatis
- 访问Mybatis官网(https://mybatis.org/mybatis-3/zh/index.html)下载最新版本的Mybatis jar包。
- 或者使用Maven或Gradle等构建工具自动下载和管理依赖。
- 引入Mybatis依赖
- 如果使用Maven,可以在
pom.xml
文件中添加以下依赖:<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- 添加数据库驱动依赖,例如MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> </dependencies>
- 如果使用Gradle,可以在
build.gradle
文件中添加以下依赖:dependencies { implementation 'org.mybatis:mybatis:3.5.7' implementation 'mysql:mysql-connector-java:8.0.26' }
- 如果使用Maven,可以在
为了让Mybatis能够操作数据库,需要创建一个实际的数据库及表。这里以MySQL数据库为例。
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE t_user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(50),
email VARCHAR(50)
);
配置数据库连接信息
为了使Mybatis能够连接到MySQL数据库,需要在项目中配置数据库连接信息。通常,这些信息会配置在application.properties
或application.yml
文件中。
-
配置文件
-
如果使用Spring Boot,可以在
application.properties
文件中添加数据库连接信息:spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 如果使用Spring框架,可以在
applicationContext.xml
文件中配置数据源:<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean>
-
Mybatis官方生成器(Mybatis Generator)是一个强大的工具,用于生成Mybatis的映射文件和DAO接口。通过自动生成代码,可以减少重复的开发工作,提高开发效率。
什么是Mybatis官方生成器Mybatis官方生成器(Mybatis Generator)是一个开源工具,它能够自动生成Mybatis所需的映射文件(XML)和对应的Java接口(Mapper接口),这些生成的代码可以帮助开发者快速搭建数据库操作的基础环境。
生成器的作用及优势- 减少手工代码编写
- 使用Mybatis Generator可以自动生成映射文件和Mapper接口,减少了手工编写的繁琐工作。
- 提高开发效率
- 自动生成代码,使得开发人员可以专注于业务逻辑的实现,而不需要花费大量时间编写基础的数据库操作代码。
- 维护方便
- 自动生成的代码遵循一定的规则,便于维护和扩展。
- 支持多种数据库
- Mybatis Generator支持多种数据库,包括MySQL、Oracle、SQL Server等。
为了使用Mybatis Generator生成代码,需要在项目中正确配置生成器的配置文件。
编写生成器配置文件Mybatis Generator的配置文件通常是一个XML文件,命名为generatorConfig.xml
。该文件指定了数据库连接信息、生成的代码的位置、生成规则等。
示例配置文件
<generatorConfiguration>
<classPathEntry location="D:/generator/mysql-connector-java-8.0.26.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverType="MySQL">
<property name="connectionURL" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
<property name="password" value="root" />
<property name="userId" value="root" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="t_user" domainObjectName="User" enableCounting="true" />
</context>
</generatorConfiguration>
配置文件说明
- classPathEntry:指定数据库驱动的路径。
- context:生成器的上下文,可以在其中配置生成器的行为。
- commentGenerator:配置生成的代码注释。
- jdbcConnection:配置数据库连接信息。
- javaModelGenerator:配置生成的Java模型类。
- sqlMapGenerator:配置生成的SQL映射文件。
- javaClientGenerator:配置生成的Mapper接口。
- table:指定要生成代码的数据库表。
在generatorConfig.xml
文件中,可以配置生成代码的输出目录和包名。
输出目录和包名配置
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
配置文件说明
- targetPackage:生成代码的目标包名。
- targetProject:生成代码的目标项目路径。
- enableSubPackages:是否启用子包。
- trimStrings:是否去除字符串的空格。
在generatorConfig.xml
文件中,可以通过配置table
标签来指定生成器的映射规则。
映射规则配置
<table tableName="t_user" domainObjectName="User" enableCounting="true" />
配置文件说明
- tableName:数据库表名。
- domainObjectName:生成的Java模型类名。
- enableCounting:是否生成计数方法。
生成器生成代码的步骤包括配置生成器配置文件、运行生成器、解析生成的代码。
生成器生成代码的步骤- 配置生成器配置文件:在项目中创建一个
generatorConfig.xml
文件,并根据需要配置生成器的参数。 - 运行生成器:通过命令行或IDE运行生成器,生成对应的Java接口、映射文件及实体类。
- 解析生成的代码:生成的代码包括Java接口、映射文件和实体类,需要理解这些代码的基本结构。
运行生成器
可以使用命令行工具或IDE运行生成器。
命令行
java -cp mybatis-generator-core-1.3.7.jar:lib/* org.mybatis.generator.api.MyBatisGenerator -configfile generatorConfig.xml -overwrite
IDE
- 创建一个新的Java类,用于调用生成器。
- 添加Mybatis Generator的jar包到项目的类路径中。
-
编写代码调用生成器。
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.util.ArrayList; import java.util.List; public class MybatisGeneratorRunner { public static void main(String[] args) throws Exception { List<String> warnings = new ArrayList<>(); boolean overwrite = true; File configFile = new File("src/main/resources/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); } }
解析生成的代码
生成的代码通常包括以下几个部分:
- 实体类:对应的数据库表的Java模型类。
- Mapper接口:包含数据库操作方法的Java接口。
- 映射文件:包含SQL语句的XML文件。
实体类
生成的实体类通常位于配置文件中指定的包下。例如,假设配置文件中targetPackage
为com.example.model
,那么生成的实体类将位于src/main/java/com/example/model
目录下。
public class User {
private Integer id;
private String username;
private String password;
private String email;
// 构造函数
// Getter和Setter方法
}
Mapper接口
生成的Mapper接口位于配置文件中指定的包下。例如,假设配置文件中targetPackage
为com.example.mapper
,那么生成的Mapper接口将位于src/main/java/com/example/mapper
目录下。
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);
}
映射文件
生成的映射文件位于配置文件中指定的包下。例如,假设配置文件中targetPackage
为com.example.mapper
,那么生成的映射文件将位于src/main/resources/com/example/mapper
目录下。
<?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" property="id" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="email" property="email" />
</resultMap>
<sql id="Base_Column_List">id, username, password, email</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
SELECT
<if test="distinct">
DISTINCT
</if>
<include refid="Base_Column_List" />
FROM t_user
WHERE id = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO t_user (username, password, email)
VALUES (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR})
</insert>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
DELETE FROM t_user WHERE id = #{id,jdbcType=INTEGER}
</delete>
<update id="updateByPrimaryKey" parameterType="com.example.model.User">
UPDATE t_user SET
username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR}
WHERE id = #{id,jdbcType=INTEGER}
</update>
</mapper>
如何运行生成器
使用命令行或IDE运行生成器时,确保generatorConfig.xml
文件路径正确,并且设置了正确的数据库连接信息和输出目录。
生成的代码可以帮助开发者快速搭建数据库操作的基础环境,包括如何使用生成的Mapper接口及XML文件,以及如何使用生成的实体类。
如何使用生成的Mapper接口及XML文件生成的Mapper接口及XML文件可以与Mybatis的SqlSession集成,实现对数据库表的CRUD操作。
使用Mapper接口
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class UserMapperExample {
public static void main(String[] args) {
// 读取Mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
// 查询所有用户
List<User> users = mapper.selectAll();
for (User user : users) {
System.out.println(user);
}
// 添加用户
User newUser = new User();
newUser.setUsername("John");
newUser.setPassword("123456");
newUser.setEmail("john@example.com");
mapper.insert(newUser);
// 更新用户信息
User updatedUser = new User();
updatedUser.setId(1);
updatedUser.setUsername("John");
updatedUser.setPassword("654321");
mapper.updateByPrimaryKey(updatedUser);
// 删除用户
mapper.deleteByPrimaryKey(1);
session.commit();
session.close();
}
}
代码说明
- 读取Mybatis配置文件:使用
SqlSessionFactoryBuilder
从配置文件中读取Mybatis配置。 - 获取SqlSession:通过
SqlSessionFactory
打开一个SqlSession
。 - 获取Mapper实例:通过
SqlSession.getMapper
方法获取Mapper接口的实现类。 - 执行数据库操作:调用生成的Mapper接口中的方法,进行数据库的CRUD操作。
生成的实体类可以作为参数传递给Mapper接口的方法,或作为方法的返回值。
使用实体类
import com.example.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class UserEntityExample {
public static void main(String[] args) {
// 读取Mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
// 查询用户
User user = mapper.selectByPrimaryKey(1);
System.out.println(user);
// 更新用户
User updatedUser = new User();
updatedUser.setId(1);
updatedUser.setUsername("John");
updatedUser.setPassword("654321");
updatedUser.setEmail("john@example.com");
mapper.updateByPrimaryKey(updatedUser);
session.commit();
session.close();
}
}
代码说明
- 读取Mybatis配置文件:使用
SqlSessionFactoryBuilder
从配置文件中读取Mybatis配置。 - 获取SqlSession:通过
SqlSessionFactory
打开一个SqlSession
。 - 获取Mapper实例:通过
SqlSession.getMapper
方法获取Mapper接口的实现类。 - 使用实体类:创建实体类对象,作为参数传递给Mapper接口中的方法,或作为方法的返回值。
为了更好地理解生成器生成的代码的使用,下面给出一个具体的CRUD操作示例。
CRUD操作示例
import com.example.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class CRUDExample {
public static void main(String[] args) {
// 读取Mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
// 插入用户
User newUser = new User();
newUser.setUsername("John");
newUser.setPassword("123456");
newUser.setEmail("john@example.com");
mapper.insert(newUser);
session.commit();
// 查询用户
User user = mapper.selectByPrimaryKey(newUser.getId());
System.out.println(user);
// 更新用户
newUser.setUsername("John Updated");
newUser.setPassword("654321");
mapper.updateByPrimaryKey(newUser);
session.commit();
// 删除用户
mapper.deleteByPrimaryKey(newUser.getId());
session.commit();
// 查询所有用户
List<User> users = mapper.selectAll();
for (User u : users) {
System.out.println(u);
}
session.close();
}
}
代码说明
- 读取Mybatis配置文件:使用
SqlSessionFactoryBuilder
从配置文件中读取Mybatis配置。 - 获取SqlSession:通过
SqlSessionFactory
打开一个SqlSession
。 - 获取Mapper实例:通过
SqlSession.getMapper
方法获取Mapper接口的实现类。 - 插入用户:创建一个新的用户对象,并调用Mapper接口的
insert
方法将其插入数据库。 - 查询用户:调用Mapper接口的
selectByPrimaryKey
方法查询用户。 - 更新用户:修改用户对象的信息,并调用Mapper接口的
updateByPrimaryKey
方法更新数据库中的用户信息。 - 删除用户:调用Mapper接口的
deleteByPrimaryKey
方法删除用户。 - 查询所有用户:调用Mapper接口的
selectAll
方法查询所有用户。
在使用Mybatis Generator过程中,可能会遇到一些常见问题。下面列出了常见问题及其解决方案,以及生成器的高级配置和自定义扩展方法。
常见错误及解决方案错误1:找不到数据库表
- 问题描述:生成器无法找到数据库表。
- 解决方案:确保
generatorConfig.xml
文件中的tableName
配置正确,并且数据库中存在该表。
错误2:生成器无法连接数据库
- 问题描述:生成器无法连接到数据库。
- 解决方案:检查
generatorConfig.xml
文件中的数据库连接信息,确保connectionURL
、driverClass
、password
、userId
等配置正确。
错误3:生成的代码不正确
- 问题描述:生成的Mapper接口或映射文件中的SQL语句不正确。
- 解决方案:检查
generatorConfig.xml
文件中的配置,确保table
标签中的tableName
和domainObjectName
配置正确。
错误4:生成器运行时抛出异常
- 问题描述:运行生成器时抛出异常。
- 解决方案:查看异常信息,检查
generatorConfig.xml
文件中的配置是否正确。确保所有路径和类路径设置正确。
Mybatis Generator提供了许多高级配置,可以进一步定制生成的代码。
高级配置示例
<generatorConfiguration>
<classPathEntry location="D:/generator/mysql-connector-java-8.0.26.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverType="MySQL">
<property name="connectionURL" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
<property name="password" value="root" />
<property name="userId" value="root" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
<property name="immutable" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
<property name="supportMToNMappings" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="additionalInterfaces" value="com.example.mapper.ext.MyCustomMapper" />
</javaClientGenerator>
<table tableName="t_user" domainObjectName="User" enableCounting="true">
<generatedKey column="id" sqlType="INTEGER" identity="true" />
<columnOverride column="username" javaType="String" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
配置文件说明
- immutable:是否生成不可变实体类。
- supportMToNMappings:是否支持多对多映射。
- additionalInterfaces:指定额外的接口文件。
Mybatis Generator支持自定义扩展,可以进一步定制生成的代码。
自定义扩展示例
<generatorConfiguration>
<classPathEntry location="D:/generator/mysql-connector-java-8.0.26.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverType="MySQL">
<property name="connectionURL" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
<property name="password" value="root" />
<property name="userId" value="root" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
<property name="immutable" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
<property name="supportMToNMappings" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="additionalInterfaces" value="com.example.mapper.ext.MyCustomMapper" />
</javaClientGenerator>
<table tableName="t_user" domainObjectName="User" enableCounting="true">
<generatedKey column="id" sqlType="INTEGER" identity="true" />
<columnOverride column="username" javaType="String" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
配置文件说明
- generatedKey:定义主键生成规则。
- columnOverride:覆盖某些列的Java类型和数据库类型。
通过以上配置,可以进一步定制生成的代码,满足特定的需求。