MyBatis查询 ▎修改 ▎删除

前言:

在现代应用开发中,数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架,提供了直接编写 SQL 语句的能力,避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅影响数据的获取、更新和删除,还直接关系到应用的性能与安全性。接下来,我们将简要介绍 MyBatis 中如何高效执行这三种操作,并通过代码示例展示最佳实践

MyBatis搭建与配置

  1. 创建一个maven对象
  2. 导入MyBatis.jar包
  3. 创建一个全局的MyBatis配置文件
  4. 创建数据库
  5. 定义Dao接口,定义方法
  6. 创建sql映射文件,编写sql
  7. 测试MyBatis

MyBatis搭建与配置icon-default.png?t=N7T8https://blog.csdn.net/Dreamkidya/article/details/141524923?spm=1001.2014.3001.5501

Sql配置代码解读

<insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">insert into admin (account,password,gender) values (#{account},#{password},#{gender})
</insert><select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select>

id —>唯一标识(接口中方法名)

parameterType=“参数类型"


useGeneratedKeys ="true" 返回自增主键

keyProperty="id" 定义接收属性

keyColumn="id" 定义主键列

以上三个设置,数据库添加数据等,会向后端返回该数据行的主键值


resultType="返回结果集类型"

 参数传递

单参数传递

Admin selectAdmins(int id);

多参数传递

多个参数使用@Param(“id”)绑定

    //多个参数的传递Admin login(@Param("acc") String account, @Param("pass") String password);

复杂参数传递

 如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如: void insertAdmin(Admin admin)

Admin login1(Admin admin);

单表增删改查

    <!-- 修改--><update id="updateAdmin" parameterType="admin">update admin set account = #{account},password = #{password},gender = #{gender} where id = #{id}</update><!-- 添加--><insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">insert into admin (account,password,gender) values (#{account},#{password},#{gender})</insert><!-- 查询--><select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select><!-- 删除--><delete id="deleteAdmin" parameterType="int">delete from admin where id = #{id}</delete>

#{}和${}的区别

#{}   占位符,采用预编译的方式向sql中传值,可以防止sql注入,如果我们往SQL传值,使用#{}

${}    是将内容直接拼接到sql语句中,一般不用与向sql中传值,一般用于向SQL中动态的传递列名

区别:

  1. 底层实现不同 
    1. #{} 采用预编译方式,防止sql注入更加的安全
    2. ${} 采用字符串拼接,直接将值拼接在sql中
  2. 使用场景不同
    1. #{}  一般用于向sql中的列传值
    2. ${}  一般用于向sql中动态的传递列明  例如:排序时 order by 后面的列名是可以改变的.select后面的列名也可以自由选择

resultMap

定义 resutlMap

    <resultMap id="majorMap" type="major"><id column="id" property="id"></id><result column="name" property="name"></result></resultMap>

  1.  resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为 “majorMap”
  2.  resutlMap 的 type 属性是映射的 POJO 类型
  3.  id 标签映射主键,result 标签映射非主键
  4. property 设置对象属性名称,column 映射查询结果的列名称

驼峰命名与下划线映射关系

为什么要解决驼峰命名与下划线映射关系?

      因为数据库中命名一般为Student_Id  Java中命名一般为StudentId所以为了我们方便操作,我们通过设置来解决问题

解决:在mybatis配置文件中设置如下代码

    <!--   MyBatis配置文件--><settings><setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 打印日志 --><setting name="mapUnderscoreToCamelCase" value="true"/>  <!-- 解决驼峰问题 --></settings>

多表操作

association 关联数据表 

关联查询

方法一:在数据库中一次查出所有数据

    <!--对关联查询到的学生信息进行自定义映射关系--><resultMap id="studentMap" type="student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><!--映射关联数据 专业名称--><association property="major" javaType="major"><result column="mname" property="name"></result></association></resultMap><!--关联查询第一种--><select id="findStudent" resultMap="studentMap">select s.id,s.num,s.name,s.gender,m.name mnamefrom student s inner join major m on s.majorid = m.id where s.id = #{id}</select>

注:association 关联数据表  

property="major" ---->student对象中的major成员变量

javaType="major"----->major对象

解释:我们在Student类中创建Major变量,从而将Major类和Student类连接.我们从后端查询出来的Major类中数据,我们可直接封装在Major对象中(简单理解:其实也就是给Major变量赋值)

嵌套查询

方法二:数据库分次查询

    <!-- 关联查询第二种--><resultMap id="studentMap1" type="student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><!-- 封装关联查询--><association property="major" javaType="major" select="findMajor" column="majorid"></association></resultMap><select id="findStudentById" resultMap="studentMap1">select id,num,name,gender,majorid from student where id = #{id}</select><!-- 嵌套查询学生关联的专业--><select id="findMajor" resultType="major">select name from major where id = #{majorid}</select>

collection关联数据表

collection用来查询一个集合

关联查询

    <resultMap id="majorMap" type="major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="list" ofType="student"><result column="num" property="num"></result><result column="sname" property="name"></result></collection></resultMap><select id="findMajorById" parameterType="int" resultMap="majorMap">selectm.id,m.name,s.num,s.name snamefrom major m inner join student s on m.id = s.majorid where m.id = #{id}</select>

嵌套查询

    <resultMap id="majorMap1" type="major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="list" ofType="student" select="findStudents" column="id"></collection></resultMap><select id="findMajors1" resultMap="majorMap1">select id,name  from major</select><select id="findStudents" resultType="student">select num,name from student where majorid = #{id}</select>

代码解读

Collection和Association区别

Collection(集合)

  • 定义: Collection 是一个数据结构或容器,用于存储一组对象。它通常用于管理和操作多个相同类型的对象。例如,列表(List)、数组(Array)、集合(Set)等都是典型的 Collection。
  • 特点:
    • 包含多个对象,可以对其进行添加、删除、迭代等操作。
    • Collection 通常与某种特定的数据结构关联,负责对这些对象进行管理(如排序、查找等)。
    • 对象的生存周期通常由 Collection 管理,特别是在集合被销毁时,里面的对象可能也会被销毁。
  • 用途: 用于聚合和管理一组对象,通常用于处理大量相同类型的对象集合。

 Association(关联关系)

  • 定义: Association 是一种类与类之间的关系,描述一个类的对象与另一个类的对象之间的链接。例如,一个学校类和一个学生类之间可能会有一个 Association,表示学校包含许多学生。
  • 特点:
    • 表示类之间的连接或关系,而不是数据结构本身。
    • Association 可以是单向或双向的。单向 Association 表示一个类知道另一个类的存在,但反之不然;双向 Association 则表示两个类彼此都知道对方。
    • 关联关系不负责对象的生存周期管理。对象的创建和销毁由其他机制负责。
  • 用途: 用于表示类与类之间的关系,帮助定义对象间的交互和连接。

总结

  • Collection 主要用于管理一组对象的集合,关注的是数据结构和对象的管理。
  • Association 主要用于描述类之间的关系,关注的是对象之间的连接和相互作用

注解方式

  1. @Insert : 插入 sql , 和 xml insert sql 语法完全一样
  2. @Select : 查询 sql, 和 xml select sql 语法完全一样
  3. @Update :更新 sql, 和 xml update sql 语法完全一样
  4. @Delete :删除 sql, 和 xml delete sql 语法完全一样

使用场景:简单的sql一般适合使用注解查询  例如:用户信息查询,添加用户,删除单个用户等

代码演示:

@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);

动态sql

出现原因:因为业务需求出现用户存数据可能只存 姓名 不存 性别 或者不存任何数据,sql语句就需要判断书写.

第一:where 与 if 标签

if test 属性条件成立 执行if标签体,不成立就不执行

where标签 当where标签 if语句有条件成立时,就会动态添加where关键字,还可以删除where后面紧跟的关键字(例如:and,or)

    <select id="teachers1" resultType="teacher">SELECT * FROM teacher<where><if test="num!=0">and num = #{num}</if><if test="name!=null">and  name  = #{name}</if></where></select>

第二:trim标签

参数:

  • prefix

    • 作用: 在生成的 SQL 语句前添加的内容。
    • 示例: 如果你想在 SQL 语句的条件部分加上 WHERE,可以使用 prefix="WHERE"
  • prefixOverrides

    • 作用: 如果生成的 SQL 语句以指定的内容开头,则移除这些内容。通常用于去掉多余的 ANDOR
    • 示例: prefixOverrides="AND" 会去掉生成 SQL 语句中以 AND 开头的部分。
  • suffix

    • 作用: 在生成的 SQL 语句末尾添加的内容。
    • 示例: 如果你想在 SQL 语句的最后加上 ORDER BY,可以使用 suffix="ORDER BY"
  • suffixOverrides

    • 作用: 如果生成的 SQL 语句以指定的内容结尾,则移除这些内容。通常用于去掉多余的逗号、AND 或 OR。
    • 示例: suffixOverrides="," 会去掉生成 SQL 语句末尾多余的逗号

第三:choose标签

注:choose标签选择标签,标签中必须有选择对象,也就是必须有<when>标签

    <select id="teachers" resultType="teacher">SELECT * FROM teacher<trim prefix="where" prefixOverrides="and|or"><choose><when test="name!=null">name = #{name}</when><otherwise>name = '苏老师'</otherwise></choose></trim></select>

<when> --->当test中条件满足这执行,不满足执行<otherwise>标签中 和 if else差不多

第四:set标签

<set>标签可以在变量之间添加 逗号(,)  

    <update id="updateTeacher" parameterType="teacher">update teacher<set><if test="num!=0">num = #{num},</if><if test="name!=null">name = #{name}</if><if test="gender!=null">gender = #{gender}</if>where id = #{id}</set></update>

 第五:foreach标签

1. collection
  • 作用: 指定要迭代的集合。这个集合可以是列表、数组或其他 Java 集合类型。
  • 示例: collection="list" 表示要迭代名为 list 的集合。
2. item
  • 作用: 指定每次迭代时集合中元素的变量名。
  • 示例: item="item" 表示每次迭代时,当前集合项会被引用为 item
3. index
  • 作用: 可选参数,指定每次迭代时当前项的索引(从 0 开始)。通常用于在 SQL 语句中需要索引的场景。
  • 示例: index="index" 表示每次迭代时,当前项的索引会被引用为 index
4. open
  • 作用: 在生成的 SQL 片段开头添加的内容。通常用于生成集合的开头部分,如括号。
  • 示例: open="(" 表示生成的 SQL 片段的开头会加上左括号。
5. close
  • 作用: 在生成的 SQL 片段末尾添加的内容。通常用于生成集合的结束部分,如括号。
  • 示例: close=")" 表示生成的 SQL 片段的末尾会加上右括号。
6. separator
  • 作用: 指定每个集合项之间的分隔符。用于生成 SQL 片段中的项之间的分隔符,如逗号。
  • 示例: separator="," 表示集合项之间会用逗号分隔

代码演示:

    <delete id="deleteTeacher" parameterType="list">DELETE FROM teacherWHERE id IN<foreach collection="list" item="ids" open="(" separator="," close=")">#{ids}</foreach></delete>



 感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!

                                       希望路飞的笑容可以治愈努力路途中的你我!

博主vx:Dreamkid05 --->欢迎大家和博主讨论问题 

 

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

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

相关文章

go 使用 gitlab 搭建私有化模块系统

背景 本教程旨在教大家使用私有化部署的 gitlab 作为 go 的代码共享库&#xff0c;帮助团队分离代码模块&#xff0c;加强质量管控。go 官方在实现过程中就高度结合 VCS 系统&#xff0c; 可以仅通过配置相关的环境变量就实现私有库在 VCS 上的搭建。 代码分离样例 这里直接…

虚幻5|制作玩家血量,体力(还未编辑,只用于引用)

未编写&#xff0c;仅引用 优化后&#xff1a; 把增加生命&#xff0c;减少生命&#xff0c;也可以用在体力里&#xff0c;更改如下 限制浮点&#xff0c;如果血量或体力按10来扣&#xff0c;如果你的血量降低到5&#xff0c;那么就会以5的数值来扣&#xff0c;而不会扣成-5…

JVM极简教程

基础概念 1.1. Java 虚拟机 是运行 Java字节码的虚拟机 1.2. JVM跨平台原理 JVM在不同的系统&#xff08;Linux、Windows、MacOS&#xff09;上有不同的实现&#xff0c;目的是在使用相同的字节码&#xff0c;它们都会给出相同的结果 JVM跨平台本质&#xff1a;不同操作系统…

如何满足业主多元需求?开发物业APP,打造智能社区生活

随着智能科技的快速发展&#xff0c;物业管理也逐渐迈入数字化时代。物业app开发成为了提升社区管理效率、改善居民生活质量的重要途径&#xff0c;许多物业管理公司纷纷开发物业App&#xff0c;以提升管理效率、改善用户体验。一款出色的物业APP能够整合居民需求、提升企业服务…

Mybatis进阶——动态SQL

动态SQL 是Mybatis的强大特性之一&#xff0c;能够完成不同条件下的不同SQL拼接&#xff0c;可以参考官方文档&#xff1a;动态 SQL_MyBatis中文网 xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLI…

uniapp/uniapp x总结

uni-app组成和跨端原理 上图所诉 App的渲染引擎&#xff1a;同时提供了2套渲染引擎&#xff0c;.vue页面文件由webview渲染&#xff0c;原理与小程序相同&#xff1b;.nvue页面文件由原生渲染&#xff0c;原理与react native相同。开发者可以根据需要自主选择渲染引擎。 uniapp…

52.给定一个整数 n,实现一个算法返回 n 皇后不同的解决方案的数量

52. N-Queens II 题目 n皇后问题是指将n个皇后放置在一个nn的棋盘上,使得任意两个皇后不在同一行、同一列或同一对角线上。 给定一个整数 n,返回 n 皇后问题不同的解法数量。 示例: 输入: 4 输出: 2 解释: 4皇后问题有如下两个不同的解法: [ [“.Q…”, // 解法 1 “……

sqli-labs靶场通关攻略(36-40关)

第36关&#xff08;宽字节注入&#xff08;Bypass MySQL Real Escape String&#xff09;&#xff09; 查数据库 ?id-1%df%27%20union%20select%202,database(),3%20-- 查表 ?id-1%df union select 1,group_concat(table_name),3 from information_schema.tables where tab…

Python青少年简明教程:列表(List)、元组(tuple)和字典(dict)

Python青少年简明教程&#xff1a;列表&#xff08;List&#xff09;、元组&#xff08;tuple&#xff09;和字典&#xff08;dict&#xff09; 在Python中&#xff0c;列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;和字典&#xff08;Dict&#xff09…

Ubuntu下部署Hadoop集群+Hive(三)

Hive部署 准备环境 apache-hive-4.0.0-bin.tar.gz、mysql-connector-j-8.1.0.jar 如果是离线安装的话&#xff0c;使用mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar&#xff0c;在线安装的话则不用&#xff1b; hive下载地址&#xff1a;Index of /hive (apache.org) mysql …

机械学习—零基础学习日志(如何理解概率论9)

大数定律与中心定律 来看一道习题&#xff1a; 这个题目看看&#xff0c;应该是什么呢~下一章来看看解析~ 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP主&#xff09;

vue3 + ElImage + nodejs 集成了看板娘(UI原生开发达99%)的响应式BLOG(个人博客)。

一、想要我的屎山代码&#xff0c;可以私聊我哟 访问地址&#xff0c;欢迎访问&#xff08;访问效果更佳&#xff09; ☂ 被你发现了&#xff01;&#xff5c; snows_ls BLOGhttp://124.223.41.220/ 欢迎互挂友链 二、做了个啥 1、看板娘&#xff08;看效果好吧&#xff09;…

【数据结构】线性表的顺序表示(顺序表的定义和基本操作)

计算机考研408-数据结构笔记本之——第二章 线性表 2.2 线性表的顺序表示&#xff08;顺序表的定义和基本操作&#xff1a;初始化/插入/删除/查找&#xff09; 2.2.1 顺序表的定义 1.定义 顺序表是线性表的顺序存储。 所谓顺序存储&#xff0c;就是把逻辑上相邻的元素存储在物…

C++ 设计模式——享元模式

C 设计模式——享元模式 C 设计模式——享元模式1. 主要组成成分2. 享元模式内部状态3. 享元模式外部状态4. 逐步构建享元模式4.1 抽象享元类定义4.2 具体享元类实现4.3 享元工厂类实现4.4 主函数 5. 享元模式 UML 图享元模式 UML 图解析 6. 享元模式的优点7. 享元模式的缺点8.…

Linux驱动学习之中断与等待队列

本篇分为设备树部分和API接口部分 设备树 想要使用中断&#xff0c;设备树中需要有两个属性&#xff1a; interrupts // 表示要使用哪一个中断, 中断的触发类型等等。 interrupt-parent // 这个中断要接到哪一个设备去? 即父中断控制器是谁 父中…

趣味算法------拯救阿拉德大陆

目录 ​编辑 题目描述&#xff1a; 思路解析&#xff1a; 具体代码&#xff1a; 总结&#xff1a; 题目描述&#xff1a; 此时一批勇士也随之而来&#xff0c;但其能力也是参差不齐&#xff0c;我们需要挑选出最优秀的勇士来守护这片大陆。每位勇士都有属于自己的编号&am…

JobSchedulerService.setRequiresCharging需充电且电量大于90%才触发的现象

一、摘要 从源码看原生JobSchedulerService.setRequiresCharging 的特性&#xff0c;该特性竞品机器华为、Oppo也是如此。 1、应用处于前台可见&#xff0c;满足充电条件&#xff0c;立刻触发 2、应用处于后台不可见&#xff0c;需要设备连接USB或AC且电量大于90%&#xff0…

挂个人-CSDN Java优秀内容博主rundreamsFly抄袭

事件起因 今天点开自己的CSDN博客&#xff0c;发现给我推了一篇文章抄袭我自己昨天18点发的文章。 就是这篇&#xff0c;一字不差&#xff0c;博主昵称是&#xff1a;rundreamsFly&#xff0c;账号是rundreams。 抄袭者文章 发布于2024-8-26 19:37:41秒&#xff0c;比我发布…

C的温故而知新:位操作(C Primer Plus第十五章)

第十五章&#xff1a;位操作 这一章的篇幅不是很长&#xff0c;但既然能单独作为一章来讲的话&#xff0c;应该蛮重要的&#xff0c;但是我貌似没有总结出多少需要注意、加强记忆的东西&#xff0c;可见在JAVA的日常开发过程中基本不太遇见有关位操作的内容&#xff0c;所以我…

FSQ26信号分析仪RS FSU26 20HZ-26.5G频谱分析仪

罗德与施瓦茨Rohde & Schwarz FSQ26信号分析仪&#xff0c;20 Hz - 26.5 GHz ​R&S FSQ26 信号分析仪集两种仪器于一身。它提供高达 120 MHz 解调带宽的信号分析&#xff0c;并具有高端频谱分析仪的动态范围。 频率范围&#xff1a;20 Hz 至 26.5 GHz 高端频谱分析仪…