当前位置: 首页 > java >正文

web第十次课后作业--Mybatis的增删改查

(一)删除操作

功能:根据主键删除数据

  • SQL 语句
-- 删除id=17的数据
delete from emp where id = 17;

Mybatis 框架让程序员更关注于 SQL 语句

  • 接口方法
@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}。但是建议保持名字一致。

测试结果
在这里插入图片描述

🆔后接的是“?”,而不是16。这种 SQL 语句我们称为预编译 SQL。
这种SQL语句主要是为了防止SQL注入–将敏感字进行转义,以保障 SQL 的安全性。

(二)增加操作

功能:新增员工信息在这里插入图片描述
那要如何实现在插入数据之后返回所插入行的主键值呢?

  • 默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在 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);}

(三)更新

在这里插入图片描述

(四)查询

  • 数据封装
    如果查询返回的结果中大部分字段是有值的,但是 deptId,createTime,updateTime 这几个字段是没有值的,而数据库中是有对应的字段值的,原因如下:

实体类属性名和数据库表查询返回的字段名一致,mybatis 会自动封装。
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

解决方案:

  1. 起别名
@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);
  1. 结果映射
@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);
  1. 开启驼峰命名
    如果字段名与属性名符合驼峰命名规则,mybatis 会自动通过驼峰命名规则映射,要使用驼峰命名前提是 实体类的属性 与 数据库表中的字段名严格遵守驼峰命名。

驼峰命名规则: abc_xyz => abcXyz

  • 表中字段名:abc_xyz
  • 类中属性名:abcXyz

在application.properties中添加:
mybatis.configuration.map-underscore-to-camel-case=true

1. 直接查询

在这里插入图片描述

2. 条件查询

  • 方式一
@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);
}

以上方式注意事项:

  1. 方法中的形参名和 SQL 语句中的参数占位符名保持一致

  2. 模糊查询使用${…}进行字符串拼接,这种方式呢,由于是字符串拼接,并不是预编译的形式,所以效率不高、且存在 sql 注入风险。

  • 方式二(解决 SQL 注入风险)
    • 使用 MySQL 提供的字符串拼接函数:concat(‘%’ , ‘关键字’ , ‘%’)
//条件查询@Select("select * from emp " +"where name like concat('%',#{name},'%') " +"and gender = #{gender}")public List<Emp> list(@Param("name") String name,@Param("gender") Short gender);
@Testpublic void testListByNameAndGender() {// 测试数据准备String name = "金庸";  // 模糊匹配名字包含"金庸"的记录Short gender = 1;     // 性别为男(1)// 执行查询List<Emp> empList = empMapper.list(name, gender);// 验证结果assertNotNull(empList, "查询结果不应为null");assertFalse(empList.isEmpty(), "查询结果不应为空");// 打印查询结果System.out.println("===== 查询结果 =====");empList.forEach(emp -> {System.out.println(emp);// 验证每条记录都满足查询条件assertTrue(emp.getName().contains(name), "姓名应包含: " + name);assertEquals(gender, emp.getGender(), "性别应为: " + gender);});// 验证特定记录是否存在boolean foundJinyong = empList.stream().anyMatch(emp -> "金庸".equals(emp.getName()));assertTrue(foundJinyong, "应找到名为'金庸'的记录");}

执行结果:生成的 SQL 都是预编译的 SQL 语句(性能高、安全)

在这里插入图片描述

http://www.xdnf.cn/news/12261.html

相关文章:

  • 微服务架构——配置管理与配置中心
  • 【Java】RxJava解析
  • 麒麟信安系统下修改系统默认记录日志大小
  • 上传、下载功能 巧实现
  • 如何修改项目在浏览器中的小图标
  • 【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)
  • 轨道交通可视化,赋能智慧车站运维
  • C++034(一维数组)
  • 基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境
  • LoRA:大模型高效微调的低秩之道——原理解析与技术实现
  • 检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线
  • 力扣面试150题--被围绕的区域
  • std__map,std__unordered_map,protobuf__map之间的性能比较
  • 网页显示:嗯…无法访问此页面,的解决办法和原理
  • 大模型学习
  • 家政维修平台实战14登录验证
  • 如何用 SD-WAN 打破 ERP 内网限制,实现随时随地高效访问?
  • 总结HTML中的文本标签
  • 危化工厂部署人员定位系统的重要性
  • 算法性能分析
  • 智慧赋能:移动充电桩的能源供给革命与便捷服务升级
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(九)
  • Linux 下生成动态库时 -fPIC的作用详解
  • 一些常用的JavaScript简写技巧
  • 如何利用Facebook优化TikTok的跨境商品推广效果
  • STM32 NVIC中断控制器
  • 【Algorithm】Union-Find简单介绍
  • 【Docker管理工具】部署Docker可视化管理面板Dpanel
  • [Java 基础]数组
  • 8086的简化版8088