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.rhkb.cn/news/471460.html

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

相关文章

A029-基于Spring Boot的物流管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

华为路由策略配置

一、AS_Path过滤 要求&#xff1a; AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接&#xff0c;引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…

如何向函数模块 FM 中传递 Range 参数

有时候需要在选择屏幕之后调用一个函数模块&#xff0c;那么如果利用 SE37 在函数模块定义 Range 参数呢。 解决方法很简单&#xff0c;系统有很多预定义的 Range_* 类型&#xff1a; 如上图&#xff0c;这里有很常用的 Range 结构&#xff0c;如订单号、发票号、公司代码等等…

工作和学习遇到的技术问题

写在前面 记录工作和学习遇到的技术问题,以求再次遇到可以快速解决。 1&#xff1a;Ubuntu TSL换源报错&#xff1a;Err:1 http://mirrors.aliyun.com/ubuntu focal InRelease 执行如下操作&#xff08;已经操作的则忽略&#xff09;&#xff0c;首先在文件/etc/apt/sources…

研究生如何远控实验室电脑?远程办公功能使用教程

如果你是研究生&#xff0c;是不是会遇到需要远程控制实验室电脑进行查看文献、调代码和拉数据的时候&#xff1f;有时候就是这么棘手&#xff0c;不过你可以借助一些工具来帮助你随时随地远控实验室电脑。这样就不用担心导师催促&#xff0c;无法及时完成科研了。常见的工具比…

重卡穿越商都,ROG DAY 2024郑州站高燃来袭

野塘菡萏正新秋,红藕香中过郑州!2024年11月9日~10日,ROG DAY 2024信仰集结的号角正式吹响,首战据点落地郑州局外太格茂。炫酷涂装的战车如同未来战士般震撼登陆,ROG硬核科技闪耀亮相,现场氛围瞬间点燃!活动现场人流不息,年轻学子、数码爱好者、极客玩家、科技博主以及周末悠闲惬…

web安全测试渗透案例知识点总结(上)——小白入狱

目录 一、Web安全渗透测试概念详解1. Web安全与渗透测试2. Web安全的主要攻击面与漏洞类型3. 渗透测试的基本流程 二、知识点详细总结1. 常见Web漏洞分析2. 渗透测试常用工具及其功能 三、具体案例教程案例1&#xff1a;SQL注入漏洞利用教程案例2&#xff1a;跨站脚本&#xff…

浪潮信息“源”Embedding模型登顶MTEB榜单第一名

在自然语言处理&#xff08;NLP&#xff09;和机器学习领域&#xff0c;Embedding模型是将文本数据转换为高维向量表示的核心技术&#xff0c;直接影响NLP任务&#xff08;如文本分类、情感分析等&#xff09;的效果&#xff0c;对于提升模型性能和深入理解文本语义具有至关重要…

catchadmin-webman 宝塔 部署

1&#xff1a;宝塔的php 中删除禁用函数 putenv 问题&#xff1a; 按照文档部署的时候linux&#xff08;php&#xff09; vue (本地) 无法访问后端api/login 的接口 。 解决办法&#xff1a; webman 没有配置nginx 反向代理 配置就能正常访问了

【AutoGen 】简介

学习笔记AutoGen。它可以使用多个代理来开发 LLM 应用程序,这些代理可定制、可相互对话,可在各种模式下运行,且无缝允许人的参与,进一步在更大程度上为开发者提供助力。AutoGen 智能应用开发(一)|AutoGen 基础 学习笔记

【月之暗面kimi-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

统信UOS开发接口DTK

DTK(Development ToolKit)是基于 Qt 开发的简单且实用的通用开发框架。提供丰富的开发接口与支持工具,能有效提升开发效率。 文章目录 一、简介DTK 常见模块介绍概述二、框架创建开发环境准备使用 cmake三、常见模块窗口和对话框一、简介 DTK 常见模块介绍 概述 DTK(Dev…

城市轨道交通数据可视化的应用与优势

通过图扑可视化技术将复杂的数据转化为易于理解的图像&#xff0c;助力交通管理者优化线路规划、提升运营效率和乘客信息服务。轨道交通管理者能够更直观地分析乘客流量、运营效率等关键指标&#xff0c;从而优化线路设计与调度&#xff0c;提高服务质量&#xff0c;为乘客提供…

【JavaEE初阶 — 多线程】生产消费模型 阻塞队列

1. 阻塞队列 (1) 阻塞队列 1. 概念 阻塞队列是一种特殊的队列&#xff0c;也遵守"先进先出"的原则&#xff1b;阻塞队列能是一种线程安全的数据结构&#xff0c;主要用来阻塞队列的插入和获取操作&#xff1a; 当队列满了的时候&#xff0c;插入操作会被…

重构开发之道,Blackbox.AI为技术注入智能新动力

本文目录 一、引言二、Blackbox.AI实战体验2.1 基于网页界面生成前端代码进行应用开发2.2 与AI助手实现实时智能对话2.3 重塑大型文件交互方式2.4 链接Github仓库进行对话编程 三、总结 一、引言 在生产力工具加速进化的浪潮中&#xff0c;Blackbox.AI开始崭露头角&#xff0c…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支&#xff0c;就选delete&#xff0c;仅想删除本地分支&#xff0c;选cancel&#xff1b; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy&#xff0c;这通常是在 Git 操作过程中出现的情况&#xff0c;可能是在执行如 git branch -d 或其他…

第四十五章 Vue之Vuex模块化创建(module)

目录 一、引言 二、模块化拆分创建方式 三、模块化拆分完整代码 3.1. index.js 3.2. module1.js 3.3. module2.js 3.4. module3.js 3.5. main.js 3.6. App.vue 3.7. Son1.vue 3.8. Son2.vue 四、访问模块module的state ​五、访问模块中的getters ​六、mutati…

【OpenEuler】配置虚拟ip

OpenEuler系统手动配置虚ip 介绍操作方法临时生效永久生效 验证 介绍 我们知道通过keepalived服务可以为linux服务器设置虚拟ip&#xff0c;但是有些特殊场景下若无法安装部署keepalived服务&#xff0c;则需要通过手动设置的方式&#xff0c;配置服务器的虚拟ip。 本方案提供…

CCI3.0-HQ:用于预训练大型语言模型的高质量大规模中文数据集

摘要 我们介绍了 CCI3.0-HQ&#xff0c;它是中文语料库互联网 3.0&#xff08;CCI3.0&#xff09;的一个高质量500GB子集&#xff0c;采用新颖的两阶段混合过滤管道开发&#xff0c;显著提高了数据质量。为了评估其有效性&#xff0c;我们在不同数据集的100B tokens上从头开始…

fastadmin多个表crud连表操作步骤

1、crud命令 php think crud -t xq_user_credential -u 1 -c credential -i voucher_type,nickname,user_id,voucher_url,status,time --forcetrue2、修改控制器controller文件 <?phpnamespace app\admin\controller;use app\common\controller\Backend;/*** 凭证信息…