当前位置: 首页 > news >正文

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

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

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

逆向工程的好处

  • 提高开发效率:逆向工程可以自动生成实体类、Mapper接口和XML映射文件,减少了手动编写这些代码的时间和工作量。开发人员可以专注于业务逻辑的实现,提高开发效率。

  • 保持代码一致性:逆向工程生成的代码与数据库表结构保持一致,避免了手动编写代码时可能出现的拼写错误、字段类型不匹配等问题。这样可以确保代码的准确性和一致性。

  • 易于维护和更新:当数据库表结构发生变化时,可以通过重新运行逆向工程来更新生成的代码,而不需要手动修改和调整代码。这样可以减少维护工作的复杂性和风险。

  • 提供基础代码框架:逆向工程生成的代码提供了基础的增删改查操作,开发人员可以在此基础上进行扩展和定制,快速构建具体业务功能。

  • 避免重复劳动:逆向工程可以自动生成大量的基础代码,避免了开发人员重复编写相似的代码的劳动,提高了开发效率和代码质量。

创建逆向工程的步骤

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

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

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

逆向完毕后实现相关功能的完整目录:
在这里插入图片描述

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

<?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 configurationPUBLIC "-//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 generatorConfigurationPUBLIC "-//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&amp;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构建我们的相关文件

在这里插入图片描述
双击运行,然后我们就可以等待看到我们的目录下,出现了相关生成的文件了。

在这里插入图片描述

其他文件

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查询*/@Testpublic 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)}
}

在这里插入图片描述

其他拓展

关于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模式,当然也有公司采用这种模式,但绝大多数还是传统的开发方式。按照我们正常的开发方式就行,这个模式了解就可。

http://www.lryc.cn/news/356781.html

相关文章:

  • SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?
  • 「数据结构」队列
  • Python01 注释,关键字,变量,数据类型,格式化输出
  • 基于单片机智能防触电装置的研究与设计
  • 机械行业工程设计资质乙级需要哪些人员
  • vivado改变波形图窗口颜色
  • 蓝桥杯练习系统(算法训练)ALGO-932 低阶行列式计算
  • 四川古力未来科技抖音小店安全靠谱,购物新体验
  • 深入理解Seata:分布式事务的解决方案
  • 【TC8】如何测试IOP中PHY芯片的Llink-up time
  • java大学城水电管理系统源码(springboot)
  • LAMP源码编译安装——CentOS7
  • oracle 还原被覆盖的视图
  • go语言同一包中的同一变量实现不同平台设置不同的默认值 //go:build 编译语法使用示例
  • 校园周边美食探索及分享平台,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园周边美食探索及分享平台设计实现
  • Discourse 编辑没有办法显示更多的 JS 错误
  • CSS实现一个雨滴滑落效果
  • vue2+echarts地图下钻+地图遮盖物散点
  • 关于C++的特殊类定制
  • Linux备份脚本
  • 【Unity】实现轮盘抽奖
  • 面下对象之overload与override
  • 大数据之Hive函数大全
  • 宝塔下应该用 Memcached 还是 Redis?
  • 恢复视频3个攻略:从不同情况下的恢复方法到实践!
  • 从git上拉取项目进行操作
  • ES升级--01--环境准备和安装
  • Linux 防火墙 firewalld 常用命令
  • 时间|基于SprinBoot+vue的时间管理系统(源码+数据库+文档)
  • C++青少年简明教程:for循环语句