Mybatis的逆向工程讲解

Mybatis的逆向工程

正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。

逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:

Java实体类

Mapper接口

Mapper映射文件

①添加依赖和插件

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zhp</groupId>
    <artifactId>learn04</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>

        <!-- Mybatis核心 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>log4j</groupId>-->
<!--            <artifactId>log4j</artifactId>-->
<!--            <version>1.2.17</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.1</version>
        </dependency>
<!--         slf4j日志门面的一个具体实现 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>
    <!--控制Maven在构建过程中相关配置-->
    <build>
        <!--构建过程中用到的插件-->
        <plugins>
            <!--具体插件,逆向工程的操作是以构建过程中插件形式出现的-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                    <!--Mysql驱动-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.16</version>

                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

②创建 MyBatis 的核心配置文件

③创建逆向工程的配置文件

文件名必须是:generatorConfig.xml

  • targetRuntime:执行生成的逆向工程的版本

    • MyBatis3Simple: 生成基本的CRUD(清新简洁版)
    • MyBatis3: 生成带条件的CRUD(奢华尊享版)
  • suppressAllComments:是否去除自动生成的注释

    • true:是 : false:否
  • jdbcConnection:数据库连接的信息:驱动类、连接地址、用户名、密码

  • forceBigDecimals:默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和NUMERIC 类型解析为java.math.BigDecimal

  • javaModelGenerator:生成PO类的位置

  • sqlMapGenerator:mapper映射文件生成的位置

  • javaClientGenerator:mapper接口生成的位置

  • table:指定要逆向生成的表

java 复制代码
<?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="testTables" targetRuntime="MyBatis3Simple">

        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"
                        userId="root"
                        password="root">
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <javaModelGenerator targetPackage="com.zhp.pojo"
                            targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀,就是.能被作为文件的下一层  -->
            <property name="enableSubPackages" value="true" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.zhp.mapper"
                         targetProject=".\src\main\resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.zhp.mapper"
                             targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 指定数据库表
                tableName 数据库中的表
                domainObjectName 实体类名
                其中mapper pojo都会根据domainObjectName来创建
                -->
        <table tableName="product" domainObjectName="Product"/>

    </context>
</generatorConfiguration>

创一个product表用于逆向工程测试

sql 复制代码
CREATE TABLE product (
    id BIGINT AUTO_INCREMENT COMMENT '商品ID,主键' PRIMARY KEY,
    name VARCHAR(100) NOT NULL COMMENT '商品名称',
    price DECIMAL(10, 2) COMMENT '价格,单位:元',
    stock INT DEFAULT 0 COMMENT '库存数量',
    status TINYINT DEFAULT 1 COMMENT '状态:1上架,0下架',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

运行逆向工程

可以看到product的类和mapper映射文件都成功生成了,并且mapper中生成了很多方法

上边是MyBatis3Simple生成的简单的基本的CRUD,现在我们修改targetRuntime为MyBatis3,然后将刚才生成的都删除,再重新生成一下

可以看到豪华版生成会有很多高级的方法

测试:

下边来使用一下豪华版方法的使用

java 复制代码
    @Test
    public void testGenerator() throws IOException {

        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
        SqlSession sqlSession = build.openSession(true);
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        //插入数据
        Product product = new Product();
        product.setId(1l);
        product.setName("长袖");
        product.setCreateTime(new Date());
        product.setStock(1);
        product.setPrice(new BigDecimal(25));
        product.setStatus((byte) 1);
        mapper.insert(product);
        //查询
        ProductExample productExample = new ProductExample();
        productExample.createCriteria().andIdEqualTo(1l).andNameEqualTo("长袖");
        productExample.or().andPriceEqualTo(new BigDecimal(25));
        List<Product> products = mapper.selectByExample(productExample);
        products.forEach(System.out::println);
        //更新数据,如果加条件的更新那么条件加进去之后如果为空就不更新数据
        Product product2 = new Product();
        product2.setId(1l);
        product2.setName("长袖222");
        mapper.updateByPrimaryKeySelective(product2);
    }

总结:逆向工程只是单表操作,如果涉及多表操作还是要自己写。所以日常开发中我们使用MyBatis3Simple生成的简单的基本的CRUD就行。豪华版的方法很多都用不上

相关推荐
w***H6502 小时前
SpringCloud-持久层框架MyBatis Plus的使用与原理详解
spring·spring cloud·mybatis
草原印象5 小时前
Spring SpringMVC Mybatis框架整合实战
java·spring·mybatis·spring mvc
2***65635 小时前
SpringBootInvalid bound statement (not found)的原因和解决方案
mybatis
小坏讲微服务6 小时前
Spring Boot 4.0 与 MyBatis Plus 整合完整指南
java·spring boot·后端·mybatis·springcloud·mybatis plus·java开发
攻心的子乐6 小时前
redission 分布式锁
前端·bootstrap·mybatis
编程修仙6 小时前
第四篇 封装SqlSessionFactory
java·数据库·mybatis
N***p3657 小时前
IDEA搭建SpringBoot,MyBatis,Mysql工程项目
spring boot·intellij-idea·mybatis
代码or搬砖17 小时前
MyBatisPlus讲解(二)
java·mybatis
b***653217 小时前
springboot整合mybatis-plus(保姆教学) 及搭建项目
spring boot·后端·mybatis