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 包含异…

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…

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

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

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

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

计算机网络 | 期末复习

物理层&#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;服务…

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…

umi项目中的一些趣事

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

解决pip安装时的“SyntaxError: invalid syntax”错误

项目场景&#xff1a; 项目中有新的成员加入时&#xff0c;第一步就是安装开发环境&#xff0c;然而往往同样的机器、同样的配置&#xff0c;我们却总能遇到各种各样不同的问题。 今天分享一个简单的操作问题。 问题描述 项目用到pandas&#xff0c;安装pandas时遇到Syntax…

Java后端每日面试题(day2)

目录 Session和Cookie的关系Cookie与Session的区别JWT 由哪些部分组成&#xff1f;如何防止 JWT 被篡改&#xff1f;JWT 的特点 Session和Cookie的关系 Session和Cookie都可以用来实现跟踪用户状态&#xff0c;而二者是关系的&#xff1a;Session的实现依赖于Cookie。 Session…

【C语言】顺序表经典算法

本文介绍的是两道顺序表经典算法题目。 移除元素 &#xff08;来源&#xff1a;LeetCode&#xff09; 题目 分析 我们很容易想到的办法是去申请一个新的数组&#xff0c;遍历原数组不等于val就把它拿到新数组里。但是题目的要求是不使用额外空间&#xff0c;所以这种方法我们…

Python面向对象编程中的继承及其应用

目录 1. 继承的基本概念 2. 继承的语法 3. 继承的应用场景 4. 使用示例&#xff1a;汽车销售系统 5. 总结 继承是面向对象编程中的一个重要概念&#xff0c;它允许我们根据已有类创建新类&#xff0c;并继承已有类的属性和方法。在本文中&#xff0c;我们将学习Python中的…

Unity3D中,AI角色Rigidbody旋转导致的动画问题

在制作一些AI角色的时候&#xff0c;可能会运用到Rigidbody组件来使AI角色拥有一些相关的物理属性&#xff0c;但是AI角色在受到一些物理碰撞或者惯性等原因&#xff0c;会发生旋转导致动画出现意料外的错误&#xff0c;比如在由动转静的时候&#xff0c;可能会发生向前翻转等一…

卷积层里的填充和步幅

一、定义 1、对于卷积&#xff0c;我们另一个超参数是核的大小&#xff0c;通常使用的卷积核是33或者55&#xff0c;很少用偶数核 2、填充是为了让输出不变或者变大&#xff0c;是为了在输入不太大&#xff0c;又能使模型足够深的情况下使用 3、填充&#xff1a;在输入周围添…

【Java学习笔记】java图形界面编程

在前面的章节中&#xff0c;我们开发运行的应用程序都没有图形界面&#xff0c;但是很多应用软件&#xff0c;如Windows下的Office办公软件、扑克牌接龙游戏软件、企业进销存ERP系统等&#xff0c;都有很漂亮的图形界面。素以需要我们开发具有图形界面的软件。 Java图形界面编程…