原创

Mybatis 实现基本的增删改查 (基于Mybatis-generator插件方式)

前言

本文主要介绍如何通过Mybatis-generator插件快速实现表的增删改查等基本操作

@[toc]

1.建表建库

首先利用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建表脚本

2.创建spring boot项目

新建一个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);
    }
}

3.配置mybatis-generator插件

表创建好后,就可以使用插件来自动生成mapper和xml文件了,但在这之前,需要设置插进进行一些配置,

mybatis-generator主要包括两步:

  • 第一步设置插件的配置参数,这里需要配置的信息包括5个
  1. 数据库相关信息配置,包括驱动名称、数据库名、用户名、密码
  2. 生成实体类的位置,确保targetPackage包名设置正确
  3. 生成的Mpper.xml存放位置,这里将mapper保存到resources目录下的mapper文件夹中
  4. 接口文件的存放位置,

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);
}

实际使用中的问题及解决方案

  1. 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插件配置项

再次运行插件,发现再也没有追加的问题了

  1. 手动创建的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的解决方法相同,大家不妨一试

4.编写controller

为了便于测试我配置了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,插件的使用性价比就不是太高了,每次运行插件都会牵扯到覆盖的问题,使用的时候往往不是很爽利,这个问题如果大家有好的解决办法可以交流下。。。。

原创

评论