MyBatis 进阶

MyBatis 进阶

    • 复杂CURD
      • 返回设置
        • 返回类型:resultType
        • 返回字典映射:resultMap
      • 多表查询
      • 动态SQL使⽤
        • <<if>if>标签
        • <trim\>标签
        • <where\>标签
        • <set\>标签
        • <foreach\>标签
    • 其他
      • 打开日志
      • 单元测试不污染数据库

复杂CURD

返回设置

返回类型:resultType
  • 绝⼤数查询场景可以使⽤ resultType 进⾏返回,如下代码所示:

    • 它的优点是使⽤⽅便,直接定义到某个实体类即可

      • <select id="getbyUserid" resultType="com.example.mybatis3.entity.Userinfo">select * from userinfo where id =${id}
        </select>
        
返回字典映射:resultMap
  • resultMap 使⽤场景:

    • 字段名称和程序中的属性名不同的情况,可使⽤ resultMap 配置映射;
      • ⼀对⼀和⼀对多关系可以使⽤resultMap映射并查询数据。
  • 字段名和属性名不同的情况

    • image-20231125141710802
  • 使用场景:

    • 实现实体类中的属性 和 字段映射的功能

    • <resultMap id="userMap" type="com.example.mybatis3.entity.Userinfo"><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/><result column="photo" property="photo"/>
      </resultMap>
      
      • <select id="getbyUserid" resultMap="userMap">select * from userinfo where id =${id}
        </select>
        
  • 当实体类属性名与数据库中名字不一致时:

    1. 使用 resultMap 进行映射
    2. 使用 数据库别名 as 重命名 (推荐)

多表查询

  • 在多表查询时,如果使⽤ resultType 标签
    • 在⼀个类中包含了另⼀个对象是查询不出来被包含的对象的
    • ⽐如以下实体类:
  • 最终实现:
    • 链表查询(left join inner join) + xxxVO
      • VO
        • view object
        • 专门给前端使用的对象

动态SQL使⽤

  • 动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接
    • mybatis – MyBatis 3 | 动态 SQL
<if>标签
  • 例子:

    • <insert id="add" useGeneratedKeys="true" keyProperty="id">insert into userinfo(username,password<if test="updateTime != null">,updatetime</if>)values(#{username},#{password}<if test="updateTime != null">,#{updatetime}</if>)
      </insert>
      
  • 效果:

    • image-20231126155004602
<trim>标签
  • trim 通常配合 if 来用

  • 如果所有字段都是⾮必填项

    • 就考虑使⽤标签结合标签,对多个字段都采取动态⽣成的⽅式
  • 标签中有如下属性:

    • prefix:表示整个语句块,以prefix的值作为前缀
    • suffix:表示整个语句块,以suffix的值作为后缀
    • prefixOverrides:表示整个语句块要去除掉的前缀
    • suffixOverrides:表示整个语句块要去除掉的后缀
      • 有则去除,没有则啥事不干
  • 例子:

    •     <insert id="add" useGeneratedKeys="true" keyProperty="id">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">username,</if><if test="password != null">password,</if><if test="photo != null">photo,</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">#{username},</if><if test="password != null">#{password},</if><if test="photo != null">#{photo},</if></trim></insert>
      
  • 效果:

    • image-20231126160350504
<where>标签
  • 传⼊的⽤户对象,根据属性做 where 条件查询,⽤户对象中属性不为 null 的,都为查询条件

  • where 可以去除 最前面的 and

    • 不会删除最后面的
  • 标签也可以使⽤ 替换

  • 例:

    • <select id="getListByParm" resultType="com.example.mybatis3.entity.Userinfo">select * from userinfo<where><if test="username != null">username = #{username}</if><if test="password != null">and password = #{password}</if></where>
      </select>
      
  • 效果:

    • image-20231126161931486
<set>标签
  • 根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤标签来指定动态内容

    •     <update id="upUser">update userinfo<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if></set>where id=#{id}</update>
      
  • 以上标签也可以使⽤ 替换

<foreach>标签
  • 对集合进⾏遍历时可以使⽤该标签。标签有如下属性:

    • collection:
      • 绑定⽅法参数中的集合,如 List,Set,Map或数组对象
    • item:遍历时的每⼀个对象
    • open:语句块开头的字符串
    • close:语句块结束的字符串
    • separator:每次遍历之间间隔的字符串
  • 例:

    •     int deleteUsers(List<Integer> ids);
      
    • <delete id="deleteUsers">delete from userinfo where id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach>
      </delete>
      
      • image-20231126185402770
  • 效果:

    • image-20231126172720365

其他

打开日志

mybatis:mapper-locations: classpath:mapper/**Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 配置打印 MyBatis 执行的 SQL
logging:level:com:example:mybatis3: debug
  • 日志内容:
    • mybatis底层 就是 JDBC
      • image-20231124162324467

单元测试不污染数据库

  • 加上@Transactional注解:

    • 可以加到类或者方法上

    • @SpringBootTest
      @Transactional
      class UserinfoMapperTest {@Autowiredprivate UserinfoMapper userinfoMapper;@Testvoid deleteUser() {int i = userinfoMapper.deleteUser(2);System.out.println(i);Assertions.assertEquals(1,i);}
      }
      
  • 效果:

    • 执行成功
      • image-20231124163120116
      • 并且数据库中数据未删除
        • image-20231124163149179

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

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

相关文章

Model::unguard()的作用

这是在生成假数据时碰见的&#xff0c;浅查了一下 Model::unguard() 是 Laravel 框架中的一个方法&#xff0c;它的作用是取消对 Eloquent 模型的属性赋值的安全性保护。 在默认情况下&#xff0c;Laravel 的 Eloquent 模型会对属性赋值做一些安全性检查&#xff0c;例如防止…

Java:IO流详解

文章目录 基础流1、IO概述1.1 什么是IO1.2 IO的分类1.3 顶级父类们 2、字节流2.1 一切皆为字节2.2 字节输出流 OutputStream2.3 FileOutputStream类2.3.1 构造方法2.3.2 写出字节数据2.3.3 数据追加续写2.3.4 写出换行 2.4 字节输入流 InputStream2.5 FileInputStream类2.5.1 构…

LeetCode 225.用队列实现栈(详解) ૮꒰ ˶• ༝ •˶꒱ა

题目详情&#xff1a; 思路&#xff1a;1.定义两个队列用于存储栈的数据&#xff0c;其中一个为空。 2.对我们定义的栈进行入数据&#xff0c;就相当于对不为空的队列进行入数据。 3.对我们定义的栈进行删除&#xff0c;相当于取出不为空的队列中的数据放到为空的队列中&#x…

Python基础入门第八课笔记(自定义函数 lambda)

什么时候用lambda表达式&#xff1f; 当函数有一个返回值&#xff0c;且只有一句代码&#xff0c;可以用lambda简写。 2、lanbda语法 lambda 形参 : 表达式 注意&#xff1a; 1、形参可以省略&#xff0c;函数的参数在lambda中也适用 2、lambda函数能接收任何数量的参数但只能…

MySQL之视图内连接、外连接、子查询案例

目录 一.视图 1.1 含义 1.2 操作 二.案例 三.思维导图 一.视图 1.1 含义 虚拟表&#xff0c;查询方面和普通表一样使用。 1.2 操作 1.创建视图&#xff1a; create or replace view 视图名 as 查询语句&#xff1b; 2.视图的修改&#xff1a; 方式1 create or replace view …

了解长短期记忆 (LSTM) 网络:穿越时间和记忆的旅程

一、说明 在人工智能和机器学习的迷人世界中&#xff0c;长短期记忆 (LSTM) 网络作为一项突破性创新脱颖而出。LSTM 旨在解决传统循环神经网络 (RNN) 的局限性&#xff0c;尤其是在学习长期依赖性方面的局限性&#xff0c;彻底改变了我们在各个领域建模和预测序列的能力。本文深…

Nacos与Eureka

一、前言 在构建和管理微服务架构时&#xff0c;选择适当的服务注册中心至关重要。Nacos和Eureka都是微服务体系结构中常用的服务注册和发现工具。本文将探讨它们之间的区别&#xff0c;帮助开发者在选择适合其项目需求的注册中心时做出明智的决策。 二、架构和适用场景 Nacos …

Java/JDK下载安装与环境配置

Java由Sun Microsystems&#xff08;现在是Oracle的子公司&#xff09;于1995年首次发布。它是一种面向对象的编程语言&#xff0c;广泛应用于Web开发、移动应用程序开发、桌面应用程序开发和企业级应用程序开发等领域。 Java语言的主要特点是跨平台、可移植性强、安全性高和具…

【开源】基于JAVA语言的智能教学资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…

VLM,LLM等大模型如何应用于机器人控制(以强化学习为例)

VLM&#xff1a;视觉语义模型&#xff0c;准确识别图中有什么&#xff0c;处于什么状态&#xff0c;以及不同物体之间的关联。 LLM&#xff1a;语言大模型&#xff0c;可以针对当前的环境&#xff0c;自动生成可执行的任务&#xff0c;或者将人类指令重新分成可执行的子任务。…

[MAUI]在.NET MAUI中调用拨号界面

在.NET MAUI中调用拨号界面 前置要求: Visual Studio 2022 安装包“.NET Multi-platform App UI 开发” 参考文档: 电话拨号程序 新建一个MAUI项目 在解决方案资源管理器窗口中找到Platforms/Android/AndroidManifest.xml在AndroidManifest.xml中添加下文中…块如下:<?xml…

MAC系统安装多版本JDK

文章目录 1.JDK下载与安装2.查看安装过那些版本的jdk3.查看是否存在.bash_profile4.配置环境变量5.实现版本切换6.有些Mac可能版本问题&#xff0c;在关闭终端后&#xff0c;配置会失效&#xff01; 1.JDK下载与安装 官网下载地址: https://www.oracle.com/java/technologies/…

C++补充内容--语法篇

这里写目录标题 语法其他语法函数的存储类函数参数默认值格式默认参数位置重载函数的默认参数 指针名与正常指针的自增自减以及解引用与的优先级问题指针的赋值、加减数字、加减指针二维数组中的一些指针辨析输出调用字符指针时 会将该指针以及之后的元素全部输出二维数组未完全…

[NAND Flash 5.2] SLC、MLC、TLC、QLC、PLC NAND_闪存颗粒类型

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子…

在vscode中创建任务编译module源文件

接昨天的文章 [创建并使用自己的C模块&#xff08;Windows10MSVC&#xff09;-CSDN博客]&#xff0c;觉得每次编译转到命令行下paste命令过于麻烦&#xff0c;于是研究了一下在vscode中创建自动编译任务。 经过尝试&#xff0c;在task.json中增加如下代码&#xff1a; {"…

【LMM 011】MiniGPT-5:通过 Generative Vokens 进行交错视觉语言生成的多模态大模型

论文标题&#xff1a;MiniGPT-5: Interleaved Vision-and-Language Generation via Generative Vokens 论文作者&#xff1a;Kaizhi Zheng* , Xuehai He* , Xin Eric Wang 作者单位&#xff1a;University of California, Santa Cruz 论文原文&#xff1a;https://arxiv.org/ab…

UI5与后端的文件交互(一)

文章目录 前言一、RAP的开发1. 创建表格2. 创建CDS Entity3. 创建BDEF4. 创建implementation class5. 创建Service Definition和Binding6. 测试API 二、创建UI5 Project1. 使用Basic模板创建2. 创建View3. 测试页面及绑定的oData数据是否正确4. 创建Controller5. 导入外部包&am…

java中使用redis

1、redis数据类型 1.1、5种数据类型 redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种常用的数据类型&#xff1a;字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set / zset。 字符串(string)&#xff1a;普通字符…

如何把硬盘(分区)一分为二?重装系统的小伙伴不可不看

注意事项&#xff1a;本教程操作不当会导致数据丢失 请谨慎操作 请谨慎操作 请谨慎操作 前言 相信各位小伙伴都会切土豆吧&#xff0c;本教程就是教大家如何切土豆切得好的教程。 啊哈哈哈&#xff0c;开玩笑的。 比如你有一个D盘是200GB&#xff0c;想要把它变成两个100G…

【详解】求解迷宫所有路径(递归实现)----直接打穿迷宫

目录 递归的模型&#xff1a; 栈帧&#xff1a; 递归调用深度&#xff1a; ​编辑 用递归算法求解迷宫问题&#xff1a; 小结&#xff1a; 结语&#xff1a; 递归的小小总结&#xff0c;朋友们可以看看&#xff0c;有助于理解后面的递归程序。 递归的模型&#xff1a; …