JavaWeb - Mybatis - 基础操作

删除@Delete

接口方法:

@Mapper
public interface EmpMapper {
//@Delete("delete from emp where id = 17")
//public void delete();
//以上delete操作的SQL语句中的id值写成固定的17,就表示只能删除id=17的用户数据
//SQL语句中的id值不能写成固定数值,需要变为动态的数值
//解决方案:在delete方法中添加一个参数(用户id),将方法中的参数,传给SQL语句
/**
* 根据id删除数据
* @param id 用户id
*/@Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值public void delete(Integer id);
}
@Delete 注解:用于编写 delete 操作的 SQL 语句
如果 mapper 接口方法形参只有一个普通类型的参数, #{…} 里面的属性名可以随便写,如: #
{id} #{value} 。但是建议保持名字一致。
在单元测试类中通过 @Autowired 注解注入 EmpMapper 类型对象
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入private EmpMapper empMapper;@Testpublic void testDel(){//调用删除方法empMapper.delete(16);}
}

日志输入

Mybatis 当中我们可以借助日志,查看到 sql语句的执行、执行传递的参数以及执行结果。具体操作如下:
1. 打开 application.properties 文件
2. 开启 mybatis 的日志,并指定输出到控制台
#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.log-
impl=org.apache.ibatis.logging.stdout.StdOutImpl

预编译SQL

预编译 SQL 有两个优势:
1. 性能更高:  预编译 SQL ,编译一次之后会将编译后的 SQL 语句缓存起来,后面再次执行这条语句
时,不会再次编译。(只是输入的参数不同)
2. 更安全 ( 防止 SQL 注入):  将敏感字进行转义,保障 SQL 的安全性。

SQL注入

是通过操作输入的数据来修改事先定义好的 SQL 语句,以达到执行代码对服务器进行攻击的方法。
由于没有对用户输入进行充分检查,而 SQL 又是拼接而成,在用户输入参数时,在参数中添加一些
SQL 关键字,达到改变 SQL 运行结果的目的,也可以完成恶意攻击。

参数占位符

Mybatis 中提供的参数占位符有两种: ${...} #{...}

#{...}

执行 SQL 时,会将 #{…} 替换为 ? ,生成预编译 SQL ,会自动设置参数值
使用时机:参数传递,都使用 #{…}

${...}

拼接 SQL 。直接将参数拼接在 SQL 语句中,存在 SQL 注入问题
使用时机:如果对表名、列表进行动态设置时使用
注意事项:在项目开发中,建议使用 #{...} ,生成预编译 SQL ,防止 SQL 注入安全。

新增@Insert

接口方法:

@Mapper
public interface EmpMapper {@Insert("insert into emp(username, name, gender, image, job,
entrydate, dept_id, create_time, update_time) values (#{username}, #
{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #
{createTime}, #{updateTime})")
public void insert(Emp emp);
}
#{...} 里面写的名称是对象的属性名 (驼峰命名法)

新增(主键返回)

在数据添加成功后,需要获取插入数据库数据的主键。
默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在 Mapper
接口中的方法上添加一个 Options 注解,并在注解中指定属性 useGeneratedKeys=true和 keyProperty=" 实体类属性名 "
@Mapper
public interface EmpMapper {//会自动将生成的主键值,赋值给emp对象的id属性@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("insert into emp(username, name, gender, image, job,
entrydate, dept_id, create_time, update_time) values (#{username}, #
{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #
{createTime}, #{updateTime})")public void insert(Emp emp);
}

更新@Update

接口方法

@Mapper
public interface EmpMapper {
/**
* 根据id修改员工信息
* @param emp
*/@Update("update emp set username=#{username}, name=#{name},
gender=#{gender}, image=#{image}, job=#{job}, entrydate=#
{entrydate}, dept_id=#{deptId}, update_time=#{updateTime} where id=#
{id}")public void update(Emp emp);
}

查询@select

接口方法

@Mapper
public interface EmpMapper {@Select("select id, username, password, name, gender, image, job,
entrydate, dept_id, create_time, update_time from emp where id=#{id}")public Emp getById(Integer id);
}

数据封装

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
解决方案:
  • 1. 起别名
  • 2. 结果映射
  • 3. 开启驼峰命名

起别名

SQL 语句中,对不一样的列名起别名,别名和实体类属性名一样
@Select("select id, username, password, name, gender, image, job,
entrydate, " +
"dept_id AS deptId, create_time AS createTime, update_time AS
updateTime " +
"from emp " +
"where id=#{id}")
public Emp getById(Integer id);

手动结果映射

通过 @Results @Result 进行手动结果映射
@Results({@Result(column = "dept_id", property = "deptId"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime")})
@Select("select id, username, password, name, gender, image, job,
entrydate, dept_id, create_time, update_time from emp where id=#{id}")
public Emp getById(Integer id);

开启驼峰命名

如果字段名与属性名符合驼峰命名规则, mybatis 会自动通过驼峰命名规则映射
# application.properties 中添加:
mybatis.configuration.map-underscore-to-camel-case = true
要使用驼峰命名前提是 实体类的属性数据库表中的字段名严格遵守驼峰命名。

查询(条件查询)

SQL:
select id, username, password , name, gender, image, job, entrydate,
dept_id, create_time, update_time
from emp
where name like '% %'
and gender = 1
and entrydate between '2010-01-01' and '2020-01-01 '
order by update_time desc ;

接口方法一:

@Mapper
public interface EmpMapper {@Select("select * from emp " +"where name like '%${name}%' " +"and gender = #{gender} " +"and entrydate between #{begin} and #{end} " +"order by update_time desc")public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
}

方式二(解决SQL注入风险)

使用MySQL提供的字符串拼接函数:concat('%' , '关键字' , '%')

@Mapper
public interface EmpMapper {@Select("select * from emp " +"where name like concat('%',#{name},'%') " +"and gender = #{gender} " +"and entrydate between #{begin} and #{end} " +"order by update_time desc")public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
}

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

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

相关文章

[数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3241 标注数量(xml文件个数)&#xff1a;3241 标注数量(txt文件个数)&#xff1a;3241 标注…

GitHub精选|8 个强大工具,助力你的开发和探究工作

本文精选了8个来自 GitHub 的优秀项目&#xff0c;涵盖了 低代码、报表工具、Web 开发、云原生、通知管理、构建系统、生物计算、位置追踪、API 规范和依赖更新等方面&#xff0c;为开发者和研究人员提供了丰富的资源和灵感。 目录 1.防弹 React&#xff1a;构建强大的 Web 应…

第十周:机器学习笔记

第十周机器学习周报 摘要Abstract机器学习——self-attention&#xff08;注意力机制&#xff09;1. 为什么要用self-attention2. self-attention 工作原理2.1 求α的两种方式2.2 attention-score&#xff08;关联程度&#xff09; Pytorch学习1. 损失函数代码实战1.1 L1loss&a…

电路分析 ---- 加法器

1 同相加法器 分析过程 虚短&#xff1a; u u − R G R G R F u O u_{}u_{-}\cfrac{R_{G}}{R_{G}R_{F}}u_{O} u​u−​RG​RF​RG​​uO​ i 1 u I 1 − u R 1 i_{1}\cfrac{u_{I1}-u_{}}{R_{1}} i1​R1​uI1​−u​​&#xff1b; i 2 u I 2 − u R 2 i_{2}\cfrac{u_{…

如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的?

如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的&#xff1f; 目录 如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的&#xff1f; 一、官方开发文档 1.1、“微信小程序”开发文档的说明 1.2、“企业微信小程序”开发文档的说明 1.3、在企业…

无线信道中ph和ph^2的场景

使用 p h ph ph的情况&#xff1a; Rayleigh 分布的随机变量可以通过两个独立且相同分布的零均值、高斯分布的随机变量表示。设两个高斯随机变量为 X ∼ N ( 0 , σ 2 ) X \sim \mathcal{N}(0, \sigma^2) X∼N(0,σ2)和 Y ∼ N ( 0 , σ 2 ) Y \sim \mathcal{N}(0, \sigma^2)…

终端协会发布《移动互联网应用程序(App)自动续费测评规范》

随着移动互联网的快速发展&#xff0c;App自动续费服务已成为许多应用的标配&#xff0c;但同时也引发了不少消费者的投诉和不满。为了规范这一市场行为&#xff0c;保护消费者的合法权益&#xff0c;电信终端协会&#xff08;TAF&#xff09;发布了《移动互联网应用程序&#…

代码随想录 刷题记录-28 图论 (5)最短路径

一、dijkstra&#xff08;朴素版&#xff09;精讲 47. 参加科学大会 思路 本题就是求最短路&#xff0c;最短路是图论中的经典问题即&#xff1a;给出一个有向图&#xff0c;一个起点&#xff0c;一个终点&#xff0c;问起点到终点的最短路径。 接下来讲解最短路算法中的 d…

网络层 V(IPv6)【★★★★★★】

一、IPv6 的特点 IP 是互联网的核心协议。现在使用的 IP&#xff08;即 IPv4 ) 是在 20 世纪 70 年代末期设计的。互联网经过几十年的飞速发展&#xff0c;到 2011 年 2 月&#xff0c;IPv4 的地址已经耗尽&#xff0c; ISP 已经不能再申请到新的 IP 地址块了。我国在 2014 年…

梨花声音教育退费普通话学习技巧之了解文化背景

在学习普通话的过程中&#xff0c;了解中国的文化背景是不可或缺的一环。语言不仅是交流的工具&#xff0c;更是文化的载体。通过深入了解中国的历史、文化和社会背景&#xff0c;学习者可以更好地理解和掌握普通话&#xff0c;使语言学习变得更加生动有趣。本文将从几个方面详…

【iOS】属性关键字

目录 深浅拷贝 自定义类 容器类深拷贝 属性关键字 原子操作 atomic nonatomic 读写权限 readwrite readonly 内存管理 weak assign strong retian copy strong与copy 补充 属性关键字格式 ARC下property的默认属性 深浅拷贝 关于深浅拷贝&#xff0c;笔者在…

ClickHouse的安装教程

ClickHouse的安装教程 文章目录 ClickHouse的安装教程写在前面准备工作关闭防火墙CentOS 取消打开文件数限制安装依赖CentOS 取消 SELINUX 单机安装在 **node01** 的/opt/software 下创建 clickhouse 目录将下载的文件上传到 node01 的 /opt/software/clickhouse 目录下将安装文…

FPGA第 9 篇,Verilog 中的关键字和基数

前言 在 Verilog 中&#xff0c;关键字&#xff08;Keywords&#xff09;和基数&#xff08;Radix&#xff09;是语言的重要组成部分&#xff0c;它们有助于描述和定义硬件设计。上期分享了 Verilog 的基本使用&#xff0c;以及数据类型、逻辑值和算数运算符的简单应用&#x…

快手电商上线 “金秋赶蟹季” 活动,特别推出“蟹无忧”服务

金秋九月&#xff0c;正是品蟹好时节。为引入更多源头好蟹&#xff0c;快手电商发起了「金秋赶蟹季」溯源活动。为了让全国老铁提前品尝肥美的盘锦河蟹&#xff0c;9月3日&#xff0c;快手电商携手盘山县人民政府举行盘锦河蟹开捕仪式&#xff0c;并在快手小店 直播间进行全程直…

SprinBoot+Vue校园活动报名微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

性能测试经典案例解析——政务查询系统

各位好&#xff0c;我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的主页 道普云 文章内容具有一定门槛&#xff0c;建议先赞再收藏慢慢学习&#xff0c;有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平的你有所帮…

docker拉取redis5.0.5并建立redis集群

1.配置文件 mkdir -p redis-cluster/7001/ mkdir -p redis-cluster/7002/ mkdir -p redis-cluster/7003/ mkdir -p redis-cluster/7004/ mkdir -p redis-cluster/7005/ mkdir -p redis-cluster/7006/cd redis-clustervim 7001/redis.confbind 0.0.0.0port 7001cluster-enabled…

IJCAI-信也科技杯全球AI大赛-华东师范大学亚军队伍分享

作者&#xff1a;彭欣怡(找不到工作版) 华东师范大学; 马千里(搬砖版) 虾皮; 指导&#xff1a;闫怡搏(科研版) 华东师范大学 比赛链接&#xff1a;https://ai.ppdai.com/mirror/goToMirrorDetailSix?mirrorId34 前言 这是我们首次参加语音领域的比赛&#xff0c;最初只是抱着…

C语言程序设计 笔记代码梳理 重制版

前言 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute) 2.C语言编写代码到运行 都是先编译&#xff0c;后链接&#xff0c;最后运行。&#xff08;.c ---> .obj --->.exe&#xff09;这个过…

开发适合el-dialog的拉伸拖拽自定义指令和适配自定义的图片查看组件

目录 一、应用场景 二、开发流程 1.自定义指令 2.功能原理 3.难点 三、详细开发 四、总结 一、应用场景 我之前有开发过一个图片查看的组件&#xff0c;这个组件可在单页面打开&#xff0c;也可以在弹窗里打开&#xff0c;但是弹窗因为是比较固定&#xff0c;所以有一些…