0
点赞
收藏
分享

微信扫一扫

MyBatis系统学习篇 - MyBatis逆向工程


MyBatis的逆向工程是指根据数据库表结构自动生成对应的Java实体类、Mapper接口和XML映射文件的过程。逆向工程可以帮助开发人员快速生成与数据库表对应的代码,减少手动编写重复代码的工作量。

我们在MyBatis中通过逆向工具来帮我简化繁琐的搭建框架,减少我们对实体类的创建和mapper接口等,包括生产xml映射文件,不过一般开发中,我们不怎么使用映射文件生成的东西,因为生成的xml文件并不符合我们实际开发中使用的,所以我们一般通过逆向工具帮我们创建相关文件之后,然后我们在根据创建的文件进行处理。

逆向工程的好处

  • 提高开发效率:逆向工程可以自动生成实体类、Mapper接口和XML映射文件,减少了手动编写这些代码的时间和工作量。开发人员可以专注于业务逻辑的实现,提高开发效率。
  • 保持代码一致性:逆向工程生成的代码与数据库表结构保持一致,避免了手动编写代码时可能出现的拼写错误、字段类型不匹配等问题。这样可以确保代码的准确性和一致性。
  • 易于维护和更新:当数据库表结构发生变化时,可以通过重新运行逆向工程来更新生成的代码,而不需要手动修改和调整代码。这样可以减少维护工作的复杂性和风险。
  • 提供基础代码框架:逆向工程生成的代码提供了基础的增删改查操作,开发人员可以在此基础上进行扩展和定制,快速构建具体业务功能。
  • 避免重复劳动:逆向工程可以自动生成大量的基础代码,避免了开发人员重复编写相似的代码的劳动,提高了开发效率和代码质量。

创建逆向工程的步骤

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

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

  • Java实体类
  • Mapper接口
  • Mapper映射文件

逆向完毕后实现相关功能的完整目录:

MyBatis系统学习篇 - MyBatis逆向工程_mybatis

添加逆向工程的依赖和插件

<?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">
    <parent>
        <artifactId>SSM</artifactId>
        <groupId>com.miaow</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>MyBatis-generator</artifactId>

    <name>MyBatis-generator</name>
    <description>MyBatis</description>

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

    <dependencies>
        <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>
        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!-- 逆向工程的核心依赖 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>
    </dependencies>

    <!-- 控制Maven在构建过程中相关配置 -->
    <build>
        <!-- 构建过程中用到的插件 -->
        <plugins>
            <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>

                <!-- 插件的依赖 -->
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.28</version>
                    </dependency>
                    <!-- 逆向工程的核心依赖 -->
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.6</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

创建MyBatis核心配置文件

mybatis-config.xml

<?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>
    <!--
         MyBatis核心配置文件中,标签的顺序:
         properties?,settings?,typeAliases?,typeHandlers?,
         objectFactory?,objectWrapperFactory?,reflectorFactory?,
         plugins?,environments?,databaseIdProvider?,mappers?
    -->
    <!--引入properties文件-->
    <properties resource="jdbc.properties" />
    <!--设置类型别名-->
    <typeAliases>
        <!--
            typeAlias:设置某个类型的别名
            属性:
                type:设置需要设置别名的类型
                alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名且不区分大小写
        -->
        <!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>-->
        <!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
        <package name="com.miaow.mybatis.bean"/>
    </typeAliases>

<!--    该死的Mybatis 分页插件还有顺序  导入配置还要按照顺序进行-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        </plugin>
    </plugins>

    <!--
        environments:配置多个连接数据库的环境
        属性:
            default:设置默认使用的环境的id
    -->
    <environments default="development">
        <!--
               environment:配置某个具体的环境
               属性:
                   id:表示连接数据库的环境的唯一标识,不能重复
           -->
        <environment id="development">
            <!--
                transactionManager:设置事务管理方式
                属性:
                    type="JDBC|MANAGED"
                    JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理
                    MANAGED:被管理,例如Spring
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:配置数据源
                属性:
              type:设置数据源的类型
              type="POOLED|UNPOOLED|JNDI"
                 POOLED:表示使用数据库连接池缓存数据库连接
                 UNPOOLED:表示不使用数据库连接池
                 JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <!--设置连接数据库的驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--设置连接数据库的连接地址-->
                <property name="url" value="${jdbc.url}"/>
                <!--设置连接数据库的用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--设置连接数据库的密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <!-- 配置多个数据源 -->
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <!--xml引入配置文件  -->
        <!--<mapper resource="mappers/UserMapper.xml"/>-->
        <!--
          以包为单位引入映射文件
             要求:
             1、mapper接口所在的包要和映射文件所在的包一致
             2、mapper接口要和映射文件的名字一致
        -->
        <package name="com.miaow.mybatis.mapper"/>
    </mappers>
</configuration>

创建逆向工程配置文件

文件名必须是: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>
    <!--
            targetRuntime: 执行生成的逆向工程的版本
                MyBatis3Simple: 生成基本的CRUD(清新简洁版)
                MyBatis3: 生成带条件的CRUD(奢华尊享版)
    -->
    <context id="mybatisGenerator" targetRuntime="MyBatis3">

        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!-- 数据库的连接信息 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
           NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- javaBean的生成策略-->
        <javaModelGenerator targetPackage="com.miaow.mybatis.pojo" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略 -->
        <sqlMapGenerator targetPackage="com.miaow.mybatis.mapper" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.miaow.mybatis.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 逆向分析的表 -->
        <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
        <!-- domainObjectName属性指定生成出来的实体类的类名 -->
<!--        <table tableName="user" domainObjectName="User"/>-->
        <table tableName="book" domainObjectName="BookVO">
            <!-- 用于指定生成实体类时是否使用实际的列名作为实体类的属性名 -->
            <property  name="useActualColumnNames"  value="false" />
        </table>
    </context>
</generatorConfiguration>

创建你的MySQL数据库表,我的数据库表很简单

CREATE TABLE `book`  (
     `uid` int(11) NOT NULL COMMENT '用户id',
     `book` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '用户借的书的名称',
     `cool` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'cool星级',
     PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

接下来我们就通过MBG插件的generate构建我们的相关文件

MyBatis系统学习篇 - MyBatis逆向工程_mybatis_02


双击运行,然后我们就可以等待看到我们的目录下,出现了相关生成的文件了。

MyBatis系统学习篇 - MyBatis逆向工程_oracle_03

其他文件

log4j.properties

log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

测试我们的QBC查询

public class AppTest
{
    /**
     * Rigorous Test :-) QBC查询
     */
    @Test
    public void shouldAnswerWithTrue() throws IOException {
//        assertTrue( true );
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession  sqlSession = sqlSessionFactory.openSession();
        BookVOMapper  bookVOMapper = sqlSession.getMapper(BookVOMapper.class);
        //查询所所有数据
//        List<BookVO> list =  bookVOMapper.selectByExample(null);
//        list.forEach(book -> System.out.println(book));

        //根据条件查询
        BookVOExample example = new BookVOExample();
        // 查询条件或者更新条件
        example.createCriteria().andBookEqualTo("张珊").andCoolEqualTo("我很酷");

        //example.or().andUidIsNotNull();

        List<BookVO> list1 =  bookVOMapper.selectByExample(example); //select uid, book, cool from book WHERE ( book = 'JWkQo3pTqV' and cool = 'hMzeUlRCrJ(String) ' ) (BaseJdbcLogger.java:137)
        list1.forEach(book -> System.out.println(book));


//        bookVOMapper.updateByExampleSelective(new BookVO(214,"张珊","我很酷"),example);   //update book SET uid = 214, book = '张珊', cool = '我很酷' WHERE ( book = 'JWkQo3pTqV' and cool = 'hMzeUlRCrJ(String) ' ) (BaseJdbcLogger.java:137)
    }
}

MyBatis系统学习篇 - MyBatis逆向工程_bc_04

其他拓展

关于QBC查询是提供基于XML映射文件和注解的方式来对SQL进行查询。

什么是QBC

QBC(Query By Criteria)是一种查询方式,用于根据一组条件来构建查询语句,而不是直接编写SQL语句。它是一种面向对象的查询方式,通过使用条件对象来描述查询条件,从而实现动态和灵活的查询。

在QBC中,查询条件通常由一组条件对象(Criteria)组成,每个条件对象表示一个查询条件。条件对象包含属性名、操作符和值等信息,用于描述查询的约束条件。通过组合和连接多个条件对象,可以构建复杂的查询语句。

QBC的优点包括:

  • 灵活性:QBC允许根据不同的查询需求动态构建查询语句,可以根据条件的组合和连接来灵活地生成不同的查询条件。
  • 可读性:使用条件对象来描述查询条件,使查询语句更加直观和易于理解,减少了直接编写SQL语句的复杂性。
  • 可维护性:由于查询条件是通过条件对象来描述的,当查询需求变化时,只需修改条件对象的属性,而不需要修改底层的SQL语句,提高了查询的可维护性。

QBC查询的步骤:

  • 创建一个查询条件对象(Criteria): 创建一个Java类,用于封装查询条件。这个类可以包含各种属性,用于表示查询的条件,例如字段名、操作符和值等。
  • 在Mapper接口中定义查询方法: 在Mapper接口中定义一个方法,该方法接受Criteria对象作为参数,并返回查询结果。方法的实现可以通过XML映射文件或注解来编写SQL语句,根据Criteria对象的属性动态生成查询条件。
  • 编写XML映射文件或注解: 在XML映射文件或注解中,根据Criteria对象的属性动态生成查询条件。可以使用MyBatis提供的动态SQL标签(如if、choose、when、otherwise等)来根据条件生成不同的查询语句。
  • 调用查询方法: 在业务代码中,创建一个Criteria对象,设置查询条件,然后调用Mapper接口中定义的查询方法进行查询。查询结果将根据条件动态生成的SQL语句进行查询,并返回符合条件的结果。

QBC在许多ORM(对象关系映射)框架中得到广泛应用,例如Hibernate和MyBatis。这些框架提供了API和工具,用于构建和执行QBC查询,简化了查询的编写和执行过程。

ps:国内一般开发很少采用QBC模式,当然也有公司采用这种模式,但绝大多数还是传统的开发方式。按照我们正常的开发方式就行,这个模式了解就可。


举报

相关推荐

0 条评论