MyBatis——增删改查操作的实现

news/2024/4/27 12:14:10/文章来源:https://blog.csdn.net/m0_60867520/article/details/129225675

开启mybatis sql日志打印

可以在日志中看到sql中执行的语句
在配置文件中加上下面这几条语句

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.example.demo=debug

查询操作

根据用户id查询用户

UserMapper:

UserInfo getUserById(@Param("user_id") Integer id);

UserMapper.xml:

<select id="getUserById" resultType="com.example.demo.entity.UserInfo">select * from userinfo where id=${user_id}
</select>

我们可以使用单元测试来测试查询到的信息是否正确
单元测试有如下特点:

  • 快速生成一个方法,来测试一个功能模块
  • 只有所有单元测试通过才会打包,防止程序出现bug
  • 用单元测试的事务可以回滚到未测试状态,不会污染数据库的数据

可以看到,spring中自带单元测试的依赖,我们不用再引用junit了
在这里插入图片描述
只需要在要测试的类中右键,选择generate,test,即可创建单元测试
在这里插入图片描述
在这里插入图片描述
勾选需要添加的单元测试方法
在这里插入图片描述
然后就会在test包下生成对应的测试类

添加@SpringBootTest注解可以让当前测试类运行在springBoot环境中

添加@Transactional注解,可以创建事务,运行完测试类后会回滚到初始状态,不会污染数据

@SpringBootTest
@Transactional
class UserMapperTest {@AutowiredUserMapper userMapper;@Testvoid getUserById(){UserInfo userInfo = userMapper.getUserById(1);System.out.println(userInfo);       Assertions.assertEquals("admin",userInfo.getUsername());}
}

可以看到,查询到对应的userinfo对象,并且控制台中有详细的sql语句
在这里插入图片描述
也可以使用#通配符

<select id="getUserById" resultType="com.example.demo.entity.UserInfo">select * from userinfo where id=#{user_id}
</select>

在这里插入图片描述
可以发现,使用$是直接用1替换id,而使用#则是先使用占位符?,再在后面的语句中用1替换

查询所有用户

UserMapper:

List<UserInfo> getAll();

UserMapper.xml:

<select id="getAll" resultType="com.example.demo.entity.UserInfo">select * from userinfo
</select>

UserMapperTest:

@Test
void getAll() {List<UserInfo> list = userMapper.getAll();Assertions.assertEquals(1, list.size());
}

在这里插入图片描述

根据用户名查询用户

UserMapper:

List<UserInfo> getUserByName(String username);

UserMapper.xml:

<select id="getUserByName" resultType="com.example.demo.entity.UserInfo">select * from userinfo where username=#{username}
</select>

UserMapperTest:

@Test
void getUserByName() {List<UserInfo> list = userMapper.getUserByName("admin");System.out.println(list.size());
}

这时查找是成功的:
在这里插入图片描述
如果使用$,则会不成功

<select id="getUserByName" resultType="com.example.demo.entity.UserInfo">select * from userinfo where username=${username}
</select>

在这里插入图片描述
可以看到,sql语句中直接将username替换成admin,而没有加上"",因此导致了查询操作不成功

#和$的区别

同样是占位符,#是预编译处理,也就是先将sql中的#{}内容替换成?然后在使用PreparedStatement的set方法来赋值操作
因此在替换时,admin会自动加上""

而$则是直接替换操作,因此admin没有加上""

而直接替换也有好处,例如我们要按顺序查找数据时,就不需要""了,因此需要使用$

<select id="getAllBySort" resultType="com.example.demo.entity.UserInfo">select * from userinfo order by id ${sort}
</select>

在这里插入图片描述

增添操作

UserMapper:

Integer add(UserInfo userInfo);

UserMapper.xml:
除了查找操作,其他的几种操作都不需要指定返回类型了,并且可以直接使用对象中的属性来进行插入操作

<insert id="add">insert into userinfo(username,password,createtime,updatetime)values(#{username},#{password},#{createTime},#{updateTime})
</insert>

UserMapperTest:

@Test
void add() {UserInfo userInfo = new UserInfo();userInfo.setUsername("san");userInfo.setPassword("123");userInfo.setCreateTime(LocalDateTime.now());userInfo.setUpdateTime(LocalDateTime.now());int result = userMapper.add(userInfo);System.out.println(result);Assertions.assertEquals(1, result);
}

在这里插入图片描述

添加自增id

在xml中将useGeneratedKeys设置为true,表示mybatis中使用数据库内部生成的主键

而keyProperty的值,可以指定唯一识别对象的属性,也就是说mybatis会使用getGeneratedKeys的返回值来设置值

<insert id="addGetId" useGeneratedKeys="true" keyProperty="id">insert into userinfo(username,password,createtime,updatetime)values(#{username},#{password},#{createTime},#{updateTime})
</insert>

修改操作

UserMapper:

int upUserName(UserInfo userInfo);

UserMapper.xml:

<update id="upUserName">update userinfo set username=#{username} where id=#{id}
</update>

UserMapperTest:

@Test
void upUserName() {UserInfo userInfo = new UserInfo();userInfo.setId(2);userInfo.setUsername("si");int result = userMapper.upUserName(userInfo);System.out.println(result);Assertions.assertEquals(1,result);
}

在这里插入图片描述

删除操作

UserMapper:

int delById(@Param("id") Integer id);

UserMapper.xml:

<delete id="delById">delete from userinfo where id=#{id}
</delete>

UserMapperTest

@Test
void delById() {Integer id = 2;int result = userMapper.delById(id);System.out.println(result);Assertions.assertEquals(1,result);
}

在这里插入图片描述

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

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

相关文章

Elasticsearch7.8.0版本进阶——自定义分析器

目录一、自定义分析器的概述二、自定义的分析器的测试示例一、自定义分析器的概述 Elasticsearch 带有一些现成的分析器&#xff0c;然而在分析器上 Elasticsearch 真正的强大之 处在于&#xff0c;你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单 …

Lighthouse组合Puppeteer检测页面

如上一篇文章lighthouse的介绍和基本使用方法结尾提到的一样&#xff0c;我们在实际使用Lighthouse检测页面性能时&#xff0c;通常需要一定的业务前置条件&#xff0c;比如最常见的登录操作、如果没有登录态就没有办法访问其他页面。再比如有一些页面是需要进行一系列的操作&a…

傻瓜式minio使用指南

傻瓜式minio使用指南1. docker部署minio1.1 docker拉取minio镜像1.2 创建docker容器1.3 查看docker容器是否启动正常2.登陆minio2.1 账户、密码为原先设置minioadmin2.2 创建桶2.3 设置桶属性3.Java客户端使用3.1引入依赖3.2 使用3.3 结果1. docker部署minio 1.1 docker拉取mi…

C语言几种判断语句简述

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 fals…

Linux系统下搭建maven环境

文章目录前述从官网下载安装包安装 maven修改maven配置修改环境变量测试前述 安装 maven 环境前&#xff0c;需要先安装 java 环境&#xff0c;如果没有安装 java 环境&#xff0c;可以参考&#xff1a;https://blog.csdn.net/weixin_45583303/article/details/118631855 从官…

【力扣周赛#334】6369. 左右元素和的差值 + 6368. 找出字符串的可整除数组 + 6367. 求出最多标记下标

目录 6369. 左右元素和的差值 - 前缀后缀和 ac 6368. 找出字符串的可整除数组 - 操作余数ac 6367. 求出最多标记下标 - 二分答案 贪心 6369. 左右元素和的差值 - 前缀后缀和 ac class Solution {public int[] leftRigthDifference(int[] nums) {int nnums.length;int[] re…

【JavaWeb】复习重点内容

✅✅作者主页&#xff1a;&#x1f517;孙不坚1208的博客 &#x1f525;&#x1f525;精选专栏&#xff1a;&#x1f517;JavaWeb从入门到精通&#xff08;持续更新中&#xff09; &#x1f4cb;&#x1f4cb; 本文摘要&#xff1a;本篇文章主要分享JavaWeb的学习重点内容。 &a…

QT之OpenGL混合

QT之OpenGL混合1. 概述2. 实现2.1 丢弃片段2.1.1 Demo2.2 混合2.2.1 相关函数2.2.2 排序问题2.2.3 Demo1. 概述 OpenGL中&#xff0c;混合(Blending)通常是实现物体透明度(Transparency)的一种技术。 2. 实现 2.1 丢弃片段 在某些情况下&#xff0c;有些片段是只需要设置显…

ecology9-谷歌浏览器下-pdf.js在渲染时部分发票丢失文字 问题定位及解决

问题 问题描述 &#xff1a; 在谷歌浏览器下&#xff0c;pdf.js在渲染时部分发票丢失文字&#xff1b;360浏览器兼容模式不存在此问题 排查思路&#xff1a;1、对比谷歌浏览器的css样式和360浏览器兼容模式下的样式&#xff0c;没有发现关键差别 2、✔使用Fiddler修改网页js D…

SAP MM学习笔记1-SAP中扩张的概念,如何将一个物料从工厂A扩张到工厂B

MM中在创建物料的时候&#xff0c;最低也得创建如下5个view。 基本数据1 基本数据2 购买管理 会计1 会计2 1&#xff0c;扩张是什么 有时候&#xff0c;你想增加其他的View&#xff0c;比如保管场所 等&#xff0c;你不能用MM02来做编辑&#xff0c;要用MM01来做扩张。这就是扩…

【Linux】工具(2)——vim

本期博客我们进入到Linux环境下vim工具的学习&#xff1a;一、vim是什么&#x1f4cc;Vim是一个超级超级强大的文本编辑器。Vim及前身VI&#xff0c;历史悠久&#xff08;可能比多数读者的年龄更大&#xff09;&#xff0c;经历了几十年的考验和发展。Vim全称叫Vi IMproved. 而…

聚类算法(上):8个常见的无监督聚类方法介绍和比较

无监督聚类方法的评价指标必须依赖于数据和聚类结果的内在属性&#xff0c;例如聚类的紧凑性和分离性&#xff0c;与外部知识的一致性&#xff0c;以及同一算法不同运行结果的稳定性。 本文将全面概述Scikit-Learn库中用于的聚类技术以及各种评估方法。 本文将分为2个部分&…

LearnOpenGL-入门-纹理

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录纹理纹理环绕方式纹理过滤多…

【java基础】包装类,自动装箱和自动拆箱

文章目录基本介绍包装类自动装箱自动拆箱包装类注意事项包装类比较包装器内容不可变基本介绍 有时&#xff0c;需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。 例如&#xff0c;Integer类对应基本类型int。通常&#xff0c;这些类称为包装器&#…

使用file-selector-button美化原生文件上传

前言 你平时见到的上传文件是下面这样的? 还是下面这种美化过的button样式 还是下面这种复杂的上传组件。 <input type="file" >:只要指定的是type类型的input,打开浏览器就是上面第一种原生的浏览器默认的很丑的样式。 下面的两种是我从ElementUI截的图,…

OpenAPI SDK组件介绍

背景 公司成立以来&#xff0c;积累了数以万计的可复用接口。上层的SaaS业务&#xff0c;原则上要复用这些接口开发自己的业务&#xff0c;为了屏蔽调用接口的复杂性&#xff0c;基础服务开发了apisdk组件&#xff0c;定义了一套声明OpenAPI的注解、注解解析器&#xff0c;实例…

scrapy下载图片

&#x1f431; 个人主页&#xff1a;莎萌玩家&#x1f64b;‍♂️ 作者简介&#xff1a;全栈领域新星创作者、专注于全栈各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01;&#x1f4ab;系列专栏&#xff1a;网络爬虫、WEB全栈开发&#x1f4e2; 资料…

你应该知道的ChatGPT提示语

ChatGPT 自上线以来&#xff0c;凭借其优异的自然语言理解和输出能力&#xff0c;仅花 5天就成为了活跃用户过百万的现象级产品。而上一个现象级产品 instagram 花了 2 个半月。到目前为止 ChatGPT 在全球累计用户数量已经过亿&#xff0c;相信现在也有很多人在跟 ChatGPT 聊过…

OKR 与 KPI有何异同?各部门OKR实例【小bu】

OKR 与 KPI&#xff0c;如何本土化是关键 近期公司计划对去年实施的绩效考核方案进行优化&#xff0c;公司以往采用 KPI 绩效考核方式&#xff0c;产生了一些争议。一方面&#xff0c;执行期间部分部门一度忽略指标设置的真实目的&#xff0c;导致出现短视思维和行为&#xff1…

TCP协议原理二

文章目录四、滑动窗口二、流量窗口三、拥塞控制四、滑动窗口 前面我们学习了 确认应答&#xff0c;超时重传&#xff0c;连接管理&#xff0c;这些机制都为我们TCP的可靠性提供了保证&#xff0c;当然在保证TCP的可靠性的同时&#xff0c;传输效率也受到了一定的影响&#xff…