10.MyBatis逆向工程

news2024/11/27 2:44:58

MyBatis逆向工程

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

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

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

逆向工程的创建

添加依赖和插件

pom.xml

		<!-- 如果爆红则需要在前面的<dependencys>中引入 -->
		<!-- 逆向工程的包 -->
		<dependency>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-core</artifactId>
			<version>1.3.2</version>
		</dependency>

<!-- 控制Maven在构建过程中相关配置 -->
<build>
	<!-- 构建过程中用到的插件(注意是<build>的直接目录下>!如果存在<pluginManagement>包裹<plugins>,可以在<build>子目录直接创建<plugins>即可) -->
	<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>

创建逆向工程的配置文件

resources目录下创建generatorConfig.xml(文件名称固定),这里配置的是简洁版

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="DB2Tables" targetRuntime="MyBatis3Simple">

		<!-- 数据库的连接信息(按需修改) -->
		<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
						connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"
						userId="root"
						password="123456">
		</jdbcConnection>

		<!-- javaBean的生成策略-->
		<javaModelGenerator targetPackage="com.atguigu.mybatis.pojo" targetProject=".\src\main\java">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

		<!-- SQL映射文件的生成策略 -->
		<sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\resources">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>

		<!-- Mapper接口的生成策略 -->
		<javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>

		<!-- 逆向分析的表 -->
		<!-- 
			 tableName:设置为*号,可以对应所有表,此时不写domainObjectName
			 domainObjectName:指定生成出来的实体类(JavaBean)的类名 
		-->
		<table tableName="t_emp" domainObjectName="Emp1"/>
		<table tableName="t_dept" domainObjectName="Dept1"/>
	</context>
</generatorConfiguration>

逆向工程的使用

执行MBG插件的generate目标

如果配置无误,则可以在Maven中找到此插件mybatis-generatorConfig,双击运行即可

运行效果:

生成了五个方法:

  • 增:int insert(Dept1 record);
  • 删:int deleteByPrimaryKey(Integer deptId);
  • 改:int updateByPrimaryKey(Dept1 record);
  • 根据主键查询单个数据:Dept1 selectByPrimaryKey(Integer deptId);
  • 查询全部数据:List<Dept1> selectAll();

完整版逆向工程

generatorConfig.xml<context> <targetRuntime>值修改为"MyBatis3"即可

完整版在精简版的基础上额外提供了xxxExample.java,这个包定义了一个内部类GeneratedCriteria,这个内部类就定义了一系列条件的方法,这些条件最后都会拼接在SQL中,但是一般不用它,都用它的子类Criteria来进行操作,Criteria继承了内部类GeneratedCriteria。

在这里插入图片描述

Emp2Mapper.java存在如下方法:

  • int countByExample(Emp2Example example):按条件返回查询到的行数
  • int deleteByExample(Emp2Example example):按条件删除并返回行数
  • int deleteByPrimaryKey(Integer empId):按主键删除并返回行数
  • int insert(Emp2 record):插入数据并返回行数(使用的版本不会返回插入的那一行的id)
  • int insertSelective(Emp2 record):插入值不为null的字段并返回行数
  • List<Emp2> selectByExample(Emp2Example example):按条件查询,传入null表示查询所有
  • Emp2 selectByPrimaryKey(Integer empId);:按主键查询
  • int updateByExampleSelective(@Param("record") Emp2 record, @Param("example") Emp2Example example):按条件更新值不为null的字段
  • int updateByExample(@Param("record") Emp2 record, @Param("example") Emp2Example example):按条件更新(属性值为null也会传入字段)
  • int updateByPrimaryKeySelective(Emp2 record):按主键更新值不为null的字段
  • int updateByPrimaryKey(Emp2 record):按主键更新(属性值为null也会传入字段)

Emp2Example.java存在如下方法:

MyBatisTest.java

	@Test
    public void generatorTest(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        Emp2Mapper emp2Mapper = sqlSession.getMapper(Emp2Mapper.class);

        //根据主键来查询(给Emp2重写了toString方法)-->select emp_id, emp_name, gender, dept_id from t_emp where emp_id = ?
        Emp2 emp2 = emp2Mapper.selectByPrimaryKey(2);
        System.out.println(emp2);
        //根据条件来查询人(这里写"null"没有条件则是直接查询出所有人)-->select emp_id, emp_name, gender, dept_id from t_emp
        List<Emp2> emp2List = emp2Mapper.selectByExample(null);
        System.out.println(emp2List);
		
        //创建一个条件对象emp2Example
        Emp2Example emp2Example = new Emp2Example();
        //通过createCriteria()方法创建一个类的对象并反复调用其中的方法来可以添加多个条件
        emp2Example.createCriteria().andEmpNameLike("%y%").andEmpIdEqualTo(1);
        //在前面语句的后面添加or语句
        emp2Example.or().andEmpNameLike("%an%");
        //将条件对象放入条件查询的方法中-->select emp_id, emp_name, gender, dept_id from t_emp WHERE ( emp_name like ? and emp_id = ? ) or( emp_name like ? )
        List<Emp2> emp2List1 = emp2Mapper.selectByExample(emp2Example);
        System.out.println(emp2List1);

        /*
            测试修改功能:
                选择性修改:只将JavaBean中不为null的数据对数据库进行修改操作
                覆盖性修改:JavaBean中为null值的数据一样会输入到数据库中去
        */
        Emp2 emp2One = new Emp2();
        emp2One.setEmpId(1);
        emp2One.setEmpName("yxx");
        //这里都是根据主键来确定要修改的行数,还可以按前面的输入Example对象先查询再修改,对应的方法为updateByExample()
        //选择性修改
        emp2Mapper.updateByPrimaryKeySelective(emp2One);
        //覆盖性修改
        emp2Mapper.updateByPrimaryKey(emp2One);

        //添加操作-->insert into t_emp (emp_id, emp_name, gender, dept_id) values (?, ?, ?, ?)
        emp2One.setEmpId(null);
        System.out.println(emp2Mapper.insert(emp2One));//返回值为受影响行数
    }
DEBUG 01-14 22:23:27,140 ==>  Preparing: select emp_id, emp_name, gender, dept_id from t_emp where emp_id = ? (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,187 ==> Parameters: 2(Integer) (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,233 <==      Total: 1 (BaseJdbcLogger.java:137) 
Emp2{empId=2, empName='xuan', gender='男', deptId=10}
DEBUG 01-14 22:23:27,265 ==>  Preparing: select emp_id, emp_name, gender, dept_id from t_emp (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,265 ==> Parameters:  (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,265 <==      Total: 3 (BaseJdbcLogger.java:137) 
[Emp2{empId=1, empName='yxx', gender='null', deptId=null}, Emp2{empId=2, empName='xuan', gender='男', deptId=10}, Emp2{empId=3, empName='yxx', gender='null', deptId=null}]
DEBUG 01-14 22:23:27,280 ==>  Preparing: select emp_id, emp_name, gender, dept_id from t_emp WHERE ( emp_name like ? and emp_id = ? ) or( emp_name like ? ) (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,280 ==> Parameters: %y%(String), 1(Integer), %an%(String) (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,280 <==      Total: 2 (BaseJdbcLogger.java:137) 
[Emp2{empId=1, empName='yxx', gender='null', deptId=null}, Emp2{empId=2, empName='xuan', gender='男', deptId=10}]
DEBUG 01-14 22:23:27,280 ==>  Preparing: update t_emp SET emp_name = ? where emp_id = ? (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 ==> Parameters: yxx(String), 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 <==    Updates: 1 (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 ==>  Preparing: update t_emp set emp_name = ?, gender = ?, dept_id = ? where emp_id = ? (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 ==> Parameters: yxx(String), null, null, 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 <==    Updates: 1 (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 ==>  Preparing: insert into t_emp (emp_id, emp_name, gender, dept_id) values (?, ?, ?, ?) (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 ==> Parameters: null, yxx(String), null, null (BaseJdbcLogger.java:137) 
DEBUG 01-14 22:23:27,296 <==    Updates: 1 (BaseJdbcLogger.java:137) 
1

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

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

相关文章

腾讯云服务器ping不通怎么解决?什么原因?

腾讯云服务器ping不通什么原因&#xff1f;ping不通公网IP地址还是域名&#xff1f;新手站长从云服务器公网IP、安全组、Linux系统和Windows操作系统多方面来详细说明腾讯云服务器ping不通的解决方法&#xff1a; 目录 腾讯云服务器ping不通原因分析及解决方法 安全组ICMP协…

CentOS7.9 k8s集群环境搭建

环境搭建 本次环境搭建需要安装三台Centos服务器(一主二从)&#xff0c;k8s采用1.25.4版本 主机安装 安装虚拟机过程中注意下面选项的设置&#xff1a; 操作系统环境&#xff1a;CPU(2C) 内存(4G) 硬盘(50G)语言选择&#xff1a;English软件选择&#xff1a;基础设施服务器分区…

某乎评论数据

文章目录 声明目标网址加密参数分析与首页测试翻页逻辑实现通用的csv保存全部采集代码整合往期逆向文章推荐很久没有看评论接口了,最近运行了一下旧的脚本,发现不能用,应该是也加了X-Zse-96校验,本篇就试着解决评论采集问题。 声明 本文章中所有内容仅供学习交流,严禁用于…

个人简历电子版免费范文(合集)

个人简历电子版免费范文篇1 基本信息 姓名&#xff1a;__ 性别&#xff1a;__ 出生日期&#xff1a;__ 籍贯&#xff1a;__市 目前城市&#xff1a;__市 联系电话&#xff1a;__ E-mail&#xff1a;__ 应聘方向 求职行业&#xff1a;金融/投资/证券&#xff0c;银行&#xff0c…

Rust 1.70.0 发布

导读Rust团队很高兴地宣布新版本的Rust&#xff0c;1.70.0。Rust是一种编程语言&#xff0c;使每个人都能建立可靠和高效的软件。 如果你通过rustup安装了以前的Rust版本&#xff0c;你可以用1.70.0获得&#xff1a; rustup update stable 如果你还没有&#xff0c;你可以从我…

记一次 .NET 某旅行社审批系统 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他的程序跑着跑着就崩溃了&#xff0c;让我看下怎么回事&#xff0c;其实没怎么回事&#xff0c;抓它的 crash dump 就好&#xff0c;具体怎么抓也是被问到的一个高频问题&#xff0c;这里再补一下链接&…

【Python 随练】求和序列

题目&#xff1a; 求 saaaaaaaaaaaa…a 的值&#xff0c;其中 a 是一个数字。 例如 222222222222222(此时共有 5 个数相加)&#xff0c;几个数相加有键盘控制。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个求和问题&#xff1a;给定一个数字 a&#xff0c;求…

基于msm8953调试CST226SE触摸TP

目录 1、事件驱动和设备挂载 2、adb调试节点 3、修改设备树地址 4、修改驱动地址 5、修改firmware固件参数 我们总是习惯不断的搜索&#xff0c;阅读前人总结和分享的经验&#xff0c;在不断尝试中进步&#xff0c;如果没有大家的分享经验&#xff0c;学习和探索的过程将是多么…

基于Flask+Bootstrap+机器学习的世界杯比赛预测系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

云原生安全 - 构建强大的安全基石保障现代化应用

导言&#xff1a; 随着云原生技术的兴起和广泛应用&#xff0c;越来越多的企业将其应用于现代化应用开发和部署。然而&#xff0c;随之而来的安全威胁也随之增加。在这篇文章中&#xff0c;我们将探讨云原生安全的重要性&#xff0c;以及如何构建强大的安全基石来保障现代化应…

hdfs的透明加密记录

1、背景 我们知道&#xff0c;在hdfs中&#xff0c;我们的数据是以block块存储在我们的磁盘上的&#xff0c;那么默认情况下&#xff0c;它是以密文存储的&#xff0c;还是以明文存储的呢&#xff1f;如果是明文存储的&#xff0c;那么是否就不安全呢&#xff1f;那么在hdfs中…

python3 爬虫相关学习10:RE 库/ regex /regular experssion正则表达式学习

目录 1 关于&#xff1a;re / regex / regular expression 1.1 什么是正则表达式 1.2 在python中安装正则模块 1.2.1 python里一般都默认安装了 re正则模块&#xff0c;可以先查看确认下 1.2.2 如果没有安装&#xff0c;可以按照正则库regex, pip install regex 1.3 …

基于PHP的学生管理系统

前言 基于PHP的学生管理系统&#xff1b; 实现 登录、注册、学生信息、修改学生、删除学生、查询学生、添加学生等功能 &#xff1b; 环境准备 开发平台&#xff1a;PhpStrom2022.1.2 、Phpstudy_pro 数据库&#xff1a;MySQL5.7.26 技术架构 Bootstrap PHP7.3.4html5css3 项目…

SpringBoot中配置Https入门

一、生成一个https证书 我们使用Java自带的JDK管理工具keytool来生成一个免费的https证书&#xff0c;在我们的Java安装目录下&#xff0c;在bin目录下我们使用cmd启动命令行窗口,执行如下命令生成一个https证书。 keytool -genkey -alias myhttps -keyalg RSA -keysize 2048…

计算机网络 01 IP协议

01.IP协议&#xff0c;也就是IP报文。 宏观&#xff1a; 首部长度&#xff1a;由于固定部分是20B&#xff0c;所以数值最小是5。 02.IP报文&#xff0c;中的IP地址&#xff0c;常见的是IPV4&#xff0c;也就是四个字节&#xff0c;32位。 常见的IP地址有三种&#xff1a; 第一…

在 Python 中使用requests模块发布表单数据

文章目录 使用 requests 模块在 Python 中发布表单数据POST请求方式介绍在 Python 中安装 requests 模块post() 方法的应用 本篇文章介绍了 Python requests 模块&#xff0c;并说明了我们如何使用该模块在 Python 中发布表单数据。 使用 requests 模块在 Python 中发布表单数据…

由浅入深,详解ViewModel那些事

前言&#xff1a;今年的龙舟雨来了&#xff0c;一场接一场&#xff0c;雨量很大。 前言 以往如果需要在 Activity 或者 Fragment 中保存数据状态则需要重写onSaveInstanceState &#xff0c;使用bundle去存储相应的数据和状态&#xff0c;但是这也只能保存轻量简单的序列化数据…

【STM32】软件I2C

【STM32】软件I2C I2C简介 I2C总线是一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信。I2C总线有两根双向的信号线&#xff0c;一根数据线SDA用于收发数据&#xff0c;一根时钟线SCL用于通信双方时钟的同步。 在一个i2c通讯总线中&#xff0c;可连接…

怎么显示文件后缀名?查看文件后缀名可以这样做!

案例&#xff1a;在我的电脑上&#xff0c;看不到文件的后缀名&#xff0c;这会导致命名时出现重复文件后缀的情况&#xff0c;给我带来了不好的体验。怎么才能看到文件的后缀名呢&#xff1f;如何操作&#xff1f; 在日常使用电脑的过程中&#xff0c;我们经常需要查看文件的…

实习记录(二)Java常用工具库

一.Lombok 1.背景概述 Lombok是一个非常高效的专用于Java的自动构建插件库&#xff0c;其简化了 JavaBean 的编写&#xff0c;避免了冗余和样板式代码的出现&#xff0c;让编写的类更加简洁明了&#xff0c;可以帮助大家节省很多重复低效的代码编写。比如重复性的Setter、Gett…