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.mzph.cn/bicheng/17963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS推送证书过期处理

苹果推送证书的有效期都是一年&#xff0c;将要过期的时候&#xff0c;苹果官方会发邮件提醒。 一、过期 在电脑上找到并打开其它->钥匙串访问&#xff1b; 我的证书可以看到各个App的推送证书&#xff0c;如果过期了&#xff0c;显示红色X 二、重新创建 1、登陆apple开…

如何解决三层单点故障

我给他整成下面这样行不行呀 一个pc的默认网关只有一个&#xff0c;pc1配置的是1.1&#xff0c;那么路由坏了&#xff0c;他还是给1.1发送数据&#xff0c;冗余的那个也没用上呀 用VRRP&#xff08;虚拟路由冗余协议&#xff09;解决以上问题 那光把这个R1和R2虚拟成一个R3&…

windows 执行node报错 800A1391

在项目下执行node -v的时候&#xff0c;抛了这个错误&#xff0c;一开始没发现有啥问题 现在一看&#xff0c;这个报错里的node怎么是个文件... 出现这个问题&#xff0c;是因为项目下&#xff0c;有个同名的文件叫node.js&#xff0c;搞得windows一时不知道是想打开node.js文…

通过提示工程将化学知识整合到大型语言模型中

在当今快速发展的人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正成为科学研究的新兴工具。这些模型以其卓越的语言处理能力和零样本推理而闻名&#xff0c;为解决传统科学问题提供了全新的途径。然而&#xff0c;LLMs在特定科学领域的应用面临挑战&#…

大型央企国企信创化与数字化转型规划实施方案(71页PPT)

方案介绍&#xff1a; 随着全球信息技术的迅猛发展&#xff0c;数字化转型已成为企业提升竞争力、实现可持续发展的必经之路。作为国家经济的重要支柱&#xff0c;大型央企国企在信创化与数字化转型方面承载着重要的责任和使命。本方案旨在通过系统性的规划和实施&#xff0c;…

Discourse 使用 DiscourseConnect 来进行用户数据同步

我们都知道 Discourse 的用户管理和设置都高度依赖电子邮件。 如果 Discourse 没有设置电子邮件 SMTP 的话&#xff0c;作为管理员是没有办法对用户邮箱进行修改并且通过验证的。 可以采取的办法是通过 Discourse 的 DiscourseConnect 来进行用户同步。 根据官方的说法&…

如何取消公众号的在线客服绑定授权

1&#xff0c;功能设置 2&#xff0c;公众号设置 3&#xff0c;查看详情&#xff0c;取消

开发远程遥控情趣玩具软件,提供现成程序源码应具备哪些基础功能

以“东莞梦情智能”为参考&#xff0c;其提供的现成情趣玩具遥控软件程序源码&#xff0c;所具备哪些基础功能&#xff0c;看看它们如何让情趣玩具变得更加丰富多彩。 一、设备连接 设备连接是情趣玩具遥控软件的基础功能之一。“东莞梦情智能”的现成源码支持多种连接方式&am…

mysql中text,longtext,mediumtext区别

文章目录 一.概览二、字节限制不同三、I/O 不同四、行迁移不同 一.概览 在 MySQL 中&#xff0c;text、mediumtext 和 longtext 都是用来存储大量文本数据的数据类型。 TEXT&#xff1a;TEXT 数据类型可以用来存储最大长度为 65,535(2^16-1)个字符的文本数据。如果存储的数据…

开源VS闭源:谁更能推动AI技术的普及与发展?

一、引言 在人工智能&#xff08;AI&#xff09;技术的浪潮中&#xff0c;开源与闭源两种模式一直并存&#xff0c;并各自在推动AI技术普及与发展上发挥着重要作用。然而&#xff0c;关于哪种模式更能有效地推动AI技术的普及与发展&#xff0c;一直存在着激烈的讨论。本文将深…

树莓派指令

1.常用指令 2.在终端窗口编辑文本文件 2.1nano编辑器 在文本里ctrlG就可以查看更多的快捷按键 2.2vi编辑器 进入默认为命令模式

百川股份:大王蹲完,小王蹲

一根大阴线&#xff0c;正丹股份的十倍股传奇之旅即将落幕&#xff1f; 有股民表示&#xff1a;化工板块还有高手&#xff0c;大王倒了还有小王。 今天我们聊的正是化工板块被称为“正丹第二”的百川股份。 虽难比正丹的十倍涨幅&#xff0c;但百川也不简单&#xff0c;3个月…

视频号小店是怎么操作的?适用于所有人的操作玩法!

大家好&#xff0c;我是电商小V 视频号小店是怎么操作的呢&#xff1f;这是刚开始去做&#xff0c;或者是刚了解的小伙伴最疑惑的问题&#xff0c; 视频号小店是22年推出的&#xff0c;也是目前最火的一个创业型项目&#xff0c;也是吸引了不少的商家入驻&#xff0c;今天咱们就…

PLC远程调试

随着工业自动化的快速发展&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;已经成为现代工业生产线的核心控制设备。然而&#xff0c;传统的PLC调试方式往往受限于地理位置和物理连接&#xff0c;使得工程师在调试过程中面临诸多不便。在这个背景下&#xff0c;HiWoo …

OpenHarmony 实战开发——内核对象队列之算法详解

前言 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09; LiteOS-M 内核是面向 IoT 领域构建的轻量级物联网操作系统内核&#xff0c;具有小体积、低功耗、高性能的特点。在嵌入式领域的开发工作中&#xff0c;无论是自研还是移植系统&#xff0c;均绕不开…

使用chatglm.cpp本地部署ChatGLM3-6B模型

ChatGLM3模型介绍 ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型&#xff0c;在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上&#xff0c;ChatGLM3-6B 引入了如下特性&#xff1a; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base …

Yourpassword does not satisfy the current policyrequirements

mysql 新增数据库用户失败 解决方法&#xff1a; 修改校验密码策略等级 set global validate_password.policyLOW;

【面试】PWM(脉冲宽度调制)相关问题 ——长期更新

1、PWM调节原理 答&#xff1a;通过改变信号的高电平和低电平的持续时间比例来控制输出信号的平均功率或电压。 2、PWM占空比定义 答&#xff1a;在一个脉冲周期内&#xff0c;高电平的时间占整个周期时间的比例。 3、PWM波形的周期和调节精度由谁决定 答&#xff1a;当计数…

全同态加密生态项目盘点:FHE技术的崛起以及应用

撰文&#xff1a;Chris&#xff0c;Techub News 在当今数字化的时代&#xff0c;隐私保护已成为一个全球性的焦点话题&#xff0c;特别是在加密货币和区块链技术快速发展的背景下。虽然当前的隐私技术在保护数据安全方面多有欠缺&#xff0c;引发了广泛的关注和批评&#xff0c…

BUUCTF-WEB3

[极客大挑战 2019]Knife1 1.打开附件链接 一句话木马eval($_POST["Syc"]); 2.中国蚁剑 用中国蚁剑连接 在根目录下找到一个名为flag的文件 3.得到flag [极客大挑战 2019]Upload1 1.打开附件链接 是一个文件上传 2.一句话木马 经过多次尝试都被绕过&#xff0c;更…