JavaWeb - Mybatis - 基础操作

news2024/9/22 7:39:34

删除@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;
    @Test
    public 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.coloradmin.cn/o/2111354.html

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

相关文章

美妆行业的画册电子版如何制作?

美妆行业的画册电子版制作&#xff0c;首先要确立画册的主题和内容。针对美妆行业特点&#xff0c;可以展示产品系列、护肤理念、品牌故事、用户评价等内容。同时&#xff0c;为了吸引目标受众&#xff0c;需要注重画面美观和时尚感&#xff0c;突出产品特点和品牌形象。 在选择…

如何快速理解网络编程

目录 前言 一、网络编程的概念 二、TCP/IP架构体系的各层作用 三、网络通信中常用的专业术语 四、IP地址的分类和划分 前言 在一个主机中&#xff0c;我们能进行进程间通信&#xff0c;但是随这时代发展&#xff0c;我们不可能只是在单独的一个主机中传输数据&#xff0c;&…

H3C SR-MPLS通过OSPF通告SID配置

首先在配置前理解几个基本概念 Prefix SID配置 统一分配和配置&#xff08;全局规划&#xff09;loopback和prefix sidPrefix SIDSRGB Base&#xff08;16000&#xff09;index Adj SID自动生成 对应SR节点间的互联链路SR节点本地标识&#xff0c;从设备本地Segment池中动态…

观趋势 谋发展 2024 SSHT上海智能家居展有哪些创新呈现?

引言&#xff1a;大数跨境发布的《2024全球智能家居市场洞察报告》显示&#xff0c;智能家居市场正迎来快速增长&#xff0c;预计从2024年的1215.9亿美元增长至2032年的6332.0亿美元&#xff0c;复合年增长率为22.9%。 近年来&#xff0c;随着物联网、AI等底层技术的飞速进步&…

I/O管理【上】

目录 一. I/O设备的概念与分类二. I/O控制器(考的频率不高&#xff0c;但还是要有印象)三. I/O控制方式&#xff08;重要考点&#xff09;3.1 程序直接控制方式3.2 中断驱动方式3.3 DMA方式3.4 通道控制方式 四. I/O软件层次结构4.1用户层软件4.2 设备独立性软件4.3 设备驱动程…

摩博会前瞻:OneOS智能超高安全性彩屏,百元级价格,高性能骑行新选择!

引言 中国国际摩托车博览会即将启动&#xff01;倒计时7天&#xff0c;OneOS与恒石智能联合打造的十几款智能彩屏仪表首次展出&#xff01;十几款彩屏仪表由国产HMI芯片Model系列驱动&#xff0c;OneOS实时操作系统&#xff0c;100%国产自主设计&#xff0c;实现百元级超高安全…

DP(Display Port)

DP&#xff08;Display Port&#xff09; 一、DP简介 DisplayPort是由美国视频电子协会&#xff08;VESA&#xff1a;Video Electronics Standards Association&#xff09;在2006年5月提出的一种新型数字显示接口规范&#xff0c;主要用于源端和设备端&#xff08;如电脑显示…

虚拟机中使用gparted扩展硬盘容量

步骤1&#xff1a;安装gparted apt-get install gparted 步骤2&#xff1a;关闭虚拟机&#xff0c;扩展硬盘容量 步骤3&#xff1a;开启虚拟机&#xff0c;找到gparted软件&#xff0c;双击 步骤4&#xff1a;扩展&#xff0c;点击原磁盘&#xff0c;点击扩展&#xff0c;点击保…

深度学习(十一)-PaddlePaddle

PaddlePaddle PaddlePaddle&#xff08;Parallel Distributed Deep Learning&#xff0c;中文名飞桨&#xff09; 是百度公司推出的开源、易学习、易使用的分布式深度学习平台 源于产业实践&#xff0c;在实际中有着优异表现 支持多种机器学习经典模型 优点 易用性。语法简…

网页时装购物系统:Spring Boot框架的创新设计

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对时装购物系统方面的要求也在不断提高&#xff0c;喜欢购物的人数更是不断增加&#xff0c;使得时装购物系统的开发成为必需而且紧迫的…

搭建线上虚拟展厅,需要哪些技术?

搭建虚拟展厅需要一系列先进的技术支持&#xff0c;以确保能够为用户提供逼真、生动、互动的参观体验。以下是搭建虚拟展厅所需的主要技术&#xff1a; 1. 三维建模与渲染技术 三维建模&#xff1a;利用三维建模软件&#xff08;如Maya、3D MAX、Blender等&#xff09;建造三维…

Python | Leetcode Python题解之第389题找不同

题目&#xff1a; 题解&#xff1a; class Solution:def findTheDifference(self, s: str, t: str) -> str:return chr(sum(map(ord, t)) - sum(map(ord, s)))

基于free5gc模拟5G核心网和UERANSIM模拟5G用户设备的模拟5G网络环境的部署搭建方法总结和解析。

简介&#xff1a;下文介绍了基于free5gc模拟5G核心网和UERANSIM模拟5G用户设备的模拟5G网络环境的部署搭建方法&#xff0c;并且通过完成相关配置&#xff0c; 简单实现测试5G用户设备接入核心网的注册流程、去注册流程&#xff0c;模拟了一个用户设备通过模拟核心网进行实际的…

2024年上海松江启动建筑绿色低碳发展专项检查,共绘城市节能新篇章

2024年9月4日&#xff0c;2024年度松江区建筑工程绿色低碳发展工作专项检查会议正式开展&#xff0c;会议内容主要围绕以下三点&#xff0c; 1、《关于开展 2024年度本市建筑领域绿色低碳发展工作监督检查的通知》宣贯。 2、分项计量、能效测评工作验收要求介绍。 3、专项检…

怎么使用matplotlib绘制一个从-2π到2π的sin(x)的折线图-学习篇

首先&#xff1a;如果你的环境中没有安装matplotlib&#xff0c;使用以下命令可以直接安装 pip install matplotlib如何画一个这样的折线图呢&#xff1f;往下看 想要画一个简单的sin(x)在-2π到2π的折线图&#xff0c;我们要拆分成以下步骤&#xff1a; 先导入相关的库文…

用ChatGPT撰写论文被判抄袭?8个技巧让你轻松写出原创优质论文

在学术写作中,原创性和诚信是评价论文质量的关键因素。ChatGPT作为一种先进的AI写作助手,可以帮助您快速生成内容,但同时也带来了抄袭的风险。本文将探讨如何在使用ChatGPT时确保您的论文内容独特且原创。 以下是每个步骤的详细使用说明和操作案例: 一、具体提问与个性化…

VBA进行excel坐标转换

在Excel里利用坐标绘图时&#xff0c;可以比较容易想到采用数据透视表&#xff0c;但是数据透视表生成的图不可更改&#xff0c;因此本案例采用VBA进行坐标变换而不改变原始值来转换图像&#xff0c;即实现图像的左右翻转和上下翻转&#xff0c;如下图所示&#xff0c;选择map的…

万字长文,只为给小白说明白搭建一个单节点多工作节点k8s如何操作!!!

这里写目录标题 1. Kubernetes 基础概念1.1 什么是 Kubernetes&#xff1f;1.2 核心组件 本次搭建的机器演示具体的安装部署步骤修改主机的机器名称依次修改主机的host文件配置免密登录当前用户的 SSH 公钥复制到远程主机关闭交换区分区加载 br_netfilter 内核模块为什么安装 K…

iptables防火墙的通俗理解,和k8s中的iptables策略使用

iptables是什么&#xff1f; 是ip table s ip 表格 多个 就是 多个和ip有关系的表格 什么是ip&#xff1f; 每个网络设备的唯一标识 有这个&#xff0c;能和别的有ip的设备聊天 没这个&#xff0c;得想别的办法 拿四版本来说 ip是32个二进制数 比如…

JAVA并发编程JUC包之CAS原理

在JDK 1.5之后&#xff0c;java api中提供了java.util.concurrent包&#xff0c;简称JUC包。这个包定义了很多我们非常熟悉的工具类&#xff0c;比如原子类AtomicXX&#xff0c;线程池executors、信号量semaphore、阻塞队列、同步器等。日常并发编程要用的熟面孔基本都在这里。…