MyBatis学习总结(五)逆向工程

news2024/9/29 3:31:50

MyBatis学习总结(五)逆向工程

一、MyBatis的逆向工程

  • 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工
    程的。
  • 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
    • Java实体类
    • Mapper接口
    • Mapper映射文件

二、创建逆向工程的步骤

1 添加依赖和插件

<!-- 依赖MyBatis核心包 -->
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</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>
				<!-- 数据库连接池 -->
				<dependency>
					<groupId>com.mchange</groupId>
					<artifactId>c3p0</artifactId>
					<version>0.9.2</version>
				</dependency>
                <!-- MySQL驱动 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.29</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

2 创建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>
    <properties resource="druid.properties"/>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
        <package name="pers.tianyu.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${druid.driver}"/>
                <property name="url"
                          value="${druid.url}"/>
                <property name="username" value="${druid.username}"/>
                <property name="password" value="${druid.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="pers.tianyu.mapper"/>
    </mappers>
</configuration>

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

文件名必须是:generatorConfig.xml

这个配置文件是需要根据自己数据库、实体类包名、接口包名、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>
    <!--context 是逆向工程的主要配置信息
        id:唯一标识(配置信息的名字)
        targetRuntime: 执行生成的逆向工程的版本
            MyBatis3Simple: 生成基本的CRUD(清新简洁版)
            MyBatis3: 生成带条件的CRUD(奢华尊享版)
    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">

        <!--optional 在创建class时,对注释进行控制-->
        <commentGenerator>
            <!--去除自动生成的注解 true:是 false:否-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 数据库的连接信息 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis?userUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTime=GMT%2B8&amp;nullCatalogMeansCurrent=true"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!--非必须,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <!--处理NUMERIC和DECIMAL类型的策略-->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--targetPackage:生成的实体类所在的包
            targetProject:生成的实体类所在的硬盘位置
        -->
        <javaModelGenerator targetPackage="pers.tianyu.bean"
                            targetProject=".\src\main\java">
            <!-- 是否对modal添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!--是否允许子包-->
            <property name="enableSubPackages" value="true"/>
            <!--是否清理从数据库中查询出的字符串左右两边的空白字符-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--targetPackage:生成的mapper文件所在的包
            targetProject:生成的mapper文件所在的硬盘位置
        -->
        <sqlMapGenerator targetPackage="pers.tianyu.mapper"
                         targetProject=".\src\main\resources">
            <!--针对数据库的一个配置,是否把 schema 作为字包名-->
            <property name="enableSubPackages" value="true"/>
            <!--是否清理从数据库中查询出的字符串左右两边的空白字符-->
            <property name="trimStrings" value="true" />
        </sqlMapGenerator>

        <!--targetPackage:生成的Mapper接口所在的包
            targetProject:生成的Mapper接口所在的硬盘位置
        -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="pers.tianyu.mapper"
                             targetProject=".\src\main\java">
            <!--针对数据库的一个配置,是否把 schema 作为字包名-->
            <property name="enableSubPackages" value="true"/>
            <!--是否清理从数据库中查询出的字符串左右两边的空白字符-->
            <property name="trimStrings" value="true" />
        </javaClientGenerator>

        <!-- 逆向分析的数据库表 -->
        <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
        <!-- domainObjectName属性指定生成出来的实体类的类名 -->
        <table tableName="t_emp" domainObjectName="Emp"/>
        <table tableName="t_dept" domainObjectName="Dept"/>
    </context>
</generatorConfiguration>

4 执行MBG插件的generate目标

在这里插入图片描述

5 效果

在这里插入图片描述

6 窜库问题

问题:运行逆向工程,如果生成的pojo实体类和mapper出现了多个重复的文件(如xx.java.1文件)

原因:其他数据库中存在相同的表名,mybatis自动生成时窜库了。

在这里插入图片描述

官网解释

解决方法一:

在generatorConfig.xml文件中jdbcConnection标签内添加标签

<!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mybatis?userUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTime=GMT%2B8"
                userId="root"
                password="root">
    <property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
1234567

解决方法二:

在generatorConfig.xml文件中jdbcConnection标签内connectionURL中添加nullCatalogMeansCurrent=true

<!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mybatis?userUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTime=GMT%2B8&amp;nullCatalogMeansCurrent=true"
                userId="root"
                password="root">
</jdbcConnection>
123456

11.2、QBC查询

1 奢华尊享版

删除:(清新简洁版)生成的mapper接口、mapper.xml、实体类都删除掉。

将generatorConfig.xml配置文件中context标签中属性改成targetRuntime=MyBatis3,点击运行即可。

2 QBC:根据条件查询

@Test
public void testMBG() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    // 根据条件查询(没有条件就查询所有)
    List<Emp> list = mapper.selectByExample(null);
    list.forEach(System.out::println);
    // 根据条件查询
    EmpExample empExample = new EmpExample();
    // 创建条件对象,添加条件
    empExample.createCriteria().andEmpNameEqualTo("张三").andAgeGreaterThanOrEqualTo(20);
    // 想用or就直接点or
    //empExample.or().andGenderEqualTo("男");
    List<Emp> list1 = mapper.selectByExample(empExample);
    list1.forEach(System.out::println);
    
    // 修改
    Emp emp = new Emp(1, "admin", 22, null);
    // 普通修改:如果属性为null,就会修改为null
    mapper.updateByPrimaryKey(emp);
    // 选择性修改:如果属性为null,不会修改属性字段
    mapper.updateByPrimaryKeySelective(emp);
    sqlSession.commit();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438485.html

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

相关文章

操作系统(四)——文件管理

文章目录 第四章 文件管理[4.1.1] 初识文件管理&#xff08;一&#xff09;文件的属性&#xff08;二&#xff09;文件内部的数据应该怎样组织起来&#xff08;三&#xff09;文件之间应该怎样组织起来&#xff08;四&#xff09;操作系统应该向上提供哪些功能&#xff08;五&a…

geoserver发布矢量切片服务

以前切片服务只支持栅格切片&#xff0c;后来技术更新发展&#xff0c;也支持矢量切片了&#xff0c;好处是不失真&#xff0c;而且很快&#xff0c;geoserver本身也不支持这种服务&#xff0c;但是他提供了一个插件&#xff0c;去官网下载下来&#xff0c;放到lib文件夹里&…

2023/4/16周报

目录 摘要 论文阅读 1、标题和现存问题 2、模型构建 3、方法实现 4、实验结果 5、扩展实验 深度学习 1、GNN特点 2、原理 3、GNN数据处理 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇基于图神经网络的技术识别链接预测方研究论文。通过融合了时间特征的专利…

镭速Raysync v6.6.8.0版本发布

最近镭速发布了v6.6.8.0版本&#xff0c;已经发布上线了。主要更新内容有服务器下发任务支持指定客户端&#xff0c;客户端增加日志清理和日志压缩&#xff0c;自动删除源文件保持源目录结构&#xff0c;支持将文件投递给其他成员等功能&#xff0c;详细的更新内容如下&#xf…

ELK日志收集告警

elastic stack elastic search 日志持久化filebeats 日志收集kibana 日志展示elaticalert 日志告警 elastalert官网Elastic Observability APM 指标监控 java-agent 基于logback根据level进行日志的切分聚合宿主机上安装filebeats 配置inputs插件配置采集路径配置多行匹配规则…

第五天 CUDA Runtime API

图中可以看到&#xff0c;Runtime API 是基于 Driver API 之上开发的一套 APIDriver API 基本都是 cu 开头的&#xff0c;而Runtime API 基本都是以 cuda 开头的 Runtime API 概述 CUDA Runtime是封装了CUDA Driver的高级别更友好的APIcudaruntime需要引入cudart这个so文件上下…

系统分析师案例题【系统设计篇(Web开发)】

目录 1、Web综合知识考察 2、单台机器到数据库与Web服务器分离 3、应用服务器集群 3.1 负载均衡 3.2 Session 共享机制 3.3 有状态和无状态 4、持久化技术 5、数据库读写分离化 6、缓存技术 7、Redis 7.1 Redis集群切片与分片 7.2 Redis分布式存储 7.3 Redis数据类…

Windows使用ngrok实现本地程序外网域名访问-详细教程

需求分析 同事要求在外网以域名的方式&#xff0c;访问我本地的程序&#xff0c;故需要将localhost:8080映射到外网&#xff0c;让同事可以通过&#xff1a;域名/接口 的形式访问到本地程序的功能接口 安装 进入官网&#xff1a;https://ngrok.com/ 点击顶部Download&#x…

十三、市场活动:全部导出

功能需求&#xff1a;批量导出市场活动 用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框; 用户选择要保存的目录,完成导出市场活动的功能. *导出成功之后,页面不刷新 功能分析&#xff1a;导出市场活动 1.给批量…

打卡Android学习—Compose 布局 和 修饰符

我们将通过解释 布局 和 修饰符 的基础知识 来开始我们的旅程。我们将介绍他们是如何协同工作的&#xff0c;Compose 提供了什么开箱即用的API&#xff0c;以及如何漂亮地设计您的UI 布局——因为 Compose 中的几乎所有内容都是布局 布局是Compose UI的核心组件&#xff0c;使…

( “树” 之 BST) 669. 修剪二叉搜索树 ——【Leetcode每日一题】

二叉查找树&#xff08;BST&#xff09;&#xff1a;根节点大于等于左子树所有节点&#xff0c;小于等于右子树所有节点。 二叉查找树中序遍历有序。 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&…

机器学习——核函数

问&#xff1a;已知三维空间中的两个样本点分别为&#xff08;2&#xff0c;4&#xff0c;5)和(1&#xff0c;2&#xff0c;3)&#xff0c;定义核函数表达式为:试计算这两个样本点映射到十维空间后的 答&#xff1a;首先计算两个样本点的平方内积2*14*25*325 然后代入核函数表…

互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率

互联网医院系统源码开发设计理念是以患者为中心&#xff0c;将医院的各个科室、医生资源进行有效的整合和调配。互联网医院系统开发是基于最新的Web技术和云计算技术所构建的一种全新的医疗信息化平台&#xff0c;可以通过网页、小程序等多种方式&#xff0c;为患者提供在线预约…

Logstash:通过 lookups 来丰富数据

如果你想了解更多关于 lookup 的内容&#xff0c;请参阅文章 “Elastic&#xff1a;开发者上手指南” 中的 “丰富数据及 lookup” 章节。在今天的文章中&#xff0c;我来总结在 Logstash 中一些常用的 lookups。如下的这些插件可以帮助你使用附加信息丰富数据&#xff0c;例如…

基于深度学习的车型识别系统(Python+清新界面+数据集)

摘要&#xff1a;基于深度学习的车型识别系统用于识别不同类型的车辆&#xff0c;应用YOLO V5算法根据不同尺寸大小区分和检测车辆&#xff0c;并统计各类型数量以辅助智能交通管理。本文详细介绍车型识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…

浏览器强缓存与协商缓存

一、强缓存 强制缓存的思想是&#xff0c;在浏览器内置数据库中缓存每次请求中 “可以被缓存” &#xff08;受到一些关键字的管控&#xff09;的静态资源如 image, css, js 文件&#xff0c; 当第二次请求被缓存过的资源时候&#xff0c;会通过校验两个字段 Expires 和 Cache-…

AAAI 2023MOVEDepth:基于单目线索和速度指导的自监督多帧深度估计

文章目录 解决的问题实施细节总结 会议/期刊&#xff1a;2023 AAAI 论文题目&#xff1a;《Crafting Monocular Cues and Velocity Guidance for Self-Supervised Multi-Frame Depth Learning》 论文链接&#xff1a;[JeffWang987/MOVEDepth: AAAI 2023]Crafting Monocular Cue…

Flutter TextField 交互实例 —— 新手礼包

大家好&#xff0c;我是 17。 新手礼包一共 3 篇文章&#xff0c;每篇都是描述尽量详细&#xff0c;实例讲解&#xff0c;包会&#xff01; Flutter Row 实例 —— 新手礼包Flutter TextField UI 实例 —— 新手礼包Flutter TextField 交互实例 —— 新手礼包 本篇包含所有常…

Unity打包WebGL: 导入Vue

Unity打包WebGL: 导入Vue 1. 介绍 1.1 任务 记录将Unity项目打包成WebGL&#xff0c;并集成到Vue项目中的过程。 1.2 环境 Unity:2021.3Vue: 2 2. Unity项目 2.1 UI界面 2.2 添加插件 构建WebGL项目需要添加一个.jslib文件&#xff0c;用于Unity脚本函数与JavaScript函数…

【FocalNet】学习笔记

1. 介绍 “FocalNet是map-based还是token-based模型呢&#xff1f;” FocalNet是token-based模型&#xff0c;与常见的【基于 feature map 的CNN】不同&#xff1b; 2. 模型代码 2.1 环境配置 [DINO | FocalNet-DINO] 2.1.1 配置CUDA11.1 Summary Driver: Not Selected…