Spring Boot 项目利用 MyBatis Generator 进行数据层代码自动生成 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX    Blogger

Spring Boot 项目利用 MyBatis Generator 进行数据层代码自动生成

  •  
  •   hansonwang99 2019-02-14 07:34:32 +08:00 2977 次点击
    这是一个创建于 2498 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Profile


    概 述

    MyBatis Generator (简称 MBG) 是一个用于 MyBatis 和 iBATIS 的代码生成器。它可以为 MyBatis 的所有版本以及 2.2.0 之后的 iBATIS 版本自动生成 ORM 层代码,典型地包括我们日常需要手写的 POJOmapper xml 以及 mapper 接口等。MyBatis Generator 自动生成的 ORM 层代码几乎可以应对大部分 CRUD 数据表操作场景,可谓是一个生产力工具啊!


    数据库准备与工程搭建

    • 首先我们准备一个 MySQL 数据表 user_info用于下文实验

    里面插入了若干条数据:

    准备数据表

    • 新建一个 Spring Boot 工程

    • 引入 MyBatis Generator 依赖

    <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> <scope>provided</scope> </dependency> 
    • 引入 MyBatis Generator Maven 插件
    <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.7</version> <configuration> <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile> <overwrite>true</overwrite> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> </dependencies> </plugin> 

    MyBatis Generator Maven 插件引入以后,我们可以在 Spring Boot 工程的 Maven 插件工具栏中看到新增的插件选项,类似下图:

    MyBatis Generator Maven 插件


    准备 MyBatis Generator 配置文件

    MyBatis Generator 也需要一个 xml 格式的配置文件,该文件的位置配在了上文 引入 MyBatis Generator Maven 插件的 xml 配置里,即src/main/resources/mybatis-generator.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="MySql" defaultModelType="flat"> <plugin type="org.mybatis.generator.plugins.SerializablePlugin" /> <jdbcConnection driverClass="com.mysql.jdbc.Driver" cOnnectionURL="jdbc:mysql://121.196.123.245:3306/demo" userId="root" password="xxxxxx" /> <javaModelGenerator targetPackage="cn.codesheep.springbt_mybatis_generator.entity" targetProject="src/main/java"></javaModelGenerator> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"></sqlMapGenerator> <javaClientGenerator targetPackage="cn.codesheep.springbt_mybatis_generator.mapper" targetProject="src/main/java" type="XMLMAPPER"></javaClientGenerator> <table tableName="user_info"> <property name="modelOnly" value="false"/> </table> </context> </generatorConfiguration> 

    上面 xml 中几个关键的配置简介如下:

    • < jdbcConnection /> 数据库连接配置,至关重要
    • <javaModelGenerator /> 指定自动生成的 POJO 置于哪个包下
    • <sqlMapGenerator /> 指定自动生成的 mapper.xml 置于哪个包下
    • <javaClientGenerator /> 指定自动生成的 DAO 接口置于哪个包下
    • <table /> 指定数据表名,可以使用_和%通配符

    更多关于 MyBatis Generator 配置的内容,可以移步 官方文档


    运行 MyBatis Generator

    直接通过 IDEA 的 Maven 图形化插件来运行 MyBatis Generator,其自动生成的过程 和 生成的结果如下图所示:

    自动生成的过程和结果

    很明显,通过 MyBatis Generator,已经很方便的帮我们自动生成了 POJOmapper xml 以及 mapper接口,接下来我们看看自动生成的代码怎么用!


    自动生成的代码如何使用

    我们发现通过 MyBatis Generator 自动生成的代码中带有一个 Example 文件,比如上文中的 UserInfoExample,其实 Example 文件对于平时快速开发还是有很大好处的,它能节省很多写 sql 语句的时间,举几个实际的例子吧:

    • 单条件模糊搜索 + 排序

    在我们的例子中,假如我想通过用户名 user_name来在 MySQL 数据表 user_info中进行模糊搜索,并对结果进行排序,此时利用UserInfoExample可以方便快速的实现:

    @Autowired private UserInfoMapper userInfoMapper; public List<UserInfo> searchUserByUserName( String userName ) { UserInfoExample userInfoExample = new UserInfoExample(); userInfoExample.createCriteria().andUserNameLike( '%'+ userName +'%' ); // 设置模糊搜索的条件 String orderByClause = "user_name DESC"; userInfoExample.setOrderByClause( orderByClause ); // 设置通过某个字段排序的条件 return userInfoMapper.selectByExample( userInfoExample ); } 
    • 多条件精确搜索

    再比如,我们想通过电话号码 phone和用户名 user_name 两个字段来在数据表 user_info中实现精确搜索,则可以如下实现:

    public List<UserInfo> multiConditionsSearch( UserInfo userInfo ) { UserInfoExample userInfoExample = new UserInfoExample(); UserInfoExample.Criteria criteria = userInfoExample.createCriteria(); if( !"".equals(userInfo.getPhone()) ) criteria.andPhoneEqualTo( userInfo.getPhone() ); if( !"".equals(userInfo.getUserName()) ) criteria.andUserNameEqualTo( userInfo.getUserName() ); return userInfoMapper.selectByExample( userInfoExample ); } 

    很明显可以看出的是,我们是通过直接编写代码逻辑来取代编写 SQL 语句,因此还是十分直观和容易理解的!


    后 记

    由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



    6 条回复    2019-02-14 09:26:38 +08:00
    tomoya92
        1
    tomoya92  
       2019-02-14 07:50:16 +08:00 via iPhone
    mybatisplus 不用自动生成了
    aa6563679
        2
    aa6563679  
       2019-02-14 08:04:32 +08:00 via iPhone
    MyBatis Generator 用起来真的捉急,如果自定了 select xml 再增加字段会急死人
    gejun123456
        3
    gejun123456  
       2019-02-14 08:11:27 +08:00 via iPhone
    @aa6563679 加了字段后 mybatis generator 会把 java 接口给覆盖掉
    可以试试 https://github.com/gejun123456/MyBatisCodeHelper-Pro
    我开发的 idea 插件 直接从 intellij 的数据库生成 crud 代码 在数据库加减字段后重新生成不会覆盖手动加的方法
    fuckshiter
        4
    fuckshiter  
       2019-02-14 09:02:11 +08:00 via iPhone
    @gejun123456 日常开发,是手动用代码维护关系,还是用 mybatis 的一对一,一对多维护的?
    gejun123456
        5
    gejun123456  
       2019-02-14 09:23:06 +08:00 via iPhone
    @fuckshiter 流量不大 应该都可以 之前待的互联网公司用 mysql 一般不写 join 查询 可以参考 https://blog.csdn.net/qq_15037231/article/details/78982668
    lychnis
        6
    lychnis  
       2019-02-14 09:26:38 +08:00 via Android
    不懂 Java 但看代码应该是把 SQL 做了 API 封装?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1141 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 17:55 PVG 01:55 LAX 09:55 JFK 12:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86