MyBatis-基础操作-CRDU

前端页面展示提供对于数据的删除操作,后端为其实现

根据id删除数据(D)

  • 具体的SQL语句
    • delete from emp where id =17;
  •  接口方法
    •     @Delete("delete from emp where id =#{id} ")public int DeleteByID(Integer id);
  •  测试方法
    •     @Testpublic void testDelete() {int delete = empMapper.DeleteByID(17);System.out.println(delete);}

新增员工数据(C)

  •  具体的SQL语句
    • insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
      VALUES ('法老爷爷', '孙权', 1, '1.jpg', 1, '2021-06-13', 1, now(), now());
  • 接口方法

    •     @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);
    • 在Insert()方法中,传入参数enp,则在上述的SQL语句中使用#{}占位符,在占位符中填写emp对象中成员变量的名称,就可完成对应数据的传递

  • 测试方法

    •     @Testpublic void testInsert() {// 设置要插入的员工信息Emp emp = new Emp();emp.setUsername("法老爷爷");emp.setName("孙权");emp.setImage("1.jpg");emp.setGender((short) 1);emp.setJob((short) 1);emp.setEntrydate(LocalDate.of(2021, 12, 23));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);empMapper.Insert(emp);}
  • 主键返回

    • 描述:在数据添加成功后,需要获取插入数据库数据的主键

    • 实现:在接口中加入对应的注解,然后在测试的方法中获取主键值所在的对应的属性即可

      •     @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);
      • 该注解是用于与 MyBatis 框架集成的 Java 对象映射(ORM)中的一个配置。它的含义如下:

      • @Options: 这是一个 MyBatis 注解,用于指定一些选项配置。
      • useGeneratedKeys = true: 该选项指示 MyBatis 是否应该使用数据库生成的键来填充对象的属性。当插入一条记录时,如果数据库自动生成了一个主键值,设置为 true 将使 MyBatis 将该值赋给相应对象的 id 属性。
      • 总结起来,这个注解表示在执行插入操作时,使用数据库生成的键来填充对象的 id 属性。

      • keyProperty = "id": 该选项指定了用于保存生成的键值的对象属性名。在这个例子中,生成的键值将被赋给对象的 id 属性。
    • 测试方法
      •     @Testpublic void testInsert() {// 设置要插入的员工信息Emp emp = new Emp();emp.setUsername("法老20");emp.setName("孙权");emp.setImage("1.jpg");emp.setGender((short) 1);emp.setJob((short) 1);emp.setEntrydate(LocalDate.of(2021, 12, 23));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);empMapper.Insert(emp);System.out.println(emp.getId());}
      • 运行结果如下

更新员工信息 (U)

根据主键修改员工信息

  • SQL语句
    • -- todo 根据主键修改员工信息
      update emp
      set username   = '',name='',gender='',image='',job='',entrydate='',dept_id='',update_time=''
      where id = 1;
  • 接口方法

    •     @Update("update emp\n" +"set username   = #{username},\n" +"    name=#{name},\n" +"    gender=#{gender},\n" +"    image=#{image},\n" +"    job=#{job},\n" +"    entrydate=#{entrydate},\n" +"    dept_id=#{deptId},\n" +"    update_time=#{updateTime}\n" +"where id = #{id};")public void Update(Emp emp);
  • 测试方法

    •     @Testpublic void testUpdate() {Emp emp = new Emp();emp.setId(18);emp.setUsername("TOM");emp.setName("汤姆");emp.setGender((short) 1);emp.setImage("1.jpg");emp.setJob((short) 1);emp.setEntrydate(LocalDate.of(2000, 1, 25));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);empMapper.Update(emp);}

查询员工信息(R)

 根据id查询

  • SQL语句
    • select id,username,password,name,gender,image,job,entrydate,dept_id,create_time,update_time
      from emp
      where id = 5;
  • 接口方法

    •     @Select("select id,\n" +"       username,\n" +"       password,\n" +"       name,\n" +"       gender,\n" +"       image,\n" +"       job,\n" +"       entrydate,\n" +"       dept_id,\n" +"       create_time,\n" +"       update_time\n" +"from emp\n" +"where id = #{id};")public Emp SelectByID(Integer id);
  • 测试方法

    •     @Testpublic void testSelectByID() {Emp emp = empMapper.SelectByID(5);System.out.println(emp);}
      
  • 运行结果

    • 在上述的运行结果中,最后有三个数据为null,但是在数据库中,这三个数据都是有值的,该问题的解决下面会提及
  • MyBatis数据封装
    • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
    • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
      • 解决方案
        • 方案1:给字段起别名,让别名与实体类中属性名一致
        •     @Select("select id,\n" +"       username,\n" +"       password,\n" +"       name,\n" +"       gender,\n" +"       image,\n" +"       job,\n" +"       entrydate,\n" +"       dept_id     as deptId,\n" +"       create_time as createTime,\n" +"       update_time as updateTime\n" +"from emp\n" +"where id = #{id};")public Emp SelectByID(Integer id);
        • 方案2:如果@Results,@Result注解手动映射封装

        •     @Results({// column为字段名,property为对象的属性名@Result(column = "dept_id", property = "deptId"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")})@Select("select id,\n" +"       username,\n" +"       password,\n" +"       name,\n" +"       gender,\n" +"       image,\n" +"       job,\n" +"       entrydate,\n" +"       dept_id     ,\n" +"       create_time ,\n" +"       update_time \n" +"from emp\n" +"where id = #{id};")public Emp SelectByID(Integer id);
        • 运行结果

        • 常用方法:开启MyBatis驼峰命名自动映射开关

        • 使用该方法必须严格遵守数据库中字段名为a_column,对象中的属性名为aColumn,才可以自动完成映射
          • 即自动将a_column字段名封装到aColumn属性名中

          • 在配置文件中进行配置

          • #数据库连接驱动
            spring.datasourde.driver-class-name=com.mysql.cj.jdbc.Driver
            # 数据库连接url
            spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
            # 数据库用户名
            spring.datasource.username=root
            # 数据库用户名密码
            spring.datasource.password=123456
            # 配置MyBatis日志,指定输出到控制台
            mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
            # 开启MyBatis的驼峰命名自动映射开关 a_column-->aColumn
            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 = 1and entrydate between '2010-01-01' and '2020-01-01'
      order by update_time desc;
  • 接口方法

    •     @Select("select id,\n" +"       username,\n" +"       password,\n" +"       name,\n" +"       gender,\n" +"       image,\n" +"       job,\n" +"       entrydate,\n" +"       dept_id,\n" +"       create_time,\n" +"       update_time\n" +"from emp\n" +"where name like '%${name}%'\n" +"  and gender = #{gender}\n" +"  and entrydate between #{begin} and #{end}\n" +"order by update_time desc;")public List<Emp> List(String name, short gender, LocalDate begin, LocalDate end);
    • 测试方法

      •     @Testpublic void TestList() {List<Emp> list = empMapper.List("张", (short) 1, LocalDate.of(2010, 01, 01), LocalDate.of(2020, 01, 01));System.out.println(list);}
    • 运行结果

在上述的接口方法中,对于名字name的查询条件是模糊查询,使用的是${}占位符,#{}和${}的区别具体参见文章:详细分析一下 #{}和${}的区别是什么_黄泥川水猴子的博客-CSDN博客

但使用上述${}占位符存在性能低、不安全、存在SQL注入问题,解决办法如下

使用MySQL中concat函数(字符串拼接函数)进行解决

示例代码

select concat('hello','MySQL')

运行结果为:

上述示例中接口方法代码改造如下:

 运行结果如下

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

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

相关文章

【项目设计】MySQL 连接池的设计

目录 &#x1f449;关键技术点&#x1f448;&#x1f449;项目背景&#x1f448;&#x1f449;连接池功能点介绍&#x1f448;&#x1f449;MySQL Server 参数介绍&#x1f448;&#x1f449;功能实现设计&#x1f448;&#x1f449;开发平台选型&#x1f448;&#x1f449;MyS…

【力扣】 12. 整数转罗马数字 模拟

力扣 12. 整数转罗马数字 解题思路 当某个位数的某个数不为4或9时&#xff0c;高位对应的字符总是在低位对应的字符前面。只有当该数为4或9时&#xff0c;低位对应的字符在高位前面。 根据这一特性&#xff0c;我们进行分类讨论。 1.当数为4时&#xff0c;则对应的罗马数为 10 …

怎么把图片变成表格?几个步骤轻松转换

如果您需要将一张图片中的数据转换成表格&#xff0c;这里有几个简单的步骤&#xff0c;可以帮助您完成这个转换过程。以下是需要注意的事项。 首先&#xff0c;我们先了解OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。然后合理运用…

【练】要求定义一个全局变量 char buf[] = “1234567“,创建两个线程,不考虑退出条件,打印buf

要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件&#xff0c;另&#xff1a; A线程循环打印buf字符串&#xff0c;B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321. 不…

C++内存管理

C语言内存管理方式在C中可以继续使用&#xff0c;但是存在一定的缺陷&#xff0c;如使用malloc动态开辟自定义类型对象的空间&#xff0c;无法自动调用构造函数&#xff0c;那就必须我们去显示的调用构造函数&#xff08;一般情况下&#xff0c;构造函数不可以显示调用&#xf…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

详细画的jvm模型图 https://www.processon.com/diagraming/64c8aa11c07d99075d934311 官方网址 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 相关概念 年轻代是所有新对象被分配和老化的地方。当年轻代填满时&#xff0c;这会导致m…

活动目录密码更改

定期更改密码是一种健康的习惯&#xff0c;因为它有助于阻止使用被盗凭据的网络攻击&#xff0c;安全专家建议管理员应确保用户使用有效的密码过期策略更改其密码。 管理员可以通过电子邮件通知用户在密码即将过期时更改其密码&#xff0c;但在许多组织中&#xff0c;用户只能…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

应用层协议——https

文章目录 1. HTTPS 是什么2. 什么是"加密"3. 常见的加密方式4. 数据摘要 && 数字签名5. HTTPS 的工作过程探究5.1 方案1 - 只使用对称加密5.2 方案2 - 只使用非对称加密5.3 方案3 - 双方都使用非对称加密5.4 方案4 - 非对称加密 对称加密5.5 中间人攻击5.6 …

Mac提示文件:已损坏,无法打开。你应该把它移到废纸篓

文章目录 一、电脑信息二、打开任何来源设置三、更改应用程序拓展属性 一、电脑信息 我的是新版的Venture 13的系统。UI改的比较多。与之前的配置还是有很大的区别的。 打开下载的软件&#xff0c;显示已经损坏&#xff0c;打不开。抛开软件本身的问题外&#xff0c;一般是Ma…

【数据结构与算法】TypeScript 实现图结构

class Grapg<T> {// 用于存储所有的顶点verteces: T[] [];// 用于存储所有的边 采用邻接表的形式adjList: Map<T, T[]> new Map();// 添加顶点addVertex(v: T) {this.verteces.push(v);// 初始化顶点的邻接表this.adjList.set(v, []);}// 添加边addEdge(v: T, w:…

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;68&#xff09;-- 算法导论6.5 7题 七、试说明如何使用优先队列来实现一个先进先出队列&#xff0c;以及如何使用优先队列来实现栈(队列和栈的定义见 10.1 节。) 文心一言&#xff1a; 优先队列是一种数据结构&#xff0c;其中…

无人机机巢有哪些,无人机机场/机场的主要分类

随着无人机技术的飞速发展&#xff0c;无人机已经渗透到了物流、农业、救援、公共安全等多个领域。而为了使这些无人机能更加高效、灵活地运行&#xff0c;一个新的概念应运而生&#xff0c;那就是无人机机巢&#xff08;UAV Nest&#xff09;。复亚智能无人机机巢是一种供无人…

GitLab备份升级

数据备份(默认的备份目录在/var/opt/gitlab/backups/下&#xff0c;生成一个以时间节点命名的tar包。) gitlab-rake gitlab:backup:create新建repo源&#xff0c;升级新版本的gitlab vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.…

【大数据】-- docker 启动 mysql 5.7,开启 binlog

1.说明 mysql binlog&#xff1a;二进制日志文件。它有两个作用&#xff0c;一是增量备份&#xff0c;即只备份新增的内容&#xff0c;可以用于恢复数据&#xff1b;二是用于主从复制等&#xff0c;即主节点维护了一个binlog日志文件&#xff0c;从节点从binlog中同步数据。 …

嵌入式pc技术的特点有哪些?

嵌入式PC技术是将计算机硬件和软件嵌入到各种设备中的一种技术&#xff0c;它具有低功耗、高效率、小型化、易于集成等优点&#xff0c;广泛应用于工业自动化、医疗设备、电力、通信、家用电器、物联网等领域&#xff0c;成为新时代工业生产和社会生活必不可少的技术之一。 嵌入…

使用idea实现git操作大全(在项目开发中遇到的实际情况

使用idea实现git操作大全&#xff08;在项目开发中遇到的实际情况&#xff09; 1.安装git插件2.在开发中切记拉一个自己的分支 1.安装git插件 2.在开发中切记拉一个自己的分支 选中需要拉的分支&#xff0c;右键该分支&#xff0c;选中new breach from “分支”&#xff0c;点…

接口测试如何在json中引用mock变量

在测试接口的时候&#xff0c;有的接口需要测试随机传入大量数据&#xff0c;查看数据库是否正常&#xff0c;但是大量的随机数据全靠自己手写会很慢&#xff0c;而且是通过json传递的数据。 这里我们就可以使用mock生成随机变量&#xff0c;然后在json中引用mock变量 首先看…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…