MyBatis——增删查改(XML 方式)

1. 查询

1.1. 简单查询

使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中

如果要操作数据库,需要做以下的配置,与注解方式不同的是,还需要配置一下 XML 文件的路径,这样才能获取其中的配置信息

spring:application:name: mybatis-demodatasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:# 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件mapper-locations: classpath:mapper/**Mapper.xmlconfiguration: # 配置打印 MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

**Mapper.xml 表示以 Mapper.xml 结尾的文件

然后就是写持久层代码:

@Mapper
public interface UserInfoXmlMapper {List<UserInfo> selectAll();
}

XML 配置的方式就不需要把 SQL 语句写在这里了,接下来看怎么配置 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.example.mybatisdemo.mapper.UserInfoXmlMapper"><select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">//查询语句select * from user_info</select>
</mapper>

1.2. 驼峰转化问题

接下来看一下 XML 中是怎么解决的

第一种还是在 SQL 语句中设置别名的方式

<select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">select id,username,password,age,gender,phone,delete_flag as deleteFlag,create_time as createTime,update_time as updateTimefrom user_info
</select>

来看第二种方式:

<resultMap id="BashMap" type="com.example.mybatisdemo.model.UserInfo"><id property="id" column="id"></id><result property="deleteFlag" column="delete_flag"></result><result property="createTime" column="create_time"></result><result property="updateTime" column="update_time"></result>
</resultMap><select id="selectAll" resultMap="BashMap">select id,username,password,age,gender,phone,delete_flag,create_time,update_timefrom user_info
</select>

id属性指定了这个resultMap的唯一标识符为 BashMap,type 后面表示这个结果映射到对应的 java 对象的类型

<id property="id" column="id"></id>:这一行定义了如何将数据库表中的 “id” 列的值映射到UserInfo对象的 “id” 属性上,虽然说写不写都可以,但是建议还是写上,同时,其他 java 对象的属性名和 MySQL 中的字段对应的也建议写上

第三种方式还是通过配置来实现驼峰自动转换,和注解那里是一样的

mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰自动转换

1.3. 多表查询

由于是多表查询,所以也要创建第二个表的对象

@Data
public class ArticleInfo {private Integer id;private String title;private String content;private Integer uid;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

再来看持久层代码

@Mapper
public interface ArticleInfoMapper {@Select("select ta.id,ta.title, ta.content, ta.uid, tb.username, tb.password from article_info ta " +"left join user_info tb on ta.uid = tb.id " +"where ta.id = #{id} ")ArticleInfo selectArticleInfoAndUserInfo(Integer id);
}

但是上面由于获取了两个表的信息,但是返回值是ArticleInfo的对象,所以涉及到UserInfo的信息是没有被赋值的:

Mybatis 是把 SQL 查询到的信息根据参数的映射来赋值的,只需要把ArticleInfo的属性加上这些就可以赋值了

2. 增加

和注解方式的代码类似

先来看持久层代码:

定义好接口,通过传入对象的方式来传参

@Mapper
public interface UserInfoXmlMapper {Integer insertUser(UserInfo userInfo);
}

和上面的查询不同的是,这里不用再配置返回值类型,要写的 SQL 语句和注解方式一样,这里也是通过#{}来传参的

<insert id="insertUser">insert into user_info(username, password, age, gender)values (#{username}, #{password}, #{age}, #{gender})
</insert>

再来看传入的参数是对象时的重命名:

Integer insertUser2(@Param("userInfo") UserInfo userInfo);

这时 XML 中的 SQL 语句中的参数也是和注解方式一样,通过对象名. 的方式来表示参数

<insert id="insertUser2">insert into user_info(username, password, age, gender)values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender})
</insert>

不用对象名. 的方式就会出现绑定异常

关于使用传递对象方式参数重命名要通过对象名. 的方式表示参数的原因:

  1. 当方法有且仅有一个参数(比如 UserInfo 对象)时,可以不用 @Param 注解直接传入对象。这种情况下,在 XML 中可以直接通过 #{属性名} 的方式引用对象的属性,因为 MyBatis 能直接识别这个参数是一个对象。
  2. 当为这个唯一参数加上 @Param 注解(比如 @Param("userInfo")),MyBatis 就会用 userInfo 作为这个参数的别名。MyBatis 会将传入的 UserInfo 对象视为一个名为 userInfo 的封装对象。这样,XML 中的引用就需要带上这个别名前缀(userInfo.),从而确保引用的是这个封装对象下的属性

这一点和注解方式是一样的

3. 修改

先来看持久层代码:

@Mapper
public interface UserInfoXmlMapper {Integer updateUser(Integer id,String password);
}

XML 中还是一样的,也是不用配置返回值,然后直接写 SQL 语句

<update id="updateUser">update user_info set password = #{password} where id = #{id}
</update>

4. 删除

删除和修改也是类似的

持久层代码:

@Mapper
public interface UserInfoXmlMapper {Integer deleteUserById(Integer id);
}

XML配置:

<delete id="deleteUserById">delete from user_info where id = #{id};
</delete>

我的主页

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

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

相关文章

K8S如何基于Istio实现全链路HTTPS

K8S如何基于Istio实现全链路HTTPS Istio 简介Istio 是什么?为什么选择 Istio?Istio 的核心概念Service Mesh(服务网格)Data Plane(数据平面)Sidecar Mode(边车模式)Ambient Mode(环境模式)Control Plane(控制平面)Istio 的架构与组件Envoy ProxyIstiod其他组件Istio 的流量管…

vue3 中那些常用 靠copy 的内置函数

文章目录 vue3 常用函数罗列总结vue3 中批量注册组件vue3 自定义指令应用define 应用补充defineComponent 不同场景应用实例 vue3 常用函数罗列总结 toRefs 用途&#xff1a; 用于将一个响应式对象&#xff08;例如reactive创建的对象&#xff09;转换为普通对象&#xff0c;其…

docker镜像源,亲测可用,时间2024-11-14

最近由于特殊原因,docker拉取镜像总是失败 如果遇到docker拉取镜像失败 可以通过添加镜像源的方式解决 vim /etc/docker/daemob.json 添加如下内容 {"registry-mirrors": ["https://docker.rainbond.cc"] } 重新加载配置 sudo systemctl daemon-reload…

什么是AIGC?分清AI技术词

目录 1.AIGC 2.About Generative AI 详细对比表格 1.AIGC 自Open-AI发布Chat-GPT以来&#xff0c;国内外各大科技公司都展开了AI军备竞赛。从过去的某一天开始&#xff0c;我们突然发现AI可以帮助我们生成文字、图片、音频、视频等内容了&#xff0c;而且开始让人难以分清背…

鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)

鸿蒙相关平台作用&#xff1a;  开发者社区&#xff1a;开发者技术交流平台&#xff0c;帮助开发者探索开发实践、交流心得经验、获悉业界动态、答疑解惑。  开发者学堂&#xff1a;聚合官方鸿蒙生态课程&#xff0c;课程有慕课、微课、直播课、训练营等多种形式&#xff…

51c大模型~合集44

我自己的原文哦~ https://blog.51cto.com/whaosoft/11884382 #DR4SR 最佳学生论文解读&#xff0c;中科大、华为诺亚&#xff1a;序列推荐新范式DR4SR 本工作由认知智能全国重点实验室 IEEE Fellow 陈恩红团队与华为诺亚方舟实验室完成。陈恩红教授团队深耕数据挖掘、机器学…

uniapp中webview全屏不显示导航栏解决方案

uniapp官网文档地址&#xff1a;https://uniapp.dcloud.net.cn/api/window/window.html#getappwebview <template><view class"index"><u-navbar :is-back"true" title"标题"" :title-width"650"></u-navb…

Go语言中的`io.Pipe`:实现进程间通信的利器

在Go语言中&#xff0c;io.Pipe提供了一种在同一个进程中模拟管道&#xff08;pipe&#xff09;的方式&#xff0c;使得我们可以像操作操作系统的管道一样&#xff0c;在不同的goroutine之间进行数据传递。本文将深入探讨io.Pipe的工作原理、使用方法及其在实际开发中的应用场景…

openwebui二改界面环境搭建

1、下载源码 https://github.com/open-webui/open-webui 2、编译前端 npm i npm run dev 注意版本要求&#xff1a; Python Version: Python 3.11Node.js Version: 20.10 浏览器访问&#xff1a;http://localhost:5173/ 3、编译后端 cd backend conda create --name op…

HCIP-快速生成树RSTP

一、RSTP是什么 STP&#xff08;Spanning Tree Protocol &#xff09;是生成树协议的英文缩写。该协议可应用于环路网络&#xff0c;通过一定的算法实现路径冗余&#xff0c;同时将环路网络修剪成无环路的树型网络&#xff0c;从而避免报文在环路网络中的增生和无限循环。 RS…

多进程/线程并发服务器

多进程&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> #include <stdlib.h>#define SER_PORT…

在Element Ui中支持从系统粘贴版中获取图片和PDF,Docx,Doc,PPT等文档

在上一篇中&#xff0c;我们单纯的实现了Ctrl V实现从粘贴版中获取图片信息&#xff0c;但是点击上传的时候会有个bug&#xff0c;就是点击文件上传的时候&#xff0c;会出现一个bug&#xff0c;这篇&#xff0c;我们将在上一篇的基础上进行完善&#xff0c;并支持从粘贴版中获…

《数据可视化技术》上机报告

一、实验目的及要求 掌握pyecharts数据可视化环境搭建以及pyecharts交互式基础图形的绘制。 &#xff08;1&#xff09;掌握pyecharts中初始配置项&#xff0c;系列配置项&#xff0c;全局配置项的配置方法。 &#xff08;2&#xff09;掌握pyecharts中条形图的绘制方法。 …

️虚拟机配置NAT和Bridge模式

虚拟机的网络配置 桥接 通过使用物理机网卡 具有单独ip NAT 把物理机为路由器进行上网 NAT模式&#xff1a; 所谓nat模式&#xff0c;就是虚拟系统会通过宿主机的网络来访问外网&#xff0c;而这里的宿主机相当于有两个网卡&#xff0c;一个是真实网卡&#xff0c;一个是虚拟…

2023年值得关注的9大零售趋势

图片来源&#xff1a;Photo by Heidi Fin on Unsplash 随着经济衰退的威胁日益迫近&#xff0c;新的一年带给零售商一系列挑战&#xff0c;而后者刚从一年的供应链瓶颈和库存过剩中恢复过来。当然&#xff0c;2023年并非一直悲观。随着越来越多的零售商找到新的机会&#xff0c…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

【golang-技巧】-自定义k8s-operator-by kubebuilder

0.背景&参考 link : https://github.com/guangtouwangba/blog-example/tree/master/k8s-operator https://juejin.cn/post/7192525316890296380 https://book.kubebuilder.io/quick-start 1.download sudo curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/…

关于深度学习的一些工具安装与细节

核心的步骤按这篇文章&#xff1a; Python深度学习环境配置&#xff08;Pytorch、CUDA、cuDNN&#xff09;&#xff0c;包括Anaconda搭配Pycharm的环境搭建以及基础使用教程&#xff08;保姆级教程&#xff0c;适合小白、深度学习零基础入门&#xff09;_python torch cuda-CS…

DVWA靶场通关——SQL Injection篇

一&#xff0c;Low难度下unionget字符串select注入 1&#xff0c;首先手工注入判断是否存在SQL注入漏洞&#xff0c;输入1 这是正常回显的结果&#xff0c;再键入1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for…

Unity安装后点击登录没反应

我是把默认浏览器改为google就行了 1.点击登录无反应&#xff0c;无登录界面 用谷歌浏览器打开&#xff01;&#xff01;&#xff01;&#xff01; 把默认浏览器换成谷歌&#xff01; 火狐、百度等内置百度搜索引擎的都没反应&#xff01; 坑的我重装了好几遍UnityHub呜呜呜…