分享记录

代码生成


​ 在软件开发的过程中,大多数时间我们的开发都是面向数据库表的增删改查开发,通过通用的增删改查代码生成器,可以有效的提高效率,降低成本;把有规则的重复性劳动让机器完成

1. MyBatis Generator使用

1.1 引入

​ 从最开始直接使用JAVA原生的API(JDBC)操作数据库实现dao层,到Mybatis的框架帮助我们实现dao层(mapper);已经简化了我们的大多数操作;但是随着进一步的学习使用后,感觉每次设计好数据库表后的操作流程几乎类似,似乎还可以"偷懒".

让我们一起回顾一下流程

  • 数据库表设计

  • domain

    • 实体类
    • 私有字段
    • getter/setter方法
    • toString方法
  • mapper映射器

    • Mapper接口
    • 声明方法(CRUD)
  • mapper映射文件

    • 创建mapper.xml文件
    • 实现SQL语句映射

    以上流程在大多数的情况下我们都是固定的(抬杠除外~),这时候我们就想如果有一个代码生成器可以帮我实现这段代码就好了(放心懒狗不止你一个),然而机智的MyBatis早已经预判了你的预判,MyBatis官方就为我们提供了一个代码生成工具MyBatis Generator

2. 如何快速"食用"Mybatis generator

​ MyBatis Generator (MBG) is a code generator for MyBatis MyBatis. It will generate code for all versions of MyBatis. It will introspect a database table (or many tables) and will generate artifacts that can be used to access the table(s). This lessens the initial nuisance of setting up objects and configuration files to interact with database tables. MBG seeks to make a major impact on the large percentage of database operations that are simple CRUD (Create, Retrieve, Update, Delete). You will still need to hand code SQL and objects for join queries, or stored procedures.

直接开整(使用Maven的方式)

  • 在pom.xml文件中导入相关的依赖
<project ...>
     ...
     <build>
       ...
       <plugins>
        ...
        <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.4.0</version>
        </plugin>
        ...
      </plugins>
      ...
    </build>
    ...
  </project>
  • 创建并编写配置文件
<?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>
  <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <property name="useActualColumnNames" value="true"/>
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <columnOverride column="DATE_FIELD" property="startDate" />
      <ignoreColumn column="FRED" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    </table>

  </context>
</generatorConfiguration>

​ 以上模板中配置了数据库的连接驱动,连接的数据库的四大金刚,不适用BigDecimal字段,生成domain的包路径规则,生成的mapper.xml路径规则,生成的mapper映射器路径规则,配置需要生成代码的表与实体类的对应规则(这也是我们关注的)

useActualColumnNames:字段名与列名相同

generatedKey:配置自增主键列

columnOverride:覆写的字段名与列名的对应

ignoreColumn:忽略该列

  • 声明代码

实操

  • 创建一个maven项目mybatis_generator_test
  • 导入依赖
    <properties>
        <!--指定各依赖的版本-->
        <!--mysql驱动-->
        <mysql.connector>8.0.22</mysql.connector>
        <!--mybatis核心-->
        <mybatis.version>3.4.6</mybatis.version>
        <!--mybatis-generator-->
        <mybatis.generator.version>1.4.0</mybatis.generator.version>
    </properties>
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector}</version>
        </dependency>
        <!--mybatis核心-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--mybatis-generator-maven-plugin:与maven集成的插件-->
			<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>${mybatis.generator.version}</version>
                <configuration>
                    <!--mybatis的代码生成器的配置文件-->
                    <configurationFile>src/main/resources/mbg-config.xml</configurationFile>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 创建配置文件mbg-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="mysql" defaultModelType="conditional" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"
                userId="root"
                password="whj123">
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>
        <javaModelGenerator targetPackage="cn.itsource.domain" targetProject="src/main/java">
            <property name="constructorBased" value="true"/>
            <property name="enableSubPackages" value="false"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="cn.itsource.mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <javaClientGenerator targetPackage="cn.itsource.mapper" type="XMLMAPPER"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <table tableName="user"/>
    </context>
</generatorConfiguration>
  • 生成代码

image-20201202142749372image-20201202143407005

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

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

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

  • 测试
    @Test
    public void selectByPrimaryKey() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        System.out.println(mapper.selectByPrimaryKey(1L));
    }
  • 结果

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

3.MGB的进阶

上面的例子只是简单的使用了下,在开发过程中我们还会遇到其他的问题

需求:

  • 我想在ssm环境中使用
  • 在springboot中使用
  • 我想使用注解的方式
  • 我想动态查询
  • 我想定制我类生成的样式
  • 我想…

以上的 需求都在mgb-config.xml中配置即可

优点:

  • 在表格多的时候,可以减少工作量
  • 不容易出现写错的低级Bug
  • 适配性高:对于数据库的表(列)名映射,生成的字段,各种数据库的语法等都适配
  • 低耦合:例如在动态查询的example类
  • 高内聚:mapper.xml中的基本结果集映射,和SQL抽取
  • 还可以给我们提供一些自己代码的参考规范(重点)

缺点:

  • 只支持单表查询,多表查询还是需要自己来写
  • 结果集映射也需要自己写

2. Typroa图床上传功能

发现许多同学都是使用Typroa编辑自己的笔记,工欲善而利器,在我们笔记时会使用大量的图片,那么问题来了,我们在存放图片的时候路径是如下的在本地磁盘的绝对路径(平时都是截屏的,鬼知道我放在哪个文件夹下的),如果我一不小心删除了或者这个文档发给别人看,这个md文件就无法找到引用的图片,这是一个麻烦的问题.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RntVttym-1611821444264)(https://i.loli.net/2020/12/02/lMGKc5eZbHkA7RI.png)]

2.1 解决

  • 文件–>偏好设置–>图像–>上传服务设定
  • 下载Picgo-core(这是一个typroa内置的picgo)
  • 选择 |打开配置文件|
{
  "picBed": {
    "uploader": "smms",
    "smms": {
      "token": "QYSKXc1jNYzbIuEYkU9Z3k2YfxlAgMbZ" //这里面的token换成刚刚生成的 sm.ms 的token
    }
  },
  "picgoPlugins": {}
}
  • 验证图片上传选项
image-20201202153546676

2.2 图床

个人理解:相当于一个资源服务器(只存图片),需要上传和下载资源服务;上传图片并返回获取地址(支持公网访问)

图床服务

  • 免费的
    • sm.ms
    • github
    • 七牛云
    • 码云
  • 收费的(用不起)
    • 阿里云OSS
    • 腾讯云OSS
  • 自己搭建的 (麻烦主要是不会)
    • 自己写一个文件上传服务器,贴一张接口协议,求大佬指点

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

3.未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值