搞懂Mybatis逆向⼯程这一篇就够了

Mybatis逆向⼯程配置与⽣成

  • 使用基础版本
    • 前置准备
      • 项目结构
      • 导入依赖
      • 配置generatorConfig.xml
      • 数据库表
    • 使用逆向工程
      • 点击插件使用
      • 双击之后效果
      • UserMapper.xml的内容
      • UserMapper接口的内容
    • 测试逆向工程
  • 使用增强版
    • 项目结构
      • UserExample和UserWithBLOBs
      • UserMapper接口
    • 测试方法
    • 测试结果

使用基础版本

前置准备

项目结构

创建一个空的模块,此时java目录里面没有代码,mapper映射文件也没有。
在这里插入图片描述

导入依赖

在pom中添加逆向⼯程插件

<!--定制构建过程-->
<build>
 <!--可配置多个插件-->
 <plugins>
 <!--mybatis逆向⼯程插件-->
 <plugin>
 <!--插件的GAV坐标-->
 <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-maven-plugin</artifactId>
 <version>1.4.1</version>
 <!--允许覆盖-->
 <!--如果存在pojo实体类使用逆向工程时候,是清空然后在写入,如果不覆盖可能是追加的模式,会出错-->
 <configuration>
 <overwrite>true</overwrite>
 </configuration>
 <!--插件的依赖-->
 <dependencies>
 <!--mysql驱动依赖-->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>8.0.30</version>
 </dependency>
 </dependencies>
 </plugin>
 </plugins>
</build>

GAV坐标是指在软件开发中常用的一种标识方式,用于唯一确定一个软件插件或库。它由三个部分组成:Group ID(组织ID)、Artifact ID(项目ID)和Version(版本号),因此又称为GAV坐标。

  • Group ID(组织ID):代表开发插件或库的组织或团队的唯一标识符。
  • Artifact ID(项目ID):代表插件或库的名称或项目的唯一标识符。
  • Version(版本号):代表插件或库的特定版本。

配置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:⽣成的是基础版,只有基本的增删改查。
    MyBatis3:⽣成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!--防⽌⽣成重复代码-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

        <commentGenerator>
            <!--是否去掉⽣成⽇期-->
            <property name="suppressDate" value="true"/>
            <!--是否去除注释-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--连接数据库信息-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/hqyj03"
                        userId="root"
                        password="yjg">
        </jdbcConnection>
        <!-- ⽣成pojo包名和位置 -->
        <javaModelGenerator targetPackage="com.yjg.mybatis.pojo" targetProject="src/main/java">
            <!--是否开启⼦包-->
<!--如果为false会把com.yjg.mybatis.pojo当成一个目录造出来-->
            <property name="enableSubPackages" value="true"/>
            <!--是否去除字段名的前后空⽩-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- ⽣成SQL映射⽂件的包名和位置 -->
        <sqlMapGenerator targetPackage="com.yjg.mybatis.mapper" targetProject="src/main/resources">
            <!--是否开启⼦包-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- ⽣成Mapper接⼝的包名和位置 -->
        <javaClientGenerator
                type="xmlMapper"
                targetPackage="com.yjg.mybatis.mapper"
                targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 表名和对应的实体类名-->
        <table tableName="user" domainObjectName="User"/>
    </context>
</generatorConfiguration>

数据库表

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用逆向工程

点击插件使用

在这里插入图片描述

双击之后效果

双击之后就会出现,对应得实体类和mapper映射文件。
在这里插入图片描述

UserMapper.xml的内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yjg.mybatis.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="com.yjg.mybatis.pojo.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
  </resultMap>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.yjg.mybatis.pojo.User">
    insert into user (id, username, password
      )
    values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
      )
  </insert>
  <update id="updateByPrimaryKey" parameterType="com.yjg.mybatis.pojo.User">
    update user
    set username = #{username,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select id, username, password
    from user
    where id = #{id,jdbcType=INTEGER}
  </select>
  <select id="selectAll" resultMap="BaseResultMap">
    select id, username, password
    from user
  </select>
</mapper>

UserMapper接口的内容

package com.yjg.mybatis.mapper;
import com.yjg.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(User row);

    User selectByPrimaryKey(Integer id);

    List<User> selectAll();

    int updateByPrimaryKey(User row);
}

测试逆向工程

使用接口里面的方法看是否能够成功操作数据库

测试一

@Test
public void test01() throws Exception{
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();


    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = userMapper.selectAll();
    users.forEach(user -> System.out.println(user));
}

测试结果

能够查出结果,没有问题

在这里插入图片描述
测试二

@Test
public void test02() throws Exception{
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();


    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    int i = userMapper.deleteByPrimaryKey(0);
    System.out.println(i);
}

测试结果

能够删除数据库数据,没有问题
在这里插入图片描述

使用增强版

在配置generatorConfig.xml的时候

targetRuntime有两个值:
MyBatis3Simple:⽣成的是基础版,只有基本的增删改查。
MyBatis3:⽣成的是增强版,除了基本的增删改查之外还有复杂的增删改查。

只需要把上面的generatorConfig.xml文件的targetRuntime值换一下即可。

项目结构

当使用增强版本的时候,就会出现除了User实体类的其他两个类
在这里插入图片描述

UserExample和UserWithBLOBs

  1. UserExampleUserExample是一个用于构建查询条件的辅助类。它提供了一系列的方法,用于设置查询条件,比如等于、大于、小于、排序等。通过使用UserExample,可以方便地构建复杂的查询条件,并将其传递给MyBatis的查询接口进行数据库查询操作。
  2. UserWithBLOBsUserWithBLOBs是生成的包含大字段(BLOBs)的实体类。如果表中存在大字段类型(如TEXT、BLOB等),MyBatis逆向工程会为这些字段生成对应的实体类,并在原有的实体类(比如User)基础上扩展,以支持大字段的获取和设置。

总的来说,UserExampleUserWithBLOBs在MyBatis逆向工程中的作用如下:

  • UserExample帮助构建复杂的查询条件,提供了灵活的方法来指定查询规则和约束条件。
  • UserWithBLOBs是对包含大字段的表生成的实体类,它扩展了原有实体类的功能,使得对大字段的操作更加方便。

UserMapper接口

会比基础的版本多一些方法,相应的UserMapper.xml映射文件也会增多语句

package com.yjg.mybatis.mapper;

import com.yjg.mybatis.pojo.User;
import com.yjg.mybatis.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
    long countByExample(UserExample example);

    int deleteByExample(UserExample example);

    int deleteByPrimaryKey(Integer id);

    int insert(User row);

    int insertSelective(User row);

    List<User> selectByExample(UserExample example);

    User selectByPrimaryKey(Integer id);

    int updateByExampleSelective(@Param("row") User row, @Param("example") UserExample example);

    int updateByExample(@Param("row") User row, @Param("example") UserExample example);

    int updateByPrimaryKeySelective(User row);

    int updateByPrimaryKey(User row);
}

测试方法

@org.junit.Test
public void test01() throws Exception{
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //执行查询
    //查询一个
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User user = userMapper.selectByPrimaryKey(1);
    System.out.println(user);
    System.out.println("===============================================");

    //查询所有(selectByExample根据条件查询,如果条件为空,则表示没有条件)
    List<User> users = userMapper.selectByExample(null);
    users.forEach(user1 -> System.out.println(user1));
    System.out.println("===============================================");


    //按照条件进行查询
    //多条件查询
    // QBC ⻛格:Query By Criteria ⼀种查询⽅式,⽐较⾯向对象,看不到sql语句。
    UserExample userExample = new UserExample();
     userExample.createCriteria().andPasswordLike("%d%").andIdBetween(3, 5);
    List<User> userList = userMapper.selectByExample(userExample);
    userList.forEach(u-> System.out.println(u));
}

测试结果

查询一个成功
在这里插入图片描述
查询所有成功

在这里插入图片描述
根据条件查询成功
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库事务四大特性

事务的4大特性&#xff08;ACID&#xff09;&#xff1a; 原子性(Atomicity)&#xff1a; 事务是数据库的逻辑工作单位&#xff0c;它对数据库的修改要么全部执行&#xff0c;要么全部不执行。 一致性(Consistemcy)&#xff1a; 事务前后&#xff0c;数据库的状态都满足所有的完…

相约清华!AI药物研发大赛总决赛明日开幕

2022年&#xff0c;百度飞桨联合清华大学药学院&#xff0c;筹备建设“AI 药学”产学研融合创新基地&#xff0c;推出了一系列AI生物计算前沿课程和人才培养计划。今年5月&#xff0c;百度飞桨联合清华大学药学院、百度智能云和临港实验室&#xff0c;共同发起了首届全球AI药物…

NSSCTF——Web题目1

目录 一、[LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; 二、[LitCTF 2023]Ping 三、[SWPUCTF 2021 新生赛]easyupload1.0 四、[SWPUCTF 2021 新生赛]easyupload2.0 五、[SWPUCTF 2021 新生赛]caidao 一、[LitCTF 2023]PHP是世界上最好的语言&#xff01;&a…

【项目经理】项目管理杂谈

杂谈 1. 走上管理岗位&#xff0c;别再自己埋头干了2. 如何更好地管理项目进度3. 管理是“管事”而不是“管人”4. 让领导欣赏的十个沟通技巧在这里插入图片描述 1. 走上管理岗位&#xff0c;别再自己埋头干了 2. 如何更好地管理项目进度 3. 管理是“管事”而不是“管人” 4. 让…

06.DenseCap

目录 前言泛读摘要IntroductionRelated Work小结 精读模型模型构架全卷积定位层卷积锚点边界回归边界采样双线性插值 识别网络RNN 损失函数训练与优化 实验数据集&#xff0c;预处理DenseCap评价标准基线区域和图像级统计之间的差异RPN vs EdgeBoxesQualitative results 区域ca…

GBU816-ASEMI功率整流器件GBU816

编辑&#xff1a;ll GBU816-ASEMI功率整流器件GBU816 型号&#xff1a;GBU816 品牌&#xff1a;ASEMI 芯片个数&#xff1a;4 封装&#xff1a;GBU-4 恢复时间&#xff1a;&#xff1e;50ns 工作温度&#xff1a;-55C~150C 浪涌电流&#xff1a;200A 正向电流&#xf…

为什么需要websocket?

一、为什么需要websocket&#xff1f; 前端和后端的交互模式最常见的就是前端发数据请求&#xff0c;从后端拿到数据后展示到页面中。如果前端不做操作&#xff0c;后端不能主动向前端推送数据&#xff0c;这也是http协议的缺陷。 因此&#xff0c;一种新的通信协议应运而生---…

Python用 tslearn 进行时间序列聚类可视化

全文链接&#xff1a;https://tecdat.cn/?p33484 我们最近在完成一些时间序列聚类任务&#xff0c;偶然发现了 tslearn 库。我很想看看启动和运行 tslearn 已内置的聚类有多简单&#xff0c;结果发现非常简单直接&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09…

远程办公中安全远程访问解决方案

什么是安全远程访问 安全的远程访问是一个至关重要的过程&#xff0c;可让您使用互联网从远处完全控制某人的设备。为了确保安全&#xff0c;为受保护的远程访问采取了额外的身份验证和加密措施。 为什么安全远程访问解决方案很重要 当 IT 技术人员从远处帮助人们解决计算机…

yolov3加上迁移学习和适度的数据增强形成的网络应用在输电线异物检测

Neural Detection of Foreign Objects for Transmission Lines in Power Systems Abstract. 输电线路为电能从一个地方输送到另一个地方提供了一条路径&#xff0c;确保输电线路的正常运行是向城市和企业供电的先决条件。主要威胁来自外来物&#xff0c;可能导致电力传输中断。…

【微服务】06-安全问题

文章目录 1.反跨站请求伪造1.1 攻击过程1.2 攻击核心1.3 如何防御1.4 使用AntiforgeryToken机制来防御用到的类 2. 防开发重定向共计2.1 攻击过程2.2 攻击核心2.3 防范措施 3.防跨站脚本3.1 攻击过程3.2 防范措施 4.跨域请求4.1 同源与跨域4.2 CORS过程4.2 CORS是什么4.3 CORS请…

10万字智慧政务大数据平台项目建设方案222页[Word]

导读&#xff1a;原文《10万字智慧政务大数据平台项目建设方案222页[Word]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 1.1 项目建设目标 推进市一级政府搭建数…

Transformer (Attention Is All You Need) 论文精读笔记

Transformer(Attention Is All You Need) Attention Is All You Need 参考&#xff1a;跟李沐学AI-Transformer论文逐段精读【论文精读】 摘要&#xff08;Abstract&#xff09; 首先摘要说明&#xff1a;目前&#xff0c;主流的序列转录&#xff08;序列转录&#xff1a;给…

商城-学习整理-集群-K8S-集群环境部署(二十四)

目录 一、MySQL集群1、mysql集群原理2、Docker安装模拟MySQL主从复制集群1、下载mysql镜像2、创建Master实例并启动3、创建 Slave 实例并启动4、为 master 授权用户来同步数据1、进入 master 容器2、进入 mysql 内部 &#xff08;mysql –uroot -p&#xff09;3、查看 master 状…

分发饼干【贪心算法】

分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有一个…

MySQL 8.1安装

1. 下载地址 https://dev.mysql.com/downloads/mysql/8.0.html 我这里没有采用installer安装&#xff0c;因为installer安装依赖visual studio&#xff0c;所以&#xff0c;我下载的是zip文件。 最终下载的版本如下&#xff1a; 2. 添加环境变量 解压&#xff0c;添加环境…

原生微信小程序使用 wxs;微信小程序使用 vant-weapp组件

1.原生微信小程序使用 wxs 1.内嵌 WXS 脚本 2. 定义外链 wxs 3. 使用外连wxs 在这里插入图片描述 2. 微信小程序使用 vant weapp 1.安装步骤 2. 安装包管理(package.json)文件的方法 操作顺序 &#xff1a;文档地址 如果使用 typescript 需要操作步骤3&#xff0c;否则不…

第59步 深度学习图像识别:误判病例分析(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 本期内容对等于机器学习二分类系列的误判病例分析&#xff08;传送门&#xff09;。既然前面的数据可以这么分析&#xff0c;那么图形识别自然也可以。 本期以mobilenet_v2模型为例&#xff0c;因为它建模速度快。 同样&#xff0c;基…

BM20 数组中的逆序对

描述 解题思路&#xff1a;归并排序 分治&#xff1a;分治即“分而治之”&#xff0c;“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题&#xff0c;子问题继续按照这样划分&#xff0c;直到问题可以被轻易解决&#xff1b;“治”指的是将子问题单独进…

RabbitMQ默认监听的ip地址

RabbitMQ 默认监听所有可用 ip 地址&#xff0c;当Rabbitmq 所在的服务端节点上存在多 ip 时&#xff0c;只要客户端能与服务端任一 ip 通信&#xff0c;即可向 RabbitMQ 发送消息