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.mzph.cn/pingmian/40061.shtml

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

相关文章

Celery入门教程

一.Celery介绍 1.Celery架构 Celery架构基于可插拔组件&#xff08;pluggable components&#xff09;和根据选择的消息传输&#xff08;代理&#xff09;(message transport(broker))协议实现的消息交换机制。 2.Celery模块 &#xff08;1&#xff09;任务模块 Task 包含异…

Python数据分析的数据导入和导出

在Python数据分析中&#xff0c;数据的导入和导出是非常关键的步骤。这些步骤通常涉及到将数据从外部文件&#xff08;如CSV、Excel、数据库等&#xff09;读入到Python程序中&#xff0c;以及将处理后的数据导出回外部文件或数据库。以下是一些常用的库和方法来实现这些操作。…

2024中国西安科博会暨硬科技产业博览会11月召开

2024第18届中国西安国际科学技术产业博览会暨硬科技产业博览会 时间&#xff1a;2024年11月3日-5日 地点&#xff1a;西安国际会展中心 主办单位&#xff1a;中国国际科学技术合作协会 陕西省科技资源统筹中心 协办单位&#xff1a;西安市科学技术协会 西安市中小企业协会、…

昇思25天学习打卡营第3天|yulang

今天主要学习03-张量Tensor&#xff0c;主要包含了处理创建张量、张量的属性、张量索引和张量运算&#xff0c;稀疏张量&#xff0c;有点看不太懂&#xff0c;感觉要开始入门到放弃了&#xff1f;张量在构建和训练深度学习模型中的实际应用&#xff0c;如卷积神经网络。 张量&a…

Django学习第三天

python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…

力扣-744. 寻找比目标字母大的最小字母

文章目录 力扣题目代码工程 力扣题目 给你一个字符数组 letters&#xff0c;该数组按非递减顺序排序&#xff0c;以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符&#xff0c;则返回 letters 的第一个…

EasyExcel 填充+写入

使用 EasyExcel 导出 Excel 时&#xff0c;有时会遇到如下情况&#xff1a; 既要根据模板填充某些 sheet又要根据业务写入某些 sheet EasyExcel 官方没有提供这样的示例&#xff0c;经过自己的研究和实验&#xff0c;得到了如下步骤&#xff1a; 定义导出文件名 String fil…

扩散模型及其在物理和社会科学中的应用

扩散模型及其在物理和社会科学中的应用 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 扩散模型是描述某种物质、信息或行为如何在空间或时间中传播和扩散的数学模型。这种模型不仅在自然科学领域如…

一键获取:Win11笔记本系统下载地址!

在笔记本电脑操作中&#xff0c;用户想安装一款适合笔记本电脑使用的Win11系统&#xff0c;但不知道在哪里可以下载到&#xff1f;接下来系统之家小编给大家分享Win11笔记本系统下载地址&#xff0c;有需要的小伙伴一键点击即可获取&#xff0c;快速安装系统&#xff0c;即可体…

<电力行业> - 《第15课:电力领域(一)》

1 电网 发电厂与最终用电用户&#xff08;负荷&#xff09;往往相距很远&#xff0c;因此电力需要由电厂”输送“到最终用户&#xff0c;即“输电环节“&#xff0c;电流的输送往往导致因线路发热造成损耗&#xff0c;所以在输送的时候都是通过变电升高电压&#xff0c;让电流…

搜维尔科技:我们使用OptiTrack光学捕捉系统结合Manus VR手套制作了一些作品

搜维尔科技&#xff1a;我们使用OptiTrack光学捕捉系统结合Manus VR手套制作了一些作品 搜维尔科技&#xff1a;我们使用OptiTrack光学捕捉系统结合Manus VR手套制作了一些作品

计算机网络 | 期末复习

物理层&#xff1a; 奈氏准则&#xff1a;带宽&#xff08;w Hz&#xff09;&#xff0c;在不考虑噪音的情况下&#xff0c;最大速率&#xff08;2W&#xff09;码元/秒 信噪比S/N&#xff1a;以分贝&#xff08;dB&#xff09;为度量单位。信噪比&#xff08;dB&#xff09;…

C++初学者指南-3.自定义类型(第一部分)-异常

C初学者指南-3.自定义类型(第一部分)-异常 文章目录 C初学者指南-3.自定义类型(第一部分)-异常简介什么是异常&#xff1f;第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理 问题和保证资源泄露使用 RAII 避免内存泄漏&#xff01;析构函数&#xff1a;不要让异…

SpringBoot源码阅读3-启动原理

SpringBootApplication public class DistApplication {public static void main(String[] args) {// 启动入口SpringApplication.run()SpringApplication.run(DistApplication.class, args);} }1、服务构建 这里"服务"指的是SpringApplication对象&#xff0c;服务…

C++_02

1、类 1.1 什么是类 C 中的类&#xff08;class&#xff09;是一种编程结 构&#xff0c;用于创建对象。这些对象可以拥有属性&#xff08;即数据成员&#xff09;和行为&#xff08;即成员函数或方法&#xff09;。类的概念是面向对象编程的核心之一&#xff0c;其主要目的是…

2024年港澳台联考考生成绩数据分析来啦

分数线 出炉 2024年的港澳台联考正式出分&#xff01;根据考生成绩&#xff0c;全国联招划档线如下&#xff1a; 一、本科批次 &#xff08;一&#xff09;普通类院校&#xff08;专业&#xff09;&#xff1a;文史类365分、理工类390分&#xff08;部分院校执行高分线&#…

持续直击WCCI 2024:金耀初教授、台湾省台北分会等获殊荣 横滨夜景美不胜收

持续直击WCCI 2024&#xff1a;金耀初教授、台湾省台北分会等获殊荣&#xff01;横滨夜景美不胜收&#xff01; 会议之眼 快讯 会议介绍 IEEE WCCI&#xff08;World Congress on Computational Intelligence&#xff09;2024&#xff0c;即2024年IEEE世界计算智能大会&…

BAS(入侵与攻击模拟)正在替代红队测试?

之前经常会被用户问到&#xff0c;漏扫、渗透和红队红的区别是啥&#xff1f; 传统的漏扫、渗透和红蓝对抗&#xff0c;可以看到工具化的漏洞不可靠&#xff0c;人工的成本就高。怎么找到一个漏洞可信度又高&#xff0c;成本又低的&#xff0c;就诞生了BAS。 抛开漏扫&#xf…

解析Kotlin中的Lambda【笔记摘要】

先看实例&#xff1a; fun b(param: Int): String {return param.toString() }fun a(funParam: (Int) -> String): String {return funParam(1) }a(::b) val d ::b1.双冒号 ::method 到底是什么&#xff1f;答&#xff1a;一个指向和该函数具有相同功能的对象的引用 因为…

umi项目中的一些趣事

前言 出于某些安全问题&#xff0c;需要把HTML中框架注入的umi版本信息去掉&#xff0c;那要怎么搞呢~ 方案 查找官方文档&#xff0c;没发现可以去掉注入信息的方法&#xff0c;但在一番折腾后&#x1f609;终究还是解决了~ 发现 版本信息是从这里注入的~ Object.define…