一、MyBatis Generator

        为 MyBastis 框架设计的代码生成工具,简化持久层编码工作。根据数据库表自动生成 Java 实体类、Mapper 接口、SQL 的 xml 文件。让开发者专注于业务逻辑。

1、引入插件

        MyBatis 官网搜索 MyBatis Generator 插件:Running MyBatis Generator With Maven – MyBatis Generator Corehttps://mybatis.org/generator/running/runningWithMaven.html

            <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><executions><execution><id>Generate MyBatis Artifacts</id><phase>deploy</phase><goals><goal>generate</goal></goals></execution></executions><configuration><!--generator配置文件所在位置--><configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile><!-- 允许覆盖生成的文件;xml不会覆盖, 采用追加的方式--><overwrite>true</overwrite><verbose>true</verbose><!--将当前pom的依赖项添加到生成器的类路径中--><includeCompileDependencies>true</includeCompileDependencies></configuration><!--该插件的依赖,在 <dependencies> 中引入的它识别不到--><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies></plugin>

2、修改 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><!-- 一个数据库一个context --><context id="MysqlTables" targetRuntime="MyBatis3Simple"><!--禁用自动生成的注释--><commentGenerator><property name="suppressDate" value="true"/><property name="suppressAllComments" value="true" /></commentGenerator><!--数据库连接信息--><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://127.0.0.1:3306/book_test?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"userId="root"password="root"></jdbcConnection><!-- 生成实体类, 配置路径 --><javaModelGenerator targetPackage="com.edu.generator.model" targetProject="src/main/java" ><property name="enableSubPackages" value="false"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- 生成mapxml文件 --><sqlMapGenerator targetPackage="generatorMapper" targetProject="src/main/resources" ><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- 生成mapxml对应client,也就是接口dao --><javaClientGenerator targetPackage="com.edu.generator.mapper" targetProject="src/main/java" type="XMLMAPPER" ><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- table可以有多个,tableName表示要匹配的数据库表 --><table tableName="user_info" domainObjectName="UserInfo" enableSelectByExample="true"enableDeleteByExample="true" enableDeleteByPrimaryKey="true" enableCountByExample="true"enableUpdateByExample="true"><!--   类的属性是否用数据库中的真实字段名做为属性名, 不指定这个属性会自动转换 _ 为驼峰命名规则         --><property name="useActualColumnNames" value="false" /><!-- 数据库表主键 --><generatedKey column="id" sqlStatement="Mysql" identity="true" /></table><table tableName="book_info" domainObjectName="BookInfo" enableSelectByExample="true"enableDeleteByExample="true" enableDeleteByPrimaryKey="true" enableCountByExample="true"enableUpdateByExample="true"><!--   类的属性是否用数据库中的真实字段名做为属性名, 不指定这个属性会自动转换 _ 为驼峰命名规则         --><property name="useActualColumnNames" value="false" /><!-- 数据库表主键 --><generatedKey column="id" sqlStatement="Mysql" identity="true" /></table></context>
</generatorConfiguration>
  • targetRuntime="MyBatis3Simple":"MyBatis3Simple" 生成的 SQL 的 xml 语句比较简单;"MyBatis3" 比较复杂。
  • targetPackage="com.edu.generator.model":生成在哪个包。
  • tableName="user_info":数据库对应的表名。
  • domainObjectName="BookInfo":对应的实体类名。
  • <generatedKey column="id":主键名。
  • <property name="useActualColumnNames" value="false" />:属性名自动转换成驼峰命名规则。

        只生成实体类的版本:

<?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><!-- 一个数据库一个context --><context id="MysqlTables" targetRuntime="MyBatis3Simple"><!-- 禁用自动生成的注释 --><commentGenerator><property name="suppressDate" value="true"/><property name="suppressAllComments" value="true" /></commentGenerator><!-- 数据库连接信息 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis_test?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"userId="root"password="123456"></jdbcConnection><!-- 生成实体类配置 --><javaModelGenerator targetPackage="com.edu.mybatis.plus.model" targetProject="src/main/java" ><property name="enableSubPackages" value="false"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- 移除SQL映射文件生成器(不生成Mapper XML) --><!-- 移除Java客户端生成器(不生成Mapper接口) --><!-- 表配置 --><table tableName="user_info" domainObjectName="UserInfo"><property name="useActualColumnNames" value="false" /><generatedKey column="id" sqlStatement="Mysql" identity="true" /></table></context>
</generatorConfiguration>

3、生成代码

        在 maven 中运行插件,自动生成代码:

        生成的文件:

        实体类把 getter、setter 都生成了,为了好看,可以调整为 @Data:

        Mapper 接口、xml 文件生成了一些基础的数据库操作。(不建议用,mxl 文件代码太乱了,看着很复杂)

        该插件的使用,需要配置很多东西,比如数据库连接的信息,但是这些信息已经在 spring boot 的配置文件中配置过了,因此该插件还不够方便。对于 mapper、xml 的编写,Mybatis-plus 框架才是我们学习的重点。用用 MyBatis Generator 的实体类自动生成即可。

二、MyBatis-plus

        MyBatis-plus 在 MyBatis 的基础上扩展功能,跟 MyBatis 不冲突。直接在 Spring Boot 项目的POM 文件中引入依赖即可。

        官方文档:

快速开始 | MyBatis-Plushttps://baomidou.com/getting-started/

1、快速上手

创建一个 Spring Boot 项目:

引入依赖:spring boot3 对应的版本

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.12</version>
</dependency>

配置数据库连接信息(.yml)。

启动类加入 @MapperScan,指定要扫描的 Mapper 文件路径。或者每个 mapper 类加@Mapper,二选其一

创建要操作的表对应的实体类。

编写 Mapper 接口类:

2、简单 CRUD 单元测试

(1)查

    @Testpublic void testSelectAll() {System.out.println(("----- 查询所有 ------"));List<UserInfo> userList = userInfoMapper.selectList(null);userList.forEach(System.out::println);}@Testvoid testSelectById(){System.out.println(("----- 按 主键 查询 ------"));UserInfo userInfo = userInfoMapper.selectById(2);System.out.println(userInfo);}@Testvoid testSelectByIds(){System.out.println(("----- 按 主键 集合查询 ------"));List<UserInfo> userInfos = userInfoMapper.selectByIds(List.of(1,2));userInfos.forEach(System.out::println);}

(2)增

    @Testvoid testInsert(){System.out.println(("----- 插入一条数据 ------"));UserInfo userInfo = new UserInfo();userInfo.setUserName("Jay");userInfo.setPassword("Chou");int insert = userInfoMapper.insert(userInfo);System.out.println("影响行数:"+ insert);}

id 生成了随机数:

想自增需要使用 @TableId 设置:

id 会从最大值 2 开始自增:

如果想修改最大值:表上右键 >> 设计表 >> 选项 修改

(3)改

    @Testvoid testUpdate(){System.out.println(("----- 按 主键 更新一条数据 ------"));UserInfo userInfo = new UserInfo();userInfo.setId(2);userInfo.setUserName("lisi");userInfo.setDeleteFlag(1);userInfoMapper.updateById(userInfo);}

(4)删

    @Testvoid testDelete(){System.out.println(("----- 按 主键 删除一条数据 ------"));userInfoMapper.deleteById(-2019921918);}

3、命名映射注解

        MyBatis-plus 如何将类名、属性名与数据库表、主键字段、普通字段对应:

  • 根据实体类名推断表名。(@TableName
  • 默认 id 属性是主键。(@TableId
  • 驼峰规则的属性名对应的蛇形命名,就是表字段。(@TableField
  • 如果 java 命名不符合自动对应的的规则,可以用注解进行绑定

4、打印日志

        把 mybatis 改成 mybatis-plus 即可:

mybatis-plus:configuration: # 配置打印 MyBatis ⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5、自动生成代码(了解)

参考:代码生成器 | MyBatis-Plus

引入依赖:generator + 模板引擎

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.12</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency>

自动生成代码:

​public void test() {FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/book_test?characterEncoding=utf8" +"&useSSL=false&allowPublicKeyRetrieval=true","root", "123456").globalConfig(builder -> builder.outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")).packageConfig(builder -> builder.parent("com.edu.mybatis.plus.generator").entity("entity").mapper("mapper").service("service").xml("mapper.xml")).strategyConfig(builder -> builder.entityBuilder().enableLombok()).templateEngine(new FreemarkerTemplateEngine()).execute();}​

6、复杂 CRUD 操作

(1)什么是条件构造器

        条件构造器(Wrapper 类)允许链式构造条件(用 . 的方式直接引用条件构造方法),避免编写复杂 SQL,同时减少 SQL 注入风险。

  • AbstractWrapper:抽象类,提供 Wrapper 类共有的方法和属性。
  • QueryWrapper:构造查询条件。
  • UpdateWrapper:构造更新条件,可以不用构造实体类设置 set。
  • LambdaQueryWrapper:基于 Lambda 表达式构造查询条件。
  • LambdaUpdateWrapper:基于 Lambda 表达式构造更新条件。

        AbstractWrapper 实现了 Compare 接口,包含了各种条件构造器,比如大于、等于、模糊查询等,这些操作是四种 Wrapper 共有的:(更多详情参考官方文档)

        (Lambda)QueryWrapper 和 (Lambda)UpdateWrapper 的不同之处就是红框的部分。绿框是构造函数,其余方法都是差不多一样的。

(2)QueryWrapper

        增删改查都能用 QueryWrapper 实现。

查询

SELECT id,user_name,password FROM user_info WHERE delete_flag = 0 AND user_name 
LIKE "%min%"
    @Testvoid testQueryWrapper(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select("id", "user_name", "password").eq("delete_flag", 0).like("user_name", "min");List<UserInfo> userList = userInfoMapper.selectList(queryWrapper);userList.forEach(System.out::println);}

更新:需要构造实体类,设置修改值。

UPDATE user_info SET delete_flag=1 WHERE id < 3
    @Testvoid testQueryWrapper2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);queryWrapper.lt("id", 3);userInfoMapper.update(userInfo, queryWrapper);}

DELETE FROM user_info WHERE user_name = Jay2
    @Testvoid testQueryWrapper3(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_name", "Jay2");userInfoMapper.delete(queryWrapper);}

(3)UpdateWrapper

更新:不用构造实体类,直接 set。

 UPDATE user_info SET delete_flag=0 WHERE id IN (1,2)
    @Testvoid testUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag", 0).in("id", List.of(1,2));userInfoMapper.update(updateWrapper);}

直接 set sql 语句更新

 UPDATE user_info SET delete_flag=delete_flag+1 WHERE id IN (1,2)
    @Testvoid testUpdateWrapper2(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.setSql("delete_flag = delete_flag + 1").in("id", List.of(1,2));userInfoMapper.update(updateWrapper);}

(4)LambdaQueryWrapper

        字段名容易写错,Lambda 的版本就是用 实体类名::get属性名替代字段名字符串

        可以直接 new Lambda 版本 new 普通版本再使用 lambda 方法转为 Lambda 版本

SQL:

SELECT id,user_name,password FROM user_info WHERE delete_flag = 0 AND user_name 
LIKE "%min%"
    @Testvoid testLambdaQueryWrapper(){
//        LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().select(UserInfo::getId, UserInfo::getUserName, UserInfo::getPassword).eq(UserInfo::getDeleteFlag, 0).like(UserInfo::getUserName, "min");List<UserInfo> userList = userInfoMapper.selectList(queryWrapper);userList.forEach(System.out::println);}

(5)LambdaUpdateWrapper

SQL:

 UPDATE user_info SET delete_flag=0 WHERE id IN (1,2)
    @Testvoid testLambdaUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.lambda().set(UserInfo::getDeleteFlag, 1).in(UserInfo::getId, List.of(1,2));userInfoMapper.update(updateWrapper);}

setIncrBy:递增

setDecrBy:递减

示例:

UPDATE user_info SET delete_flag = delete_flag + 1
    @Testvoid testLambdaUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.lambda().set(UserInfo::getDeleteFlag, 1).in(UserInfo::getId, List.of(1,2));userInfoMapper.update(updateWrapper);}

(6)自定义 SQL

        MyBatis-plus 框架提供的操作不能满足所有的需求,我们可以利用 Wrapper 构造条件,在 Mapper 自定义 SQL。

  • 条件构造器传参:参数名 ew 或者重命名 @Param(Constants.WRAPPER)

  • 构造器使用:${ew.customSqlSegment} 引用。

SQL:

select id,username,password FROM user_info WHERE user_name = "admin"

注解方式:

    @Select("SELECT id, user_name, password FROM user_info ${ew.customSqlSegment}")UserInfo selectByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);

XML 方式:

    <select id="selectByCustom2" resultType="com.edu.mybatis.plus.model.UserInfo">SELECT id, user_name, password FROM user_info ${ew.customSqlSegment}</select>

测试代码:

    @Testvoid testSelectByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().eq(UserInfo::getUserName, "admin");userInfoMapper.selectByCustom(queryWrapper);}

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

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

相关文章

Android之腾讯TBS文件预览

文章目录前言一、效果图二、实现步骤1.去官网注册并创建应用[腾讯官网](https://console.cloud.tencent.com/tbs/client)2.下载arr文件并引入[腾讯TBS](https://download.csdn.net/download/Android_Cll/91764395)3.application实例化4.activity实例化5.下载网络文件6.PreviewA…

基于微信小程序的化妆品成分查询系统源码

源码题目&#xff1a;基于微信小程序的化妆品成分查询系统源码☑️ 文末联系获取&#xff08;含源码、技术文档&#xff09;博主简介&#xff1a;10年高级软件工程师、JAVA技术指导员、Python讲师、文章撰写修改专家、Springboot高级&#xff0c;欢迎高校老师、同行交流合作。毕…

STM32 启动执行逻辑与代码烧入方法详解:从底层原理到实操落地

STM32 启动执行逻辑与代码烧入方法详解&#xff1a;从底层原理到实操落地背景概要STM32启动和执行的核心逻辑链条代码烧入到STM32的途径方法结束语背景概要 在学习STM32时候我们知道代码需要通过一些下载器&#xff08;如ST-Link、J-Link&#xff09;或者串口下载烧入到STM32芯…

Go对接印度股票数据源指南:使用StockTV API

一、StockTV API简介 StockTV提供全球200国家的实时金融数据&#xff0c;覆盖股票、外汇、期货和加密货币市场。针对印度市场&#xff08;国家ID14&#xff09;&#xff0c;其主要优势包括&#xff1a; 毫秒级低延迟响应7x24小时稳定服务日均处理亿级数据免费技术支持 官方资源…

ESP8266:Arduino学习

ESP8266一&#xff1a;环境搭建使用Ardino框架&#xff0c;在官网下载&#xff0c;下载离线的支持包二&#xff1a;实现简单的项目1. 点灯{pinMode(LED_PIN, OUTPUT); // 设置引脚为输出模式digitalWrite(LED_PIN, HIGH); // 点亮 LED}I/O引脚的三种模式分别为&#xff1a;INPU…

青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 六级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程&#xff08;python六级&#xff09;等级考试试卷-客观题&#xff08;2023年3月&#xff09…

mongodb influxdb

、您需要提前配置 MongoDB 和 InfluxDB。让我帮您说明配置步骤&#xff1a; MongoDB 配置 启动 MongoDB 容器后&#xff0c;进入容器创建数据库&#xff1a; # 进入 MongoDB 容器 docker exec -it mongo mongosh -u root -p 123456# 创建 product 数据库 use product# 创建集合…

模拟电路中什么时候适合使用电流传递信号,什么时候合适使用电压传递信号

一、应用 1.实际应用中&#xff0c;需要进行权衡&#xff0c;比如抗干扰能力&#xff0c;传输距离&#xff0c;功耗 2.电压信号比较容易受到干扰&#xff0c;对噪声比较敏感&#xff0c;有噪声容限一说 3.电流信号对噪声不敏感 4.电源电压下降的稳定性或者长距离传输中的损耗问…

Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化

stevensu1/EC0823: Flink2.0学习笔记&#xff1a;使用HikariCP 自定义sink实现数据库连接池化 在 Flink 流处理应用中使用 HikariCP 实现数据库连接池化&#xff0c;对于写入关系型数据库&#xff08;如 MySQL、PostgreSQL&#xff09;的 自定义 Sink 来说&#xff0c;不仅是推…

Ubuntu安装及配置Git(Ubuntu install and config Git Tools)

Setup Git sudo apt update sudo apt install git // 查看git版本 git --versionConfig Github // 不清楚username和email的可以直接在github网站上点击头像选择settings来查看 git config --global user

将C++资源管理测试框架整合到GitLab CI/CD的完整实践指南

将C资源管理测试框架整合到GitLab CI/CD的完整实践指南 摘要 本文深入探讨了如何将先进的C资源管理测试框架无缝集成到GitLab CI/CD流水线中&#xff0c;实现自动化资源监控、性能回归检测和高质量测试。通过实际案例和最佳实践&#xff0c;展示了如何构建一个能够精确控制CPU亲…

Web漏洞

一、Sql注入 sql注入漏洞的成因是由于后端数据库查询语句没有做过滤导致了前端输入字符串可以直接拼接到语句而获取数据库信息。 1.类型 数字型和字符型 区分&#xff1a;数字型可以进行加减运算&#xff0c;id11会获取id2的信息&#xff0c;而字符型只会获取1的数据 2.方…

Java中使用Spring Boot+Ollama构建本地对话机器人

目录结构Ollama是什么安装 Ollama下载大模型运行模型Java和IDEA版本创建一个springboot项目创建一个简单的对话接口启动spring boot流式对话输出用原生 HTML 打造可交互前端接入 OpenAI、DeepSeek 等云模型&#xff08;可选&#xff09;原文地址传送门 我是想做一个大模型本地部…

学习设计模式《二十四》——访问者模式

一、基础概念 访问者模式的本质是【预留后路&#xff0c;回调实现】。仔细思考访问者模式&#xff0c;它的实现主要是通过预先定义好调用的通路&#xff0c;在被访问的对象上定义accept方法&#xff0c;在访问者的对象上定义visit方法&#xff1b;然后在调用真正发生的时候&…

Rust 符号体系全解析:分类、应用与设计意图

Rust 的符号体系是其语法规则、内存安全与类型安全设计的核心载体。每个符号不仅承担特定功能&#xff0c;更隐含 Rust 对 “安全” 与 “表达力” 的平衡逻辑。本文按功能维度&#xff0c;系统梳理 Rust 中所有常用符号&#xff0c;结合代码示例与设计背景&#xff0c;提供全面…

神经网络|(十六)概率论基础知识-伽马函数·上

【1】引言 前序学习进程中&#xff0c;对经典的二项分布和正态分布已经有一定的掌握。 今天为学习一种稍显复杂的分布提前布局一下&#xff0c;学习伽马函数。 【2】伽马函数 伽马函数有两种经典写法&#xff0c;一种是积分形式&#xff0c;另一种是无穷乘积形式。 【2.1】…

安全向量模板类SiVector

实现一个安全向量模板类 SiVector&#xff0c;其设计目标是&#xff1a;在保持 std::vector 易用性的基础上&#xff0c;增强越界访问的安全性&#xff08;避免崩溃&#xff09;&#xff0c;同时兼容 std::vector 的核心接口和使用习惯。支持嵌套使用&#xff08;如 SiVector&l…

Cloudflare 推出 GenAI 安全工具,守护企业数据

8 月 26 日,Cloudflare 为其企业平台 Cloudflare One 推出了新的安全功能,帮助企业安全地采用 ChatGPT、Claude 和 Gemini 等生成式 AI 工具。该工具构建为云访问安全代理 (CASB),通过 API 集成来监控和保护这些 AI 服务,无需安装设备。 随着企业对 GenAI 的使用激增——C…

Mac测试端口连接的几种方式

在 macOS 上测试端口是否开放&#xff0c;可通过以下三种常用方法实现&#xff08;推荐优先使用系统自带的 nc 命令&#xff0c;简单高效&#xff09;&#xff1a;方法 1&#xff1a;用系统自带 nc&#xff08;netcat&#xff09;测试&#xff08;最推荐&#xff09;nc 是 macO…

用PyTorch实现多类图像分类:从原理到实际操作

引言 图像分类作为计算机视觉的基石&#xff0c;已深度渗透到我们生活的方方面面——从医疗影像中早期肿瘤的识别、自动驾驶汽车对道路元素的实时检测&#xff0c;到卫星图像的地形分析与零售行业的商品识别&#xff0c;其核心都是让机器学会"看懂"世界并做出分类决…