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 的流量管…

51c大模型~合集44

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

HCIP-快速生成树RSTP

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

在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发送到桌面快捷方式再考回来 &#…

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…

鸿蒙学习生态应用开发能力全景图-三方库(3)

鸿蒙生态三方库&#xff0c;是在鸿蒙系统上可重复使用的软件库&#xff0c;可帮助开发者重用技术资产&#xff0c;快速开发鸿蒙生态应用、元服务&#xff0c;提升开发效率。根据不同的开发语言分为两种&#xff1a;  ArkTS/TS/JS 语言的三方库&#xff0c;可直接导入并使用。…

OpenAI官方发布:利用ChatGPT提升写作的12条指南

近日&#xff0c;OpenAI官方发布了学生如何利用ChatGPT提升写作的12条指南&#xff0c;值得深入研究学习。 在如今AIGC应用爆发增长的时间点&#xff0c;如何充分利用生成式AI工具&#xff0c;如ChatGPT&#xff0c;有效切快速的提升写作和学习能力&#xff0c;成为每个学生、…

【数据库系列】Spring Data Neo4j Cypher 查询使用进阶指南

在 Neo4j 中&#xff0c;Cypher 查询语句并不像 MySQL 的 mapper XML 那样直接支持拆分和组织。然而&#xff0c;你可以使用一些策略来管理和重用 Cypher 查询&#xff0c;使其更易于维护和组织。以下是几种方法&#xff1a; 1. 使用 Spring Data Neo4j 的 Repository 接口 通…

.net core开发windows程序在国产麒麟操作系统中运行

.net core自从3.1版本号后&#xff0c;完全是一个独立的开源的多平台开发组件&#xff0c;目前国产化是趋势&#xff0c;不少项目需要开发国产如Kylin操作系统中运行的程序&#xff0c;无论是Web程序还是桌面程序&#xff0c;都有这样的需求。 首先&#xff0c;可明确的的.net…

基于 Python 的 Bilibili 评论分析与可视化

一、项目概述 本项目利用 Python 对 Bilibili &#xff08;哔哩哔哩&#xff09;平台上的视频评论数据进行爬取、清洗和分析&#xff0c;并通过可视化展示数据的主要特征。我们通过以下几个步骤实现了这一过程&#xff1a; 数据爬取&#xff1a;使用 Bilibili 提供的 API 获取…

如何禁用VMware虚拟网卡

安装VMWare虚拟机之后&#xff0c;会在本地创建两个虚拟网卡VMware Network Adapter VMnet1和VMware Network Adapter VMnet8&#xff0c;如果使用iNode客户端联网时会进行禁用多网卡检测&#xff0c;否则无法联网。因此&#xff0c;问题根源就在于虚拟网卡未禁用。 1、网络和…

ElasticSearch备考 -- Cross cluster replication(CCR)

一、题目 操作在cluster1&#xff08;local&#xff09;中操作索引task&#xff0c;复制到cluster2&#xff08;remote&#xff09;中 二、思考 CCR 我们可以对标MySQL 理解为为主从&#xff0c;后者备份。主节点负责写入数据&#xff0c;从/备节点负责同步时主节点的数据。 …

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

基于Java的药店管理系统

药店管理系统 一&#xff1a;基本介绍开发环境管理员功能模块图系统功能部分数据库表设计 二&#xff1a;部分系统页面展示登录界面管理员管理进货信息界面管理员管理药品信息界面管理员管理员工界面管理员管理供应商信息界面管理员管理销售信息界面员工对信息进行管理员工对销…

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…