【MyBatis】基础操作

news2024/11/16 4:54:24

准备工作

  1. 准备数据库表
  2. 创建 springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
  3. application.properties中引入数据库连接信息
  4. 创建对应的实体类 Emp(实体类属性采用驼峰命名)
  5. 准备Mapper接口 EmpMapper

删除

@Mapper
public interface EmpMapper {

    /**
     * 根据id删除数据
     * @param id    用户id
     */
    @Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值
    public void delete(Integer id);
    
}

如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。但是建议保持名字一致。

日志输出

可以选择 mybatis 输入日志位置,默认不输出。

#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

预编译sql

输出的SQL语句:delete from emp where id = ?,我们输入的参数16并没有在后面拼接,id的值是使用?进行占位。那这种SQL语句我们称为预编译SQL。

性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译。(只是输入的参数不同)

更安全(防止SQL注入):将敏感字进行转义,保障SQL的安全性。

参数占位符

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

  • #{…}

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

    • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题
    • 使用时机:如果对表名、列表进行动态设置时使用

注意事项:在项目开发中,建议使用#{…},生成预编译SQL,防止SQL注入安全。

新增

@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);

}

说明:#{…} 里面写的名称是对象的属性名

主键返回

默认情况下是不返回的主键的,可以使用 @Options 实现:

@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);

}

更新

@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);
    
}

查询

@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);
}

而在测试的过程中,我们会发现有几个字段(deptId、createTime、updateTime)是没有数据值的

原因如下:

  • 实体类属性名和数据库表查询返回的字段名一致,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会自动通过驼峰命名规则映射

驼峰命名规则: abc_xyz => abcXyz

  • 表中字段名:abc_xyz
  • 类中属性名:abcXyz
# 在application.properties中添加:
mybatis.configuration.map-underscore-to-camel-case=true

要使用驼峰命名前提是 实体类的属性 与 数据库表中的字段名严格遵守驼峰命名。

条件查询

方式一

@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(‘%’ , ‘关键字’ , ‘%’)
@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/1956539.html

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

相关文章

排序系列 之 希尔排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort&#xff0c;又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组&#xff0c;然后按照每组使用直接插入排序&#…

idea一直update indexing 卡死

打开IDEA存储应用程序的本地数据文件夹&#xff0c;关闭IDEA&#xff0c;删除caches和index文件夹下的文件&#xff0c;重新打开。

数据加密技术在数据安全中起到什么样的作用?

把数据以及一个密钥&#xff0c;通过相关的加密算法&#xff0c;进行一系列的加密算法计算处理&#xff0c;使这个数据变成密文&#xff0c;保护数据的机密性。数据加密技术是一种将原始数据&#xff08;明文&#xff09;通过算法转换成只有授权用户才能解读的格式&#xff08;…

C++客户端Qt开发——系统相关(多媒体音频)

3.多媒体&#xff08;音频、视频&#xff09; 播放声音需要引入multimedia模块 使用QSound类 仅支持的音频文件格式为.wav&#xff0c;同样使用qrc文件管理外部的资源 &#xff08;使用的.wav文件不宜过大&#xff0c;尽量在几秒内&#xff0c;否则会构建时间过长&#xff…

拓维思树障分析Tovos PowerLine 4.0.19 航线规划Tovos SmartPlan 2.0.0 下载License电力应用软件使用

Tovos PowerLine 是功能强大的输电线路智能巡检系统&#xff01;这是一个专业且智能的软件&#xff0c;能够更准确的进行巡检和对线路设备进行精确的测量&#xff0c;通过获取高精度的点云来获取精准的三维路线的地形地貌、设备设施、途径的各种物体等来精确您的三维空间信息和…

三子棋小程序

一.自定义头文件(game.h) 放入源文件需要用到的标准库头文件和函数的声明 ROW 和COL为棋盘的行和列&#xff0c;三子棋嘛&#xff0c;肯定为3啦 #pragma once #include<stdio.h> #include<String.h> #include<stdlib.h> #include<time.h> #define ROW…

中国少女徐可昕心怀爱豆梦 为实现梦想勇赴韩国

如今MZ世代(MZ世代是‌Millennial世代和‌Z世代的合成词,用来描述1980至2000年间出生的人)小伙伴们追求着怎样的梦想呢?随着韩国K-POP热潮和娱乐产业的发展,越来越多的年轻人希望可以在娱乐圈工作,例如成为爱豆或经理人。通过抖音或YouTube等,可以发现很多才华横溢的年轻人创作…

malloc 对比验证 posix_memalign 的功能

1&#xff0c;函数说明 posix_memalign 是一个 POSIX 标准定义的函数&#xff0c;用于在内存中分配对齐的内存块。这个函数可以确保分配的内存块满足特定的对齐要求&#xff0c;通常用于需要对齐内存访问的情况&#xff0c;比如 SIMD 指令集的使用或者特定硬件要求的内存对齐。…

瑞派明星医生:技术深耕教学指导,燃动当代名校兽医双效技能Buff

名校精进&#xff0c;攻破技术堡垒 从动物保护、环境保护的最初理想&#xff0c;到兽医学专业领域深耕&#xff0c;天津瑞派长江宠物医院的唐玉洁医生正用自己的实际行动展现着当代兽医人才背后的奉献、良知、超越与传承。 享受了东北林业大学带来的短暂而有趣的大学生活&…

聊聊RNN与Attention

前言 Attention Mechanism&#xff0c;称为注意力机制。基于Attention机制&#xff0c;seq2seq可以像我们人类一样&#xff0c;将“注意力”集中在必要的信息上。 Attention的结构 seq2seq存在的问题 seq2seq中使用编码器对时序数据进行编码&#xff0c;然后将编码信息传递…

JS:JavaScript 简介

前言 在当今数字时代&#xff0c;JavaScript已然成为了现代Web开发的基石。从最初作为浏览器中的一个小型脚本语言&#xff0c;到如今成为驱动全球互联网的强大引擎&#xff0c;JavaScript的发展历程本身就是一个令人着迷的故事。 好了开始学习JS吧 1. 如果刚开始了解js&#…

Node.js自动化处理TOML文件

在软件开发过程中&#xff0c;自动化处理配置文件是一种常见的需求。TOML&#xff08;Tom’s Obvious, Minimal Language&#xff09;是一种用于配置文件的简单易读的格式。本文将展示如何使用Node.js和一些流行的库来自动化读取、修改并写入TOML文件。 1. 准备工作 在开始之前…

IAR工程设置

这篇记录一下工作中对IARide的工程设置的配置步骤。 所以这不是一篇通用的文章&#xff0c;只是个人记录。 目的&#xff1a;为了是ARM仿真器能够下载调试锐能微的芯片 一、工程设置 1、更改boot文件的工程设置&#xff1a; 2、编译boot文件 3、配置8213B的工程设置&#x…

iPhone 16 Pro Max电池大揭秘,听说迎来了有史以来最持久的续航

智能手机市场的竞争日益激烈&#xff0c;各大厂商都在寻求创新以保持领先地位。而苹果公司即将推出的iPhone 16 Pro Max&#xff0c;则以其革命性的不锈钢电池壳和电诱导粘合剂脱离技术&#xff0c;再次刷新了我们对智能手机电池技术的认知。 一、不锈钢电池壳的突破 苹果公司…

Windows系统编程API 学习之路

目录 I. 基础 进程 动态链接库 线程 Windows应用程序开发 初入Windows编程 使用strings C/C运行时中的字符串 安全字符串函数 32位与64位开发 定义自定义错误代码 I. 基础 Windows NT操作系统系列有着悠久的历史&#xff0c;从1993年推出的3.1版本开始。今天的Windo…

如何主持收集故事研讨会

如何主持收集故事研讨会 引言 在文化的长河中,故事是传承知识、情感与智慧的桥梁。收集故事不仅是对过去的回顾,更是对未来灵感的启迪。组织一场收集故事研讨会,旨在汇聚各界人士,共同挖掘、整理并分享那些触动人心、富有意义的故事。作为这样一场活动的主持人,您的角色…

C++开源界面库duilib的使用细节与实战技巧总结(实战经验分享)

目录 1、使用CEditUI编辑框 2、使用CLabelUI或CTextUI的Html文本效果 3、使用CTextUI控件对文字宽度自适应的特性 4、CRichEditUI富文本控件使用注意点 4.1、指定CRichEditUI加在2.0版本的Riched20.dll库 4.2、解决向CRichEditUI中插入文字后显示空白的问题 5、设置窗口…

拓扑排序+dp(消除主观臆断)

这题一开始写错的原因就是搞错了&#xff0c;处于西边的节点的编号不一定小&#xff0c;不能直接dp&#xff0c;要先进行拓扑排序 写到一般我才发现&#xff0c;其实可以一边dp&#xff0c;一边进行dp #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using name…

信息安全工程师下午题

试题一(共 20 分) 阅读下列说明和图&#xff0c;回答问题 1 至问题 5&#xff0c;将解答填入答题纸的对应栏内。【说明】已知某公司网络环境结构主要由三个部分组成&#xff0c;分别是 DMZ 区、内网办公区和生产区&#xff0c;其拓扑结构如图 1-1 所示。信息安全部的王工正在按…

无人机像素经纬度识别

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…