springboot中mybatis通用mapper以及代码生成工具使用

1 意义
能够根据数据库表快速生成相应的实体类pojo以及mybatis的mapper接口和xml文件(可选),并且可以对单表进行相对复杂的增删改查操作,省去了添加该类方法的时间,可以把更多精力关注于其他业务逻辑,目前springboot完美兼容通用mapper,有相应的启动依赖

2 使用
2.1 相关配置
2.1.1 Pom文件添加依赖

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.4</version>
</dependency>
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
    </configuration>
</plugin>
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.6</version>
    <configuration>
        <configurationFile>
            ${basedir}/src/main/resources/generator/generatorConfig.xml
        </configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
        <dependency>
            <groupId>com.Oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3.0</version>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>
</plugin>

2.1.2 generatorConfig.xml配置及详解
相关网址:https://www.cnblogs.com/maanshancss/p/6027999.html

我的配置如下:

<?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" targetRuntime="MyBatis3Simple" defaultModelType="flat">


        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
        一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖
     -->
        <property name="autoDelimitKeywords" value="false"/>
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>

        <!-- 生成 JavaBean 对象重写 toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

        <!-- 生成 JavaBean 对象继承 Serializable 类 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <!-- 生成 JavaBean 对象重写 equals 和 hashCode 方法 -->
        <!-- <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" /> -->

        <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
                        connectionURL="jdbc:oracle:thin:@192.168.xx.xxx:1521:prod"
                        userId="newprod"
                        password="bfdds06fd">
        </jdbcConnection>

        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <!--
                Oracle 使用number的情况下
                如果精度>0或者长度>18,就会使用java.math.BigDecimal
                如果精度=0并且10<=长度<=18,就会使用java.lang.Long
                如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
                如果精度=0并且长度<5,就会使用java.lang.Short
            -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.xxx.entity"
                            targetProject="src/main/java"/>

        <sqlMapGenerator targetPackage="com.xxx.mapper"
                         targetProject="src/main/resources"/>

        <javaClientGenerator targetPackage="com.xxx.mapper"
                             targetProject="src/main/java"
                             type="XMLMAPPER"/>



        <table tableName="PRODUCT_INFO">
            <generatedKey column="id"
                          sqlStatement="select {1}_SEQ.nextval from dual"
                          identity="false" type="pre"/>
        </table>


    </context>

</generatorConfiguration>

2.2 运行
2.2.1 INTELLIJ IDEA环境下

点击Edit Configurations 进入然后点击左上角绿色的+,再选择maven,在command line命令行输入 mybatis-generator:generate 命令,然后执行

在这里插入图片描述
在这里插入图片描述

2.2.2 ECLIPSE环境下
ECLIPSE环境下在项目上点击鼠标右键,然后在RUN AS或者DEBUG AS里面选择红色的mave build…,在goal一栏输入mybatis-generator:generate,然后执行

2.2.3 生成的代码
Mapper接口
在这里插入图片描述
实体类
在这里插入图片描述
2.3 在项目中使用

  1. 在启动类上加上mapperScan注解,注解的值basePackages指向mapper接口所在的包
    在这里插入图片描述
  2. 在service中直接注入需要用到的mapper接口即可
    在这里插入图片描述
  3. 增删改查操作
    查询
    在这里插入图片描述
    增加
    在这里插入图片描述
    删除
    在这里插入图片描述
    修改
    在这里插入图片描述
    复杂条件增删改查 比如 BETWEEN,大于,小于,排序,去重,分组等操作需要用到Example对象
    在这里插入图片描述
    或者
    在这里插入图片描述
    这样来使用,下面的代码的意思是查询产品中价格大于1000的产品
    在这里插入图片描述
    3 问题
    3.1 假如数据库方言是oracle的话存在类型转换问题
    代码生成工具生成的实体类pojo数字相关的属性,是根据数据库中number的长度以及精度来控制的
    如果精度>0或者长度>18,就会使用java.math.BigDecimal
    如果精度=0并且10<=长度<=18,就会使用java.lang.Long
    如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
    如果精度=0并且长度<5,就会使用java.lang.Short
    目前咱们数据库中的id的长度都为22,生成的pojo中的主键以及外键的类型都是BigDecimal,这一点需要解决。
    3.2 解决办法(两种)
    3.2.1 这个办法需要对每个id进行类型定义,有点麻烦,个人不推荐
    在这里插入图片描述
    3.2.2 重写编写类型转换器,继承JavaTypeResolve接口,重写里面的calculateJavaType方法
@Override
public FullyQualifiedJavaType calculateJavaType(IntrospectedColumn introspectedColumn) {
    FullyQualifiedJavaType answer;
    JdbcTypeInformation jdbcTypeInformation = typeMap.get(introspectedColumn.getJdbcType());
 
    if (jdbcTypeInformation == null) {
        switch (introspectedColumn.getJdbcType()) {
            case Types.DECIMAL:
            case Types.NUMERIC:
                if (introspectedColumn.getScale() > 0
                    || introspectedColumn.getLength() > 24
                    || forceBigDecimals) {
                    answer = new FullyQualifiedJavaType(BigDecimal.class.getName());
                } else if (introspectedColumn.getLength() > 10) {
                    answer = new FullyQualifiedJavaType(Long.class.getName());
                } else if (introspectedColumn.getLength() > 4) {
                    answer = new FullyQualifiedJavaType(Integer.class.getName());
                } else if (introspectedColumn.getLength() == 1) {
                    answer = new FullyQualifiedJavaType(Boolean.class.getName());
                } else {
                    answer = new FullyQualifiedJavaType(Short.class.getName());
                }
                break;
 
            default:
                answer = null;
                break;
        }
    } else {
        answer = jdbcTypeInformation.getFullyQualifiedJavaType();
    }
 
    return answer;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值