【Spring Boot】使用MyBatis注解实现数据库操作

news2024/11/20 6:20:42

使用MyBatis注解实现数据库操作

MyBatis还提供了注解的方式,相比XML的方式,注解的方式更加简单方便,无须创建XML配置文件。接下来好好研究注解的使用方式。

1.XML和注解的异同

1)注解模式使用简单,开发效率高,但是维护麻烦,修改SQL需要重新编译打包。

2)XML模式便于维护,SQL和代码分开,代码清晰易懂,而使用注解模式需要在方法前加各种注解和SQL语句,使得代码的可读性不强。

3)XML模式虽然提供了完善的标签来实现复杂的SQL语句,但是没有在Java代码中直接判断拼接那样简单方便。

4)XML模式因为SQL是配置在XML文件中的,某些特殊字符需要转义,所以使用起来比较麻烦,容易出错。

2.使用MyBatis注解实现数据查询

MyBatis注解模式的最大特点是取消了Mapper的XML配置,通过@Insert、、@Update、@Select、@Delete等注解将SQL语句定义在Mapper接口方法中或SQLProvider的方法中,从而省去了XML配置文件。这些注解和参数的使用与mapper.xml配置文件基本一致。下面就来演示使用MyBatis注解实现数据查询。

2.1 修改配置文件

首先创建Spring Boot项目,集成MyBatis的过程与XML配置方式一样。

使用注解方式只需要在application.properties中指明实体类的包路径,其他保持不变,配置示例如下:

#mapper.xml mapper接口的包路径
MyBatis.type-aliases-package=com.example.ysxq

#数据库连接
spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

在上面的示例中,配置了mapper接口的包路径和数据源,无须配置mapper.xml文件的路径。

2.2 添加mapper接口

使用MyBatis提供的SQL语句注解无须再创建mapper.xml映射文件,创建mapper接口类,然后添加相关的方法即可:

public interface StudentMapper {
    @Select("select * from student")
    List<Student> selectAll();
}

在上面的示例中,使用@Select注解定义SQL查询语句即可实现查询所有学生列表的功能,无须再定义mapper.xml映射文件。

2.3 验证测试

增加单元测试方法,验证是否生效。示例代码如下:

@Test
    public void testSelectAll() {
        // 查询
        List<Student> students = studentMapper.selectAll();
        for (Student stu : students) {
            System.out.println("name:"+stu.getName()+", age:"+stu.getAge());
        }
    }

单击Run Test或在方法上右击,选择Run ‘testSelectAll’,查看单元测试结果,运行结果如图所示。

在这里插入图片描述
结果表明单元测试方法testSelectAll运行成功,并输出了相应的查询结果。这说明使用注解成功实现了查询全部学生信息的功能。

3.参数传递

相信很多人会有疑问:MyBatis是如何将参数传递到SQL中的,有哪几种传参方式?下面就来一一介绍MyBatis注解的传参方式。

3.1 直接传参

对于简单的参数,可以直接使用#{id}的方式接收同名的变量参数。示例代码如下:

@Select("SELECT * FROM student where id=#{id,jdbcType=VARCHAR}")
Student selectOne(Long id);

在上面的示例中,使用#{id}传入变量参数,支持传入多个参数。只是需要注意,使用#{}方式定义的参数名必须和方法中的参数名保持一致。

3.2 使用@Param注解

@Param注解的作用是给参数命名,参数命名后就能根据名字匹配到参数值,正确地将参数传入SQL语句中。比如,注解是@Param(“person”),那么参数就会被命名为#{person}。示例代码如下:

@Select("select * from student where name=#{name} and sex=#{sex}")
Student selectByNameAndSex(@Param("name") String name, @Param("sex") Integer sex);

如果方法有多个参数,也可以不自定义param,MyBatis在方法的参数上就能为它们取自定义的名字,参数先以"param"作为前缀,再加上它们的参数位置作为参数别名,比如#{param1}、#{param2}。

// 默认使用param +参数序号或者0、1,值就是参数的值
@Select("select * from student where name=#{param1} and sex=#{param2}")
Student selectByNameAndSex(String name, Integer sex);

如果不想给每个参数命名,可以使用param参数,默认格式为param+参数序号或者0、1,值就是参数的值。

3.3 映射传值

需要传送多个参数时,也可以考虑使用映射(Map)的形式。

@Select("select * from student where name=#{name} and sex=#{sex}")
Student selectByNameAndSex(Map<String, Object> map);

在上面的示例中,将SQL语句需要的参数通过map类型传入,key为参数名,value为参数值。MyBatis会自动匹配对应的映射中的参数值。

调用时将参数依次加入映射中即可:

@Map param= new HashMap();
param.put("name", "ysxq");
param.put("sex", 1);
Student student = studentMapper.selectByNameAndSex(param);

3.4 使用pojo对象

使用pojo对象传参是比较常用的传参方式,像前面介绍的insert、update等方法,都是直接传入user对象。

@Update({
     "update student",
     "set name = #{name,jdbcType=VARCHAR},",
     "age = #{age,jdbcType=INTEGER},",
     "sex = #{sex,jdbcType=INTEGER}",
     "where id =#{id,jdbcType=VARCHAR}"
})
void update(Student record);

对于insert、update等参数较多的方法,可以使用pojo对象传参。需要注意的是,参数的名字和类型必须和pojo对象的属性保持一致。

上面讲述了MyBatis传参的4种方式,使用时根据方法的参数来选择合适的传值方式即可。

4.结果映射

MyBatis会自动将查询结果集转换为需要返回的数据类型,但是有些特殊的场景需要处理,比如查询的返回结果与期望的数据格式不一致时,应该怎么处理呢?

这就需要使用@Results和@Result注解。这两个注解可以将数据库中查询到的数值转化为具体的属性或类型,修饰返回的结果集,比如查询的对象返回值属性名和字段名不一致,或者对象的属性中使用了枚举等。

    @Select({
            "select",
            "id, name as student_name,age, sex as student_sex",
            "from student",
            "where id = #{id,jdbcType=VARCHAR}"
    })
    @Results({
            @Result(column="id",property="id",jdbcType= JdbcType.VARCHAR,id=true),
            @Result(column="student_name",property="name",jdbcType=JdbcType.VARCHAR),
            @Result(column="student_sex",property="sex",jdbcType=JdbcType.TIMESTAMP)
    })
    Student selectById(Long id);

在上面的例子中,查询结果集的student_name字段和实体类Student定义的name属性的名称不一致,所以需要Result进行转换;而age名称是一致的,所以不需要Result进行转换。

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

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

相关文章

Vue3响应式源码实现

Vue3响应式源码实现 初始化项目结构 vue-proxy ├── effect.js ├── effect.ts ├── index.html ├── index.js ├── package.json ├── reactive.js ├── reactive.ts └── webpack.config.jsreactive.ts import { track, trigger } from "./effect&q…

文心一言api接入如何在你的项目里使用文心一言

文心一言api接入在项目里接入文心一言 一、百度文心一言API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API 基于百度文心一言语言大模型的智能文本对话AI机器人…

DDR2 IP核调式记录2

本文相对简单&#xff0c;只供自己看看就行。从其它的博客找了个代码&#xff0c;然后记录下仿真波形。 1. 功能 直接使用quartus生成的DDR2 IP核&#xff0c;然后实现循环 -->写入burst长度的数据后读出。 代码数据的传输是32位&#xff0c;实际使用了两片IC。因此IP核也是…

npm版本升级报错

解决方法&#xff1a; 执行npm install --legacy-peer-deps依赖对等 npm install xxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装&#xff1b;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题&#xff0c;以npm v4-v6的方式去继续执行…

OC和Swift混编,导入头文件‘xxx-Swift.h‘ file not found

在OC的项目里加入Swift代码&#xff0c;创建完桥接文件后&#xff0c;需要倒入Swift头文件&#xff0c;头文件的格式为“项目名-Swift.h”。 如下图&#xff0c;我在Xcode上看到我的项目名为YichangPark&#xff0c;导入 #import "YiChangPark-Swift.h" 之后提示 “Y…

手写Mybatis:第15章-返回Insert操作自增索引值

文章目录 一、目标&#xff1a;Insert自增索引值二、设计&#xff1a;Insert自增索引值三、实现&#xff1a;Insert自增索引值3.1 工程结构3.2 Insert自增索引值类图3.3 修改执行器3.3.1 修改执行器接口3.3.2 抽象执行器基类 3.4 键值生成器3.4.1 键值生成器接口3.4.2 不用键值…

使用vs播放.wav文件

本次操作在Windows10平台vs2019完成。 一、准备好.wav资源文件 上网找到自己想要播放的音乐文件&#xff0c;下载到本地后建议放到项目所在文件夹中。 二、添加资源文件 在“解决方案”中右键“资源文件”&#xff0c;点击“添加”&#xff0c;点击“资源”&#xff0c; 选…

【AGC】App Linking首次不能重定向指定页面的问题

【关键字】 AGC、App Linking、重定向 【问题描述】 有开发者反馈app linking未安装应用时&#xff0c;自定义地址可以重定向到apk应用内的任意页面会出现问题。app linking 未安装apk时指定到对应页面时&#xff0c;只拉开应用市场&#xff0c;安装后首次不能跳转到指定页面…

【操作系统】聊聊常见的内存管理方式

CPU 的实模式和保护模式。这两个模式 CPU 对内存的操作方式完全不同。在实模式下&#xff0c;CPU 直接通过物理地址访问内存。在保护模式下&#xff0c;CPU 通过一个地址映射表把虚拟的内存地址转为物理的内存地址&#xff0c;然后再去读取数据。 虚拟内存 在保护模式下&#…

数据结构--6.2关键路径

AOE网&#xff1a; 在一个表示工程的带权有向图中&#xff0c;用顶点表示事件&#xff0c;用有向边上的权值表示活动表示持续时间&#xff0c;这种有向图的边表示活动的网&#xff0c;我们称为AOE网&#xff08;Activity On Edge Network&#xff09;。 我们把AOE网中没有入边的…

Nginx重写功能和反向代理

目录 一、重写功能rewrite 1.1 if指令 1.2 return 1.3 set指令 1.4 break 指令 二、反向代理 2.1动静分离 2.2 缓存功能 2.3 ip穿透 2.4 http反向代理负载均衡 一、重写功能rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此…

Mybatis-plus联表查询 -- mybatis-plus-join

以t_order、t_user、t_product三表联合查询为例&#xff0c;其中t_order表为主表。 0.数据源配置 在springboot项目中&#xff0c;像往常一样正常配置数据源。 1.引入依赖 首先在项目中引入引入依赖坐标&#xff0c;因为mpj中依赖较高版本mybatis-plus中的一些api&#xff0…

【C++】函数参数扩展 ② ( 占位参数 | 占位参数规则 - 必须为占位参数传入实参 | 默认参数与占位参数结合使用 )

文章目录 一、占位参数1、占位参数简介2、占位参数规则 - 必须为占位参数传入实参 二、默认参数与占位参数结合使用1、结合用法2、代码示例 - 占位参数与默认参数结合用法 博客总结 : 默认参数 : 在 声明 函数时 , 为 函数参数 定义一个默认值 ;默认参数规则 : " 默认参数…

JS数组迭代方法实操

数组迭代方法有 1. every() 2.some() 3.foreach() 4.map() 5.filter 逐一操作&#xff0c;并简要区分之。 1 every() every() 方法使用指定的函数测试数组中所有的项&#xff0c;在数组的所有项都满足该条件时&#xff0c;才返回true&#xff0c;否则返回false&#xff1b; …

基于亚马逊云科技打造的游戏AIGC专业版,创梦天地快速上线AI生图服务

生成式人工智能&#xff08;以下简称“生成式AI”&#xff09;的热潮正在全球范围内掀起新一轮的科技革命&#xff0c;释放出巨大的商业价值。各类“AI绘画神器”的涌现&#xff0c;为创意行业带来了翻天覆地的变化。 在游戏领域&#xff0c;生成式AI技术也吸引了玩家们的广泛关…

QT day5

服务器&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); }Widget::~Widget() {delete ui…

数学建模之层次分析法

目录 1 模型概述2 模型流程2.1 建立递阶层次结构2.2 构造判断矩阵2.3 一致性检验2.4 计算权重2.4.1 算术平均法2.4.2 几何平均法2.4.3 特征值法 2.5 计算各方案的得分 3 编写代码4 模型局限性 1 模型概述 层次分析法(The analytic hierarchy process, 简称AHP)&#xff0c;是建…

9-AJAX-2综合案例

AJAX-综合案例 目录 案例-图书管理图片上传案例-网站换肤案例-个人信息设置 学习目标 今天主要就是练&#xff0c;巩固 axios 的使用 完成案例-图书管理系统&#xff08;增删改查&#xff09;经典业务掌握图片上传的思路完成案例-网站换肤并实现图片地址缓存完成案例-个人信…

Cyber RT学习笔记 --- 1.Cyber RT框架介绍

1.Cyber RT框架介绍 1.1 Cyber RT简介 Apollo Cyber是首个专为自动驾驶定制的高性能且开源的实时通信框架&#xff0c;于2019年与Apollo 3.5开放平台同期发布&#xff0c;它主要解决了自动驾驶系统的高并发、低延迟、高吞吐、任务调度等问题&#xff0c;同时还提供了多种通信…