MyBatis的逆向工程教程
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。
创建逆向工程的步骤
1、添加依赖&插件
<!-- 控制Maven在构建过程中配置相关配置 -->
<build>
<!-- 构建过程中的使用的插件 -->
<plugins>
<!-- MyBatis逆向工程操作插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<!-- 逆向工程生成配置 -->
<configuration>
<!-- 配置逆向工程文件路径 -->
<configurationFile>
src/main/resources/generatorConfig.xml
</configurationFile>
</configuration>
<!-- 插件的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖包 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
构建完成以后,Maven插件管理列表:
2、创建逆向工程配置文件generatorConfig.xml
在resources
目录下创建。
<?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>
<!--
targetRuntime属性: 执行生成的逆向工程的版本
属性值:
MyBatis3Simple: 生成基本的CRUD(简易版本)
MyBatis3: 生成带条件的CRUD(标准版本)
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 表示生成文件不带注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/dbtest1?serverTimezone=GMT%2B8"
userId="root"
password="123456">
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.evan.mybatis.entity"
targetProject=".\src\main\java">
<!-- 开启子包识别 -->
<property name="enableSubPackages" value="true" />
<!-- 将数据表中字段前后的空格清除,生成实体类属性 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.evan.mybatis.mapper"
targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口的生成策略,即DAO接口 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.evan.mybatis.mapper"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 逆向分析的表 -->
<!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
<!-- domainObjectName属性指定生成出来的实体类的类名 -->
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
生成简易版本逆向工程结构
双击逆向工程插件生成工程结构。
最终生成的Mavne工程的整体结构:
注意:构建过程中出现问题,先删除构建中生成的文件在进行重新构建。
创建MyBatis核心配置文件 & properties文件
mybatis-config.xml
<?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>
<!-- 引入外部properties文件,此后就可以在当前文件的数据源连接信息使用${}的方式访问value -->
<properties resource="jdbc.properties"/>
<!-- 全局配置 -->
<settings>
<!-- 将数据表中字段下划线映射为驼峰命名规则 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 设置类型别名 -->
<typeAliases>
<!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
<package name="com.evan.mybatis.entity"/>
</typeAliases>
<!--配置多个连接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--设置连接数据库的驱动-->
<property name="driver" value="${jdbc.driver}"/>
<!--设置连接数据库的连接地址-->
<property name="url" value="${jdbc.url}"/>
<!--设置连接数据库的用户名-->
<property name="username" value="${jdbc.username}"/>
<!--设置连接数据库的密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入mybatis的映射文件 -->
<mappers>
<!--
以包为单位引入映射文件
要求:
1、mapper接口所在的包要和映射文件所在的包一致
2、mapper接口要和映射文件的名字一致
-->
<package name="com.evan.mybatis.mapper"/>
</mappers>
</configuration>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456
测试
创建SqlSessionUtil工具类
public class SqlSessionUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(SqlSessionUtil.class);
public static SqlSession getSession() {
SqlSession sqlSession = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
} catch (IOException e) {
LOGGER.error("SqlSessionUtil.getSession方法出现异常:{0}",e);
}
return sqlSession;
}
}
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyBatisTest {
private static final Logger LOGGER = LoggerFactory.getLogger(MyBatisTest.class);
/**
* 删除操作测试
*/
@Test
public void test1() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
int result = mapper.deleteByPrimaryKey(12);
LOGGER.info("删除操作结果:{}",result);
sqlSession.close();
}
/**
* 添加操作测试
*/
@Test
public void test2() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
int result = mapper.insert(new Emp(0, "lisi", 10, "男", 2));
LOGGER.info("添加操作结果:{}",result);
sqlSession.close();
}
/**
* 根据主键id查询信息测试
*/
@Test
public void test3() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.selectByPrimaryKey(3);
LOGGER.info("查询结果:{}",emp);
sqlSession.close();
}
/**
* 查询所有信息测试
*/
@Test
public void test4() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> emps = mapper.selectAll();
emps.forEach(System.out::println);
sqlSession.close();
}
/**
* 修改操作测试
*/
@Test
public void test5() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp(9,"evan",20,"男",3);
int result = mapper.updateByPrimaryKey(emp);
LOGGER.info("修改操作结果:{}",result);
sqlSession.close();
}
}
生成标准版本逆向工程结构
修改generatorConfig.xml
中的逆向工程版本生成策略:
<!-- 生成标准版本逆向工程结构 -->
<context id="DB2Tables" targetRuntime="MyBatis3">
</context>
双击逆向工程插件生成工程结构。
标准版本最后生成结构:
测试
public class MyBatisTest {
private static final Logger LOGGER = LoggerFactory.getLogger(MyBatisTest.class);
@Test
public void test1() {
SqlSession sqlSession = SqlSessionUtil.getSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
EmpExample empExample = new EmpExample();
/*
根据条件查询数据:
创建条件对象,通过andXXX方法为SQL添加查询添加,每个条件之间是and关系
*/
empExample.createCriteria()
.andEmpNameLike("e")
.andAgeGreaterThan(20).andDeptIdIsNotNull();
//将之前添加的条件通过or拼接其他条件
empExample.or().andGenderEqualTo("男");
//List<Emp> emps = mapper.selectByExample(null);
List<Emp> emps = mapper.selectByExample(empExample);
emps.forEach(System.out::println);
Emp emp = new Emp(11,"haha",12,"女",null);
//普通修改功能,根据主键修改同时属性值null也会被修改
//int result = mapper.updateByPrimaryKey(emp);
//选择性修改,当属性值为null不会被修改
int result = mapper.updateByPrimaryKeySelective(emp);
LOGGER.info("修改操作结果:{}",result);
sqlSession.close();
}
}