本文主要介绍如何通过Mybatis-generator插件快速实现表的增删改查等基本操作
@[toc]
首先利用powerdesigner构建数据原型
点击Database->Generate Database生成建表sql
生成的建表sql如下:
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2019/5/27 17:15:12 */
/*==============================================================*/
drop table if exists department;
drop table if exists employee;
/*==============================================================*/
/* Table: department */
/*==============================================================*/
create table department
(
id INT8 not null,
dept_name varchar(20) comment '部门名称',
descr varchar(100) comment '部门描述',
create_time timestamp,
primary key (id)
);
/*==============================================================*/
/* Table: employee */
/*==============================================================*/
create table employee
(
id INT8 not null,
name varchar(20) comment '部门名称',
age varchar(100) comment '部门描述',
gender INT2,
dept_id INT8,
address varchar(100),
create_time timestamp,
primary key (id)
);
新建数据库mybatis-demo,执行上面的sql建表脚本
新建一个springboot项目,新建项目目录如下:
dao:数据库mapper接口存放目录
po:所有的实体类放到目录
mpaaer:所有的xml放在这个目录
application.yml的配置信息如下:
spring:
jmx:
default-domain: mybatis
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
mybatis:
# 指定实体类包路径
typeAliasesPackage: com.wg.demo.po
# 指定xml文件扫描路径
mapper-locations: classpath*:mapper/*.xml
MybatisApplication.java通过使用@MapperScan指定要扫描的Mapper类的包的路径
@SpringBootApplication
@MapperScan({"com.wg.demo.dao"})
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
表创建好后,就可以使用插件来自动生成mapper和xml文件了,但在这之前,需要设置插进进行一些配置,
mybatis-generator主要包括两步:
mybatis-generator-config.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="context" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库的相关配置 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis-demo" userId="root" password="root"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 实体类生成的位置 -->
<javaModelGenerator targetPackage="com.wg.demo.po" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- *Mapper.xml 文件的位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- Mapper 接口文件的位置 -->
<javaClientGenerator targetPackage="com.wg.demo.dao" targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 相关表的配置 -->
<table tableName="employee" domainObjectName="Employee" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/>
<table tableName="department" domainObjectName="Department" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/>
</context>
</generatorConfiguration>
第二步 配置插件的运行参数
mybatis-generator配置好以后,需要在配置一个启动器以便执行
在pom.xml的build节点的
<plugin>
<!--Mybatis-generator插件,用于自动生成Mapper和POJO-->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!--生成代码插件-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</plugin>
这里需要注意的是 1:插件配置文件所在位置要设置正确; 2:在插件内部有引入了mysql-connector-java及mybatis-generator-core的依赖,这个不能省略否则运行时会报错找不到mysql驱动
新建一个启动器:
执行 打印信息如下:
创建成功:
打开EmployeeMapper.java,可以看到mybatis-generator为每张表都生成六个基本的增删改查接口
public interface EmployeeMapper {
//按主键ID删除一条记录
int deleteByPrimaryKey(Long id);
//新增一条记录,所有字段必须赋值,否则会报错
int insert(Employee record);
//新增一条记录,部分字段可为空
int insertSelective(Employee record);
//根据主键ID查询
Employee selectByPrimaryKey(Long id);
//根据实体类更新一条记录,部分更新只对有值的字段进行更新
int updateByPrimaryKeySelective(Employee record);
//更新接口,与上个接口的不同是该接口会无条件更新所有字段,无论字段是否有值
int updateByPrimaryKey(Department record);
}
实际使用中的问题及解决方案
mybatis-generator 无法覆盖已生成的xml的问题
注意:这里有一个坑,每次运行插件自动生成文件时,mapper和实体类会自动覆盖上一次生成的文件没有问题,但是XML文件则会追加到上次的文件末尾,也就是你每运行插件1次,则XML文件的内容会重复一次,造成的结果就是运行项目时会报错,mybatis-generator官方给出的解决方法如下: https://github.com/mybatis/generator/pull/311
首先升级插件版本到1.3.7 然后在 mybatis-generator-config.xml->context 节点下新增UnmergeableXmlMappersPlugin插件配置项
再次运行插件,发现再也没有追加的问题了
手动创建的sql被插件覆盖的问题
使用mybatis-generator插件时,有一个坑爹的问题是,每次数据库表有变动,执行插件重新生成生成相关文件时,会发现之前xml中自己创建的sql会被覆盖
解决方法1:
1.复制整个项目一份,备份的项目主要用来生成xml文件
2.每次生成的xml文件在手工复制主项目中
3.缺点:效率有点低,手工太费事
解决方法2(推荐):
1.针对每个xml创建一个对应extends版本,如针对EmployeeMapper.xml在创建一个EmployeeExtendsMapper.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.wg.demo.dao.EmployeeMapper">
<select id="findByPaging" resultMap="BaseResultMap" parameterType="com.github.pagehelper.Page">
select
*
from employee
</select>
</mapper>
两个文件的namespace保持一致,后面自己新增的sql都写在这个扩展的xml文件中,因为不是同一个文件,这样插件生成的文件就不会覆盖新增的sql了
2.这样还是有问题,生成的Mapper接口文件还是会被覆盖,有网友想到通过新建Mapper接口继承插件生成接口的方法,原理与XML的解决方法相同,大家不妨一试
为了便于测试我配置了swagger
新建EmployeeController.java
@Api(description = "employee相关接口")
@RestController
@RequestMapping("employee")
public class EmployeeController {
Logger logger = LoggerFactory.getLogger(getClass().getName());
@Autowired
private IdWorker idWorker;
@Autowired
private EmployeeMapper employeeMapper;
@ApiOperation(value = "按id查询员工")
@GetMapping("get/{id}")
public ResultMsg getById(@PathVariable(value="id") Long id){
Employee employee = employeeMapper.selectByPrimaryKey(id);
return ResultMsg.getMsg(employee);
}
@ApiOperation(value = "删除员工")
@PostMapping("del/{id}")
public ResultMsg delById(@PathVariable(value="id") Long id){
int result = employeeMapper.deleteByPrimaryKey(id);
return ResultMsg.getMsg(result);
}
@ApiOperation(value = "新增员工")
@PostMapping("new")
public ResultMsg newEmployee(@RequestBody Employee employee){
employee.setId(idWorker.nextId());
int result = employeeMapper.insert(employee);
return ResultMsg.getMsg(result);
}
@ApiOperation(value = "更新员工信息")
@PostMapping("update")
public ResultMsg updateEmployee(@RequestBody Employee employee){
int result = employeeMapper.updateByPrimaryKeySelective(employee);
return ResultMsg.getMsg(result);
}
}
打开浏览器,输入http://localhost:9292/mybatis/swagger-ui.html
好了,至此基于Mybatis-generator插件快速实现基本的增删改查完成了~
Mybatis-generator插件在项目初期,可快速构建项目,生成基本的增删改查接口,确实很方便;但在项目开发中后期,由于加入了大量自己编写的SQL,插件的使用性价比就不是太高了,每次运行插件都会牵扯到覆盖的问题,使用的时候往往不是很爽利,这个问题如果大家有好的解决办法可以交流下。。。。
评论