本文详细介绍了如何使用Mybatis代码生成器入门,包括代码生成器的作用、准备工作、配置以及生成代码的基本使用方法。通过配置文件和相关工具,可以快速生成Mapper接口、XML文件和实体类,提高开发效率。此外,还提供了常见问题的解决方法和优化建议,帮助开发者更好地利用Mybatis代码生成器。
Mybatis代码生成器简介Mybatis简介
Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。Mybatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(普通的 Java 对象)映射成数据库中的记录。这使得 Java 开发人员可以使用 SQL 语句和 Mybatis 框架进行数据库访问,而无需手动编写 JDBC 代码。
代码生成器的作用和优势
代码生成器在开发过程中可以帮助开发人员快速生成基础的 Mapper 接口、XML 文件以及实体类。这不仅提高了开发效率,还减少了人为编写代码时可能出现的错误。使用代码生成器可以保证生成的代码质量,同时也可以根据项目需求自定义生成规则,从而提高代码的可维护性和扩展性。
准备工作安装Mybatis
安装 Mybatis 需要在开发项目中引入 Mybatis 的依赖。以下是 Maven 项目中引入 Mybatis 依赖的配置代码:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
准备数据库和表结构
在开发之前,需要先准备好数据库和相关表结构。假设我们使用 MySQL 数据库,并创建一个名为 example
的数据库,在该数据库中创建一个 user
表。以下为创建数据库和表的 SQL 代码:
CREATE DATABASE example;
USE example;
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
email VARCHAR(100)
);
代码生成器的配置
获取Mybatis代码生成器工具
Mybatis 代码生成器工具通常是一个单独的 Java 项目,可以通过 Maven 仓库下载 Mybatis Generator 的依赖。以下是如何在 Maven 项目中引入 Mybatis Generator 依赖的配置代码:
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
配置生成器参数
配置 Mybatis Generator 需要一个 XML 配置文件 generatorConfig.xml
,该文件定义了数据库连接信息、数据表映射规则等信息。以下是 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="MyBatis3Simple">
<commentGenerator>
<property name="suppressDate" value="true"/>
</commentGenerator>
<classPathEntry location="path/to/mysql-connector-java.jar"/>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/example"
userId="root"
password="password"/>
<javaTypeResolver>
<property name="unambiguousTypeExtensions" value="true"/>
</javaTypeResolver>
<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="XMLMAPPER" targetPackage="com.example.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="user" domainObjectName="User"/>
</context>
</generatorConfiguration>
使用代码生成器
生成Mapper接口和XML文件
通过配置文件 generatorConfig.xml
,使用 Mybatis Generator 工具可以生成 Mapper 接口和 XML 文件。运行 Mybatis Generator 会根据配置文件生成相应的代码。
生成的 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);
}
生成的 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="age" jdbcType="INTEGER" property="age" />
<result column="email" jdbcType="VARCHAR" property="email" />
</resultMap>
<sql id="Base_Column_List">
id, name, age, email
</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">
<include refid="Base_Column_List" />
</if>
from user
where id = #{id,jdbcType=INTEGER}
</select>
<!-- 更多SQL语句 -->
</mapper>
生成Entity类
生成的实体类会根据配置文件中的 targetPackage
属性进行生成。以下是生成的实体类示例:
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
// Getter和Setter方法
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
将生成的代码集成到项目中
确保引入 Mybatis 和 Mybatis Generator 的依赖
确保项目中引入了 Mybatis 和 Mybatis Generator 的依赖。
将生成的代码添加到项目中
将生成的 Mapper 接口、XML 文件和实体类添加到项目中。
配置 Mybatis 的主配置文件 mybatis-config.xml
在 Mybatis 的主配置文件 mybatis-config.xml
中配置生成的 Mapper 接口。以下是配置文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.example.model.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/example"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
测试生成的代码
编写单元测试验证 Mapper 接口的功能
测试生成的代码可以通过编写单元测试来验证 Mapper 接口的功能是否正常。以下是使用 JUnit 测试生成的 Mapper 接口的示例代码:
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
import com.example.model.User;
import com.example.mapper.UserMapper;
import java.io.InputStream;
import java.util.List;
public class UserMapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void setUp() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testSelectAll() throws Exception {
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
assertNotNull(users);
assertEquals(0, users.size()); // 根据实际情况调整期望值
}
}
@Test
public void testInsertAndSelect() throws Exception {
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
mapper.insert(user);
session.commit();
User savedUser = mapper.selectByPrimaryKey(user.getId());
assertNotNull(savedUser);
assertEquals(user.getName(), savedUser.getName());
assertEquals(user.getAge(), savedUser.getAge());
assertEquals(user.getEmail(), savedUser.getEmail());
}
}
}
常见问题及解决办法
常见错误及解决方法
-
错误提示:找不到数据库驱动
- 确保项目中引入了数据库驱动依赖,例如 MySQL 的驱动。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency>
-
错误提示:数据库连接失败
- 检查数据库 URL、用户名和密码是否正确。
- 确保数据库服务器正在运行。
- 错误提示:生成的代码与现有代码冲突
- 确保生成的代码路径没有冲突。
- 手动修改生成的代码以适应项目需求。
代码生成器的优化建议
-
自定义代码生成规则
- 通过修改
generatorConfig.xml
文件中的配置,可以自定义生成的代码结构、命名规则等。
- 通过修改
-
使用动态配置
- 对于大型项目,可以将生成器配置文件参数化,通过外部属性文件进行配置。
- 持续集成
- 将代码生成器集成到持续集成流程中,每次提交时自动生成并验证代码。