欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

crud有啥意思,快来用代码生成器偷懒吧

程序员文章站 2022-06-15 23:40:27
...

Mybatis-generator的两种使用方式

为什么我们需要代码生成器?

还记得我刚刚入行的时候,那会儿,感觉根据数据库字段创建model,生成getter,setter方法,mapper,xml的crud代码和SQL的编写,这些一搞就是一天,感觉真的好有成就感~~~

现在呢? 确实是不想做这种重复性的工作,这也许就是成长.


代码生成器在网上有很多很多了, 但是有一些代码生成器适合于你的公司,但是不一定适合你平时自己悄摸学习提升.

下面就和大家介绍两种非常普遍的和一种升级版的代码生成器的集成方式

  • 写写写
  • 点点点
  • tk+写写写

先把我用的数据表赠送给有需要的人~~~

CREATE TABLE `lol_hero` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',
  `nick_name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '外号',
  `name` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄名字',
  `age` int DEFAULT NULL COMMENT '英雄年龄',
  `sex` enum('-1','0','1') COLLATE utf8_bin NOT NULL DEFAULT '-1' COMMENT '-1未知 0 男 1女',
  `occupation` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '职业',
  `famous` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '口头禅',
  `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `lol_hero` VALUES (1, '德玛西亚之力', '盖伦', 18, '0', '战士', 'dedededede', '2020-05-13 16:07:31');
INSERT INTO `lol_hero` VALUES (2, '黑暗之女', '安妮', 6, '1', '法师', '提伯斯', '2020-05-13 16:08:12');
INSERT INTO `lol_hero` VALUES (3, ' 狂战士', '奥拉夫', 40, '0', '战士', NULL, '2020-05-13 16:16:03');
INSERT INTO `lol_hero` VALUES (4, '正义巨像', '加里奥', 80, '-1', '法坦', NULL, '2020-05-13 16:16:40');
INSERT INTO `lol_hero` VALUES (5, '卡牌大师', '崔斯特', 31, '0', '法师', NULL, '2020-05-13 16:17:09');
INSERT INTO `lol_hero` VALUES (6, '德邦总管', '赵信', 28, '0', '战士', '一点寒芒先到,随后枪出如龙', '2020-05-13 16:18:08');
INSERT INTO `lol_hero` VALUES (7, '无畏战车', '厄加特', 43, '0', '坦克/战士', 'emmmm', '2020-05-13 16:19:40');

1 最常见-写写写

pom引依赖+generatorConfig.xml

第一种方式,其实是我们最常用的代码生成方式

在集成该代码生成器的时候,我们需要以下三部分:

  • pom引入相关依赖
  • application.properties(或yml)相关配置
  • 复制粘贴generatorConfig.xml,文件内进行相关修改
1 pom引依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--数据库连接池-->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>

        <!--mysql connector-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <!--tk.mybatis 基础SQL-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--代码生成器-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.0</version>
                <configuration>
                    <configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.18</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.0.4</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
2 application.yml 配置
server:
  port: 80

spring:
  application:
    name: diginto

#数据库
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    username: root
    password: paasword
    url: jdbc:mysql://localhost:3306/diginto?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size:  200
      max-lifetime: 60000

mybatis:
  mapper-locations: classpath:/mapper/*.xml
  type-aliases-package: com.taurus.diginto.crud.model

记得账号密码数据库,以及包地址改成自己的

3 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:起个名字 -->
    <!-- targetRuntime:设置生成的文件适用于那个 mybatis 版本 -->
    <context id="default" targetRuntime="MyBatis3">
 
        <!--optional,旨在创建class时,对注释进行控制-->
        <commentGenerator>
            <property name="suppressDate" value="true" />
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
 
        <!--jdbc的数据库连接 除了driverClass改成自己的-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ajyl_medical_model?serverTimezone=UTC"
                        userId="root"
                        password="123456">
        </jdbcConnection>
 
        <!--非必须,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <!-- 默认情况下数据库中的 decimal,bigInt 在 Java 对应是 sql 下的 BigDecimal 类 -->
            <!-- 不是 double 和 long 类型 -->
            <!-- 使用常用的基本类型代替 sql 包下的引用类型 -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
 
        <!-- targetPackage:生成的实体类所在的包 -->
        <!-- targetProject:生成的实体类所在的硬盘位置 改成自己的-->
        <javaModelGenerator targetPackage="com.ajyl.modules.asset.entity"
                            targetProject="src/main/java">
            <!-- 是否允许子包 -->
            <property name="enableSubPackages" value="false" />
            <!-- 是否对modal添加构造函数 -->
            <property name="constructorBased" value="true" />
            <!-- 是否清除从数据库中查询出的字符串左右两边的空白字符 -->
            <property name="trimStrings" value="true" />
            <!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
            <property name="immutable" value="false" />
        </javaModelGenerator>
 
        <!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 改成自己的-->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resource">
            <!-- 针对数据库的一个配置,是否把 schema 作为字包名 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
 
        <!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 改成自己的-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.ajyl.modules.asset.dao" targetProject="src/main/java">
            <!-- 针对 oracle 数据库的一个配置,是否把 schema 作为字包名 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
 <!--属性分别表示:表名 实体名(可不用显式编辑) 是否生成countSQL 是否生成更新SQL 是否生成删除SQL 是否生成查询单数据SQL 是否生成根据主键查询SQL默认为true-->
<!--如果 只保留tableName以及其数据库表主键的配置,那么实体类名会根据数据库表按驼峰的方式命名生成,所有CRUD的SQL也会生成,此处建议只保留tableName和generatedKey 其它全部用默认-->
        <!--改成自己的表名-->
        <table tableName="asset_product_feedback" domainObjectName="AssetProductFeedback"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
             <!-- 数据库表主键 -->
        <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

这个generatorConfig.xml算是注释详尽的很了,所以不要手敲啊,因为没有提示,注定会敲错,直接粘过来,根据注释看一遍就好了

注意:有一些地方需要修改成自己项目的包地址,哪里需要改成自己的项目包地址注释上都已经标出

4 最后 generator

IDEA最右侧的Maven工具栏, Plugins -> mybatis-generator -> mybatis-generator:generate(双击它)

如果一切都很顺利, 会在你对应的包下生成,实体类,一个没有加类注解的Mapper以及对应的xml文件

最后请大家通过这个mapper测一下你配置的数据库是否OK;

2 最简单-点点点

Free MyBatis plugin插件在Idea中生成代码

前题必备:首先请确认你的IDEA已经装好插件:Free Mybatis plugin

点点点其实就很简单了,上面我们说IDEA最右侧的Maven工具栏, 很多人都在使用这个Maven工具栏,但是对与其相邻的Database却视而不见;

这里和大家说一下这个工具栏有啥神奇之处

如果你没用过这个工具栏,点开它其实是空白一片的,当你点开+按钮,光标指向Data Source的时候就会不由得惊呼,卧槽,真叼,集成了N多数据库,向我这种只使用MySQL的足矣~~~
crud有啥意思,快来用代码生成器偷懒吧

连接数据库
crud有啥意思,快来用代码生成器偷懒吧

连接数据库的方式和Navicat一样一样的

代码生成

连接上数据库之后,就是下面这个样子
crud有啥意思,快来用代码生成器偷懒吧

我们选中lol_hero这个表,右键之
crud有啥意思,快来用代码生成器偷懒吧
crud有啥意思,快来用代码生成器偷懒吧
点击OK, lol_hero表生成的domain,mapper,以及SQL文件就会在对应的包下产生

最后请大家通过这个mapper测一下你配置的数据库是否OK;

3 tk升级写写写

tk.Mapper省略了简单的SQL

不知不觉,如果你觉得看这些最基础的CRUD很烦了,说明你老了~~~
此时相见不如不见,但是该咋整呢? 这个时候我们就可以借助 tk.mapper这个jar包来搞它!

注意事项:

(1) 引入tk依赖包(发现一不小心已经在上面给出了,这里就不重复)

(2) 写写写的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>
    <!--执行generator插件生成文件的命令: call mvn mybatis-generator:generate -e -->
    <!-- 引入配置文件 -->
<!--    <properties resource="application.yml"/>-->
    <!--classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置(一定要换) -->
    <classPathEntry
            location="D:\job\mvn\repository\mysql\mysql-connector-java\8.0.20\mysql-connector-java-8.0.20.jar"/>

    <!-- 一个数据库一个context -->
    <!--defaultModelType="flat" 大数据字段,不分表 -->
    <context id="MysqlTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
        一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
        <property name="autoDelimitKeywords" value="true"/>
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="utf-8"/>
        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <!--覆盖xml文件-->
<!--        <plugin type="com.xqnode.boot.util.OverwriteXmlPlugin"/>-->
        <!--toString-->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
        <!--<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>-->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
        </plugin>

        <!--集成lombok-->
<!--        <plugin type="org.mybatis.generator.plugins.LombokPlugin" >-->
<!--            <property name="hasLombok" value="true"/>-->
<!--        </plugin>-->

        <!-- 注释   type="com.xqnode.boot.util.CommentGenerator" -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳-->
        </commentGenerator>

        <!-- jdbc连接  &amp;表示 & 这里记得换成自己的-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/diginto?serverTimezone=GMT%2B8"
                        userId="root"
                        password="aaa@qq.com#$"/>
        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成实体类地址 这里记得换成自己的-->
        <javaModelGenerator targetPackage="com.taurus.diginto.crud.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成mapxml文件 这里记得换成自己的-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources/mapper">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- 生成mapxml对应client,也就是接口dao 这里记得换成自己的-->
        <javaClientGenerator targetPackage="com.taurus.diginto.crud.mapper" targetProject="src/main/java"
                             type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 -->
        <!-- tableName=% 则匹配数据库的所有表,注意将domainObjectName和mapperName置为空-->
        <!-- enableCountByExample等设置生成简单的crud操作方法-->
        <table tableName="lol_hero" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
<!--            <property name="useActualColumnNames" value="false"/>-->
            <!-- 数据库表主键 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

和上面的写写写,这里就多了一些插件,比如:集成了lombok,这里给注释掉了,lombok使用起来很方便,但是有些架构师也不建议使用它,这里以后再说吧.

其它的不用变,包记得引用,数据库以及mybatis的配置记得配,生成代码的方式也是一样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSxvvyBQ-1589871837812)(C:\Users\ThinkPad\AppData\Roaming\Typora\typora-user-images\1589868609112.png)]

但是生成的mapper和xml你就会发现什么都木有了,xml文件里面只有一个resultMap存在,那我们测试的时候该怎么用呢? 此时我们就需要借助tk.mapper了

代码

    @Test
    void testMapper(){
        LolHero lolHero = lolHeroMapper.selectByPrimaryKey(1);
        System.out.println(lolHero.toString());
    }

上溯这个selectByPrimaryKey就会发现它是tk.mapper的一个接口

我们生成的这个LolHeroMapper其集成了一个Mapper类,这个类其实就是tk包中的类,具体tk.mapper的东西我们也另说

import com.taurus.diginto.crud.model.LolHero;
import tk.mybatis.mapper.common.Mapper;

public interface LolHeroMapper extends Mapper<LolHero> {
}

最后请大家通过这个mapper测一下你配置的数据库是否OK;

相关标签: 效率