MyBatis-基础操作-CRDU

news2024/9/25 7:23:47

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

根据id删除数据(D)

  • 具体的SQL语句
    • delete from emp where id =17;
  •  接口方法
    •     @Delete("delete from emp where id =#{id} ")
          public int DeleteByID(Integer id);
  •  测试方法
    •     @Test
          public 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对象中成员变量的名称,就可完成对应数据的传递

  • 测试方法

    •     @Test
          public 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 属性。
    • 测试方法
      •     @Test
            public 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);
  • 测试方法

    •     @Test
          public 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);
  • 测试方法

    •     @Test
          public 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 = 1
        and 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);
    • 测试方法

      •     @Test
            public 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.coloradmin.cn/o/833217.html

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

相关文章

数据结构--线性表2-2

目录 一、线性表例题&#xff1a; 二、分配动态内存&#xff1a; 1.动态创建一个空顺序表的算法&#xff1a; 2.动态顺序表的插入算法&#xff1a; 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1&#xff1a;创建链表并插入26个字母 例题2&#xff1a;在链表中取…

伺服电机的三种控制方式与三闭环控制

&#xff08;项目&#xff09;FPGA双电机主从快速稳定控制实现 第一章 伺服电机的三种控制方式与三闭环控制 伺服电机的三种控制方式与三闭环控制 &#xff08;项目&#xff09;FPGA双电机主从快速稳定控制实现前言一、电机控制方式二、电机三个闭环负反馈PID控制系统三、三闭…

LeetCode513. 找树左下角的值

513. 找树左下角的值 文章目录 [513. 找树左下角的值](https://leetcode.cn/problems/find-bottom-left-tree-value/)一、题目二、题解方法一&#xff1a;递归法&#xff08;层序遍历&#xff0c;深度优先搜索&#xff09;**不足之处以及如何改进** 方法二&#xff1a;迭代 一、…

2023年08月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

三、文件与路径

1、隐藏文件与非隐藏文件 1.1、概念 (1)隐藏文件默认情况下看不到&#xff0c;需要进行相应设置才能看到。非隐藏文件默认情况下就能看到 1.2、Windows中的文件 (1)非隐藏文件设置为隐藏文件。选中文件&#xff0c;鼠标右键→属性&#xff0c;勾选隐藏。 (2)产看隐藏文件。…

资产盘点设备包括哪些

根据资产管理系统的卡账表和计算机设备管理系统的验证&#xff0c;固定资产的账卡完成一致&#xff1b;根据上级领导机构发布的资产盘点标示&#xff0c;固定资产。低价值易耗品进行标签贴绑&#xff0c;完成帐实一致&#xff0c;真实反映本行固定资产实物情况。   RFID固定…

RocketMQ 事务消息

事务消息是 RocketMQ 的高级特性之一 。这篇文章&#xff0c;笔者会从应用场景、功能原理、实战例子三个模块慢慢为你揭开事务消息的神秘面纱。 1 应用场景 举一个电商场景的例子&#xff1a;用户购物车结算时&#xff0c;系统会创建支付订单。 用户支付成功后支付订单的状态…

论测试猿如何优雅的甩锅

测试猿&#xff0c;经常被江湖人戏称为“背锅侠”。 这个称呼是怎么来的呢&#xff1f;我们来追溯一下根源。 当产品上线后&#xff0c;有 bug&#xff1a; “测试为什么没有测试发现这个问题&#xff1f;肯定是测试的责任&#xff01;” 当产品上线后&#xff0c;用户反馈…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、报错信息三、总结 一、报错信息 这里&#xff0c;nginx给出以下错误信息&#xff1a; Windows&#xff1a;nginx: [error] CreateFile() “/logs/nginx.pid“ failed (2: The system&#xff09; 经分析&#xff0c;造成上述错误的本…

小研究 - 领域驱动设计DDD在IT企业内部网站开发中的运用(一)

在企业内部网站的建设过程中&#xff0c;网站后端最初采用传统的表模式的开发方式。这种方式极易导致站点的核心业务逻辑和业务规则分布在架构的各个层和对象中&#xff0c;这使得系统业务逻辑的复用性不高。为了解决这个问题&#xff0c;作者在后期的开发过程中引入了领域驱动…

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V&#xff1f;怎么计算的&#xff1f;5.输出的误差和输出电流&#x1f446;&#xff08;右下角图像&#xff09;6.LDO一般会有个引脚是做补偿之用&#xff0c;datasheet会说明一个器件的…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…

2023华数杯数学建模竞赛选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;隔热材料的结构优化控制研究 A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。 其中第一问需要建立平纹织物整体热导率与单根纤…

知识区博主转型——兼做知识区和改造区博主!!!!!

想脱单的进来&#xff0c;一起交流如何能脱单&#xff01;&#xff01;&#xff01; 为什么——我太羡慕有对象的人了哭死&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 你是不是很羡慕别人怎么都有女朋友 别人家的女朋友怎么都那么好&#xff…

用户权限管理是保证企业图文档安全最有效的策略

企业拥有大量的图文档数据&#xff0c;涉及多个部门和员工&#xff0c;因此需要建立有效的用户权限管理策略&#xff0c;以保护图文档的安全。智橙平台将在线图文档管理与BOM系统的融合应用为企业提供了强大的权限管理功能&#xff0c;能够确保只有授权用户能够访问和编辑特定的…

【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基础介绍应用场景登场角色 案例实现案例一实现 案例二实现 迭代器模式在JDK源码中的应用总结文章说明 案例引入 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一…

小白如何获取CNVD事件型原创漏洞证明?——记CNVD漏洞挖掘思路

引子: 相信许多人都想要被别人叫做大佬&#xff0c;漏洞挖掘当中肯定也不例外,所以在此之前让我们康康度娘对大佬的定义:形容一个人很巨表示对其顶礼膜拜的态度。在这种情况下&#xff0c; 国家信息安全漏洞共享平台(CNVD) 则为我们提供了一个成为大佬的平台, CNVD作为国内最具…

【javaSE】 实现图书管理系统

目录 整体思路 Book包 Book类 BookList类 user包 User类 NormalUser类 AdminUser管理员类 testmain包 opera包 IOPeration接口 普通用户 ExitOperation类 FindOperation类 BrrowOperation类 ReturnOperation类 管理员 AddOperation类 DelOperation类 ShowOp…

小白科普-通信网中核心网、城域网、接入网

通信网络的一个整体结构&#xff0c;大致包括&#xff1a;骨干网、核心网、城域网、接入网&#xff0c;其中接入网又分为无线接入和有线接入&#xff0c;以及承载网。 听起来很复杂&#xff0c;我们再分解来看看。 从最靠近用户端开始的是接入网。接入网&#xff0c;简单点来…

迁移学习(新人必看)

先说一下深度学习常见的问题&#xff1a; 1.数据集不够&#xff0c;通常用数据增强解决。 2.参数难以确定&#xff0c;训练时间长&#xff0c;这就需要用迁移学习来解决 什么叫迁移学习呢&#xff1a;比方说有一个对100w的自行车数据集&#xff0c;并用VGG模型训练好的网络&…