Java---Mybatis详解二

雄鹰展翅凌空飞, 大江奔流不回头。 壮志未酬心未老, 豪情万丈任遨游。

巍巍高山攀顶峰, 滔滔黄河入海流。 风云变幻凭君舞, 踏遍天涯尽逍遥。

目录

一,环境准备

 二,删除

 三,删除(预编译SQL)

为什么性能更高?

为什么更安全?

 四,新增

五,更新

六,查询

七,条件查询

like 模糊匹配

一,环境准备

基于上一篇文章的环境Java---Mybatis详解一-CSDN博客 ,新增加一些数据:

INSERT INTO tb_user (username, password) VALUES ('user1', 'password123');
INSERT INTO tb_user (username, password) VALUES ('user2', 'password1233');
INSERT INTO tb_user (username, password) VALUES ('user3', 'password1234');
INSERT INTO tb_user (username, password) VALUES ('user4', 'password12345');
INSERT INTO tb_user (username, password) VALUES ('user5', 'password123456');

在单元测试中通过IOC依赖注入,来查询所插入的数据:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}}

输出结果:

至此,环境准备完毕

 二,删除

要进行删除操作,首先要在之前创建的UserMapper中添加一个删除的接口:

@Mapper
public interface UserMapper {@Select("select * from tb_user")public List<UserBean> findAll();//根据id删除数据@Delete("delete from tb_user where id =#{id}")public void deleteById(Integer id);
}

注意:因为id是我们传入的参数,所以需要动态获取,springboot中使用#{id}来表示动态传入的参数

 在单元测试中根据依赖注入来调用删除方法:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}@Testpublic void testDel() {userMapper.deleteById(2);}}

运行testDel方法后,查看数据库:

发现数据库中少了id为2的数据,所以删除成功了。

 三,删除(预编译SQL)

在springboot中配置mybatis的日志,可以指定输出日志到控制台。

在application.properties中添加配置项:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/yz
spring.datasource.username=root
spring.datasource.password=1234#配置mybatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

然后执行删除操作:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}@Testpublic void testDel() {userMapper.deleteById(3);}}

然后我们就会在控制台看到删除的相关sql语句的日志: 

 预编译SQL有什么优势呢?

 为什么性能更高?

先看下没有预编译的情况:

 每执行一条sql语句,需要执行三次缓存

再来看一下预编译的情况:

通过预编译sql语句,只需要缓存一次即可,性能更高

为什么更安全?

先来看看什么是SQL注入:

SQL注入,是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

预编译会将输入的内容整个的替换为? 从而防止SQL注入。

 四,新增

新增数据同样需要现在UserMapper中增加新增的接口

@Mapper
public interface UserMapper {@Select("select * from tb_user")public List<UserBean> findAll();//根据id删除数据@Delete("delete from tb_user where id =#{id}")public void deleteById(Integer id);//插入数据@Insert("insert into tb_user(username,password)"+" values (#{username},#{password})")public void insert(UserBean user);
}

在application.properties中添加插入测试方法:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}@Testpublic void testDel() {userMapper.deleteById(3);}@Testpublic void testInsert(){UserBean userBean = new UserBean();userBean.setUsername("袁震");userBean.setPassword("123456");userMapper.insert(userBean);}}

运行之后,查看数据库表:

插入操作就完成了。

五,更新

更新数据同样需要在UserMapper中添加接口:

@Mapper
public interface UserMapper {@Select("select * from tb_user")public List<UserBean> findAll();//根据id删除数据@Delete("delete from tb_user where id =#{id}")public void deleteById(Integer id);//插入数据@Insert("insert into tb_user(username,password) values (#{username},#{password})")public void insert(UserBean user);//更新用户信息@Update("update tb_user set username =#{username},password =#{password} where id =#{id}")public void upDate(UserBean user);
}

在测试程序中添加测试代码:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}@Testpublic void testDel() {userMapper.deleteById(3);}@Testpublic void testInsert(){UserBean userBean = new UserBean();userBean.setUsername("袁震");userBean.setPassword("123456");userMapper.insert(userBean);}@Testpublic void testUpdate(){UserBean userBean = new UserBean();userBean.setId(6);userBean.setPassword("123456789");userBean.setUsername("袁震1");userMapper.upDate(userBean);}}

运行后观察数据库:

修改成功

六,查询

在UserMapper中添加根据id查询用户信息接口:

@Mapper
public interface UserMapper {@Select("select * from tb_user")public List<UserBean> findAll();//根据id删除数据@Delete("delete from tb_user where id =#{id}")public void deleteById(Integer id);//插入数据@Insert("insert into tb_user(username,password) values (#{username},#{password})")public void insert(UserBean user);//更新用户信息@Update("update tb_user set username =#{username},password =#{password} where id =#{id}")public void upDate(UserBean user);//根据id查询用户信息@Select("select * from tb_user where id =#{id}")public UserBean findById(Integer id);
}

在测试程序中测试查询结果:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}@Testpublic void testDel() {userMapper.deleteById(3);}@Testpublic void testInsert(){UserBean userBean = new UserBean();userBean.setUsername("袁震");userBean.setPassword("123456");userMapper.insert(userBean);}@Testpublic void testUpdate(){UserBean userBean = new UserBean();userBean.setId(6);userBean.setPassword("123456789");userBean.setUsername("袁震1");userMapper.upDate(userBean);}@Testpublic void testFind(){UserBean userBean = userMapper.findById(6);System.out.println(userBean.toString());}}

输出:

注意:

 解决方法:

七,条件查询

like 模糊匹配

在UserMapper中添加接口:

@Mapper
public interface UserMapper {@Select("select * from tb_user")public List<UserBean> findAll();//根据id删除数据@Delete("delete from tb_user where id =#{id}")public void deleteById(Integer id);//插入数据@Insert("insert into tb_user(username,password) values (#{username},#{password})")public void insert(UserBean user);//更新用户信息@Update("update tb_user set username =#{username},password =#{password} where id =#{id}")public void upDate(UserBean user);//根据id查询用户信息@Select("select * from tb_user where id =#{id}")public UserBean findById(Integer id);//条件查询用户信息 查询包含user的用户@Select("select * from tb_user where username like concat('%',#{name},'%')")public List<UserBean> findByName(String name);
}

 在测试程序中测试:

@SpringBootTest
class Demo1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserBean> userBeanList = userMapper.findAll();userBeanList.stream().forEach(userBean -> {System.out.println(userBean.toString());});}@Testpublic void testDel() {userMapper.deleteById(3);}@Testpublic void testInsert(){UserBean userBean = new UserBean();userBean.setUsername("袁震");userBean.setPassword("123456");userMapper.insert(userBean);}@Testpublic void testUpdate(){UserBean userBean = new UserBean();userBean.setId(6);userBean.setPassword("123456789");userBean.setUsername("袁震1");userMapper.upDate(userBean);}@Testpublic void testFind(){UserBean userBean = userMapper.findById(6);System.out.println(userBean.toString());}@Testpublic void testFindByName(){List<UserBean> user = userMapper.findByName("user");System.out.println(user.toString());}}

输出:

这样所有包含user的用户都查询出来了。

 

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

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

相关文章

无法定位程序输入点Z9 qt assertPKcS0i于动态链接库F:\code\projects\06_algorithm\main.exe

解决方法&#xff1a; 这个报错&#xff0c;是因为程序在运行时没要找到所需的dll库&#xff0c;如果把这个程序方法中对应库的目录下执行&#xff0c;则可正常执行。即使将图中mingw_64\bin 环境变量上移到msvc2022_64\bin 之前也不可以。 最终的解决方法是在makefile中设置环…

RealMAN:大规模真实录制且经过注释的麦克风阵列数据集

在深度学习驱动的多通道语音增强和声源定位系统的开发中&#xff0c;由于缺乏大规模的真实录制数据集&#xff0c;这些系统的训练在很大程度上依赖于房间脉冲响应&#xff08;RIR&#xff09;和多通道扩散噪声的模拟。然而&#xff0c;模拟数据和真实世界数据之间存在的声学失配…

QStringListModel 绑定到QListView

1.QStringListModel 绑定到listView&#xff0c;从而实现MV模型视图 2.通过QStringListModel的新增、删除、插入、上下移动&#xff0c;listView来展示出来 3.下移动一行&#xff0c;传入curRow2 的个人理解 布局 .h声明 private:QStringList m_strList;QStringListModel *m_m…

[译]Reactjs性能篇

英文有限&#xff0c;技术一般&#xff0c;海涵海涵&#xff0c;由于不是翻译出身&#xff0c;所以存在大量的瞎胡乱翻译的情况&#xff0c;信不过我的&#xff0c;请看原文&#xff5e;&#xff5e; 原文地址&#xff1a;https://facebook.github.io/react/docs/advanced-per…

Servlet_Web小结

1.web开发概述 什么是服务器&#xff1f; 解释一&#xff1a;服务器就是一款软件,可以向其发送请求,服务器会做出一个响应. 可以在服务器中部署文件,让他人访问 解释二&#xff1a;也可以把运行服务器软件的计算机也可以称为服务器。 web开发&#xff1a; 指的是从网页中向后…

Android LayoutInflater 深度解析

在 Android 开发中&#xff0c;LayoutInflater 是一个非常重要的工具。它允许我们从 XML 布局文件中动态地创建 View 对象&#xff0c;从而使得 UI 的创建和管理更加灵活。本文将深入解析 android.view.LayoutInflater&#xff0c;包括它的基本用法、常见问题以及高级用法。 什…

idea xml ctrl+/ 注释格式不对齐

处理前 处理后 解决办法 取消这两个勾选

【UE5.3】笔记6-创建可自由控制Pawn类

搭建场景 搭建一个场景&#xff1a;包含地板、围墙。可以根据喜好加一些自发光的效果。 增加食物 创建食物蓝图类&#xff0c;在场景里放置一些食物以供我们player去吃掉获取分值。 创建可控制的layer 我们先右键创建一个蓝图继承自pawn类&#xff0c;起名BP_Player&#xf…

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略

什么是半监督目标检测&#xff1f; 传统机器学习根据训练数据集中的标注情况&#xff0c;有着不同的场景&#xff0c;主要包括&#xff1a;监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性&#xff0c;在介绍半监督目标检测方法之前&#xff0c;我…

视频融合共享平台LntonCVS统一视频接入平台智慧安防应用方案

安防视频监控平台LntonCVS是一款拥有强大拓展性和灵活部署能力的综合管理平台。它支持多种主流标准协议&#xff0c;包括国标GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容各厂家的私有协议和SDK&#xff0c;如海康Ehome、海大宇等。LntonCVS不仅具备传统安防视频监控功能&…

PHP电商系统开发指南最佳实践

电子商务系统开发的最佳实践包括&#xff1a;数据库设计&#xff1a;选择适合关系型数据库&#xff0c;优化数据结构&#xff0c;考虑表分区&#xff1b;安全&#xff1a;加密数据&#xff0c;防止 sql 注入&#xff0c;处理会话管理&#xff1b;用户界面&#xff1a;遵循 ux 原…

mysql-sql-第十四周

学习目标&#xff1a; sql 学习内容&#xff1a; 40.查询学过「哈哈」老师授课的同学的信息 Select * from students left join score on students.stunmscore.stunm where counm (select counm from teacher left join course on teacher.teanmcourse.teanm where teache…

【深度学习】Transformer

李宏毅深度学习笔记 https://blog.csdn.net/Tink1995/article/details/105080033 https://blog.csdn.net/leonardotu/article/details/135726696 https://blog.csdn.net/u012856866/article/details/129790077 Transformer 是一个基于自注意力的序列到序列模型&#xff0c;与基…

伺服调试三环讲解

在伺服调试过程中,有些项目要求不高,采用伺服自整定就可以调试好伺服,但有些项目对伺服有着比较高的要求,于是需要采取手动调试伺服参数,下面就介绍一下伺服三环参数的调试的方法。 三环指:电流环、速度环、位置环 带宽关系:电流环带宽>速度环带宽>位置环带宽 三环控…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

偏微分方程笔记

极小位能原理&#xff1a; C 2 C^2 C2 是一个集合符号&#xff0c;表示所有二阶连续可微函数的集合 弱导数 C 2 C^2 C2 是一个集合符号&#xff0c;表示所有二阶连续可微函数的集合。 C 0 ∞ ( I ) C^{\infty}_0(I) C0∞​(I)表示于 I I I上无穷可微&#xff0c;且在端点a&…

使用pyinstaller 如何打包python项目

参考&#xff1a;【python项目正确打包方法-哔哩哔哩】 https://b23.tv/EDB6zbG Pyinstaller 详解多种打包过程(去坑,填坑)。_pyinstaller -f -w-CSDN博客 1.打开命令提示符&#xff1a; 找到python项目所在位置&#xff0c;输入cmd即可 2. 安装pipenv: 在命令提示符&#…

【强化学习的数学原理】课程笔记--2(贝尔曼最优公式,值迭代与策略迭代)

目录 贝尔曼最优公式最优 Policy求解贝尔曼最优公式求解最大 State Value v ∗ v^* v∗根据 v ∗ v^* v∗ 求解最佳 Policy π ∗ \pi^* π∗一些证明过程 一些影响 π ∗ \pi^* π∗ 的因素如何让 π ∗ \pi^* π∗ 不 “绕弯路” γ \gamma γ 的影响reward 的影响 值迭…

UiPath+Appium实现app自动化测试

一、环境准备工作 1.1 完成appium环境的搭建 参考&#xff1a;pythonappiumpytestallure模拟器(MuMu)自动化测试环境搭建_appium mumu模拟器-CSDN博客 1.2 完成uipath的安装 登录官网&#xff0c;完成注册与软件下载安装。 UiPath业务自动化平台&#xff1a;先进的RPA及自动…

Visual Studio 中的键盘快捷方式

1. Visual Studio 中的键盘快捷方式 1.1. 可打印快捷方式备忘单 1.2. Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用&#xff08;除非另有指定&#xff09;。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成&#xff1…