mybatis 逆向工程实现与使用(后附Spring Boot最基本整合SSM配置)

前言

太久没用Spring Boot了,好像一个新手,报各种错误,逆向工程也搞半天。好累
下面的使用标题就是在yml配置mybatis的信息,最最基本的整合
实际上也就是yml和几个mybatis配置文件弄好就整合好了,很简单

逆向工程

能实现

1.导入maven依赖

注意mysql连接的版本,要和自己本地版本一致,不然会报无法连接数据库的错误
可以通过select version() from dual;查看自己mysql版本

<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

2.generatorConfig.xml文件

这应该是最最进本的xml文件了,放在resources下就行了。放哪都行,下一步就需要找到他的位置
前几行有个targetRuntime,若将后面的Simple去掉,则会生成Example类,代码会复杂很多。

<?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="DB2Tables" targetRuntime="MyBatis3Simple">
        <!-- toString -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

        <!-- 如果不加会在生成的内容中出现很多注释 -->
        <commentGenerator>
            <!-- 是否去除自动生成日期的注释 true:是 : false:否 -->
            <property name="suppressDate" value="true"/>
            <!-- 是否去除所有自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/dongyu?useSSL=false&amp;useUnicode=true&amp;serverTimezone=UTC&amp;characterEncoding=UTF-8"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!--生成entity类存放位置-->
        <javaModelGenerator targetPackage="com.dongyu.entity" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.dongyu.dao" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 有几个表就写几个 表名与要生成的类名 -->
        <table tableName="dy_user" domainObjectName="User" />
        <table tableName="dy_word" domainObjectName="Word" />
    </context>
</generatorConfiguration>

3.执行main方法

自己创建一个类,执行一下main方法就可以实现逆向工程了。
自己遇到的问题:当时执行new File()的时候会说找不到我的xml文件,所以在上一行加了一句String genCfg

public class Generator {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        String genCfg=Generator.class.getClassLoader().getResource("generatorConfig.xml").getPath();
        File configFile = new File(genCfg);
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

使用

使用的话就和自己写的mybatis一样用即可。可我自己也忘记了自己以前怎么配置的。。。而且Example类用不怎么来,还得学习
以下记录mybatis的配置问题:

1.yml文件

还是需要配的,逆向工程只是帮你创建好mapper等这些东西而已

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/dongyu?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
    config-location: classpath:mybatis/mybatis-config.xml
    mapper-locations: classpath:mybatis/mapper/*.xml

mybatis-config.xml自己创建 空的就行,mapper-locations对应的就是逆向工程生成的mapper文件们

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>

2.主方法头部加注解

@MapperScan("com.dongyu.dao")

再自己写一个Controller就行了。
在Spring Boot中只要额外配置一下Mybatis就行了,Spring和MVC都已经整合在Spring Boot中了
Mybatis需要的是 Mapper接口/mapper.xml/config.xml
然后在Spring Boot中需要在

  • application.yml中配置数据库与mybatis的mapper.xml和config.xml信息。
    那还剩下Mapper接口呢?
  • Mapper接口在主方法头上扫描一下就行了
  • 最后一点,mapper.xml顶上namespace需要找到Mapper接口的位置,才能关联起来
    (其实config.xml不写内容也是可以的,基本的信息还是得有)

为什么Test不能调用?

我其实浪费了好多时间在自己写的Test类中调用mapper,用的注解调用的。然后一直报错
我就以为controller中也不行
但controller中写,通过网址去访问时是可以的。
用Test类就会说bean有问题好像。
不懂。


沙雕了,在SpringBoot提供下的test里就可以了,自己随便写的一个类是不行的

反复执行逆向工程

有时候经常会因为数据库设计不好而修改数据库字段,有了逆向工程就很方便,可以直接生成最新的类。
但是mapper.xml不会被覆盖,而是内容会叠加,所以需要一种特别的方法:

mybatis:
    config-location: classpath:mybatis/mybatis-config.xml
    mapper-locations: classpath:mybatis/mapper/*.xml,classpath:mybatis/mapper/own/*.xml

看yml的最后一行,地址有两个,一个是mapper下的xml,一个是mapper/own下的xml。

看意思就知道own下面的是我自己添加的xml,而逆向工程配置中生成的路径是mapper下,所以并不会影响到我的own

所以只要每次要逆向工程时,先将mapper下的xml删除,再生成即可。

own并不会被影响

最后,own中的namespace对应着的是mapper接口,因为mapper接口在逆向工程时是会被覆盖的,所以mapper接口也得分开来
不要在同一个目录下即可,我也是放在一个own下的文件夹中,如下图:

Example类的使用

当删除掉配置中的Simple后,就会自动生成Example类,之后就可以通过Example类来进行数据库操作,不需要自己写sql语句了
但是,不支持连表查询
举Example类的例子:

UserExample ue = new UserExample();
UserExample.Criteria c1 = ue.createCriteria();
c1.andAvatarEqualTo(openId);

List<User> u = um.selectByExample(ue);

ue相当于是你sql查询时候的条件,最后将ue放在um的方法内,执行sql(um是UserMapper创建的对象)
1. um有很多方法,有的方法的形参需要Example类你就需要创建一个Example类放进去
2. 创建ue后,ue也有一些方法,就像是sql语句中的order by之类的
3. ue创建的对象c1,它就像是where语句后的内容,就像下一句的意思就是where avatar = openId,他会取avatar等于openId的数据

最后再提一下,um中的一些方法是有Selective例如um.updateByExampleSelective()
意思就是当你传一个对象进去,它会根据你对象中有的属性进行更改,没有的属性就不会更改。
如果去掉Selective的话,你必须得将所有属性都填上,不然就会报错。

MyBatis多表查询(通过类)

原本应该要写resultMapper标签吧,但我觉得类会简单些
两张表的连接如下,我想连上Word类与Recite类。

自定义个CustomRecite类继承Word类,里面实则是Recite类,
然后xml中的resultType写这个CustomRecite类即可

posted @ 2021-02-24 16:56  lwxx  阅读(473)  评论(0)    收藏  举报