【JavaEE进阶】 MyBatis使用注解实现增删改查

news2024/12/27 10:55:27

文章目录

  • 🍃前言
  • 🌴传递参数
  • 🎋增(Insert)
    • 🚩返回主键
  • 🎄删(Delete)
  • 🌲改(Update)
  • 🌳查(Select)
    • 🚩起别名
    • 🚩结果映射
    • 🚩开启驼峰命名(推荐使用)
  • ⭕总结

🍃前言

首先我们准备相应的表如下:
在这里插入图片描述

application.yml配置文件内容如下:

spring:
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/mybatis_test?
   characterEncoding=utf8&useSSL=false
  username: 用户名
  password: 密码
  driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
 configuration: # 配置打印 MyBatis⽇志
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

UserInfo类代码如下:

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

以下所有操作都是在该接口进行操作

@Mapper
public interface UserInfoMapper {

}

所有测试单元代码都是在如下代码里面完成的:

@Slf4j
@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

}

如以下演示有看不懂的地方,可以先看一下博主写的 【JavaEE进阶】MyBatis⼊⻔

🌴传递参数

我们在实现增删改查的时候,我们不希望将他写死,所以我们需要进行传递参数。

我们使⽤ #{} 的⽅式获取⽅法中的参数。

比如我们需要以id来查询数据,书写就可以如下:

public interface UserInfoMapper {
    @Select("select * from userinfo where id=#{id}")
    public List<UserInfo> selectAll(Integer id);
}

具体传参使用参考后续用例

如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…}⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致
如果有多个参数,属性名一定要与参数名保持一致,当然也可以进行修改,具体方法后面会详细讲解

🎋增(Insert)

我们采用@Inset注解实现,具体实现如下:

    @Insert("insert into userinfo (id,username, `password`, age, gender, phone) " +
            "values (#{id},#{username},#{password},#{age},#{gender},#{phone})")
    Integer insert(UserInfo userInfo);

返回Integer是为了知道对该数据库更改了多少行。

这里由于传递参数过多,我们使用对象进行传递,对对象相应参数进行赋值即可。

我们使用测试单元进行测试,测试代码如下:

    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(5);
        userInfo.setPassword("66666");
        userInfo.setUsername("遇事问春风乄");
        userInfo.setAge(21);
        userInfo.setGender(1);
        userInfo.setPhone("15353921091");
        userInfoMapper.insert(userInfo);
    }

启动测试代码,我们可以看到相应的日志
在这里插入图片描述
再查询相应的数据库时我们就可以看到,添加成功的数据
在这里插入图片描述

🚩返回主键

有时候增加后,我们想知道该数据的主键id,我们既可以使用@Options的注解

具体使用如下:

    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into userinfo (username, `password`, age, gender, phone) " +
            "values (#{username},#{password},#{age},#{gender},#{phone})")
    Integer insert(UserInfo userInfo);
  • useGeneratedKeys:这会令MyBatis使⽤JDBC的getGeneratedKeys⽅法来取出由数据库内部⽣成的主键(⽐如:像MySQL和SQL Server这样的关系型数据库管理系统的⾃动递增字段),默认值:false.
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis会使⽤getGeneratedKeys的返回值或insert语句的selectKey⼦元素设置它的值,默认值:未设置(unset)

测试代码如下:

@Test
void insert() {
    UserInfo userInfo = new UserInfo();
    userInfo.setPassword("66666");
    userInfo.setUsername("遇事问春风乄");
    userInfo.setAge(21);
    userInfo.setGender(1);
    userInfo.setPhone("15353921091");
    int count = userInfoMapper.insert(userInfo);
    System.out.println("改变数据条数为:"+count +"自增主键为:"+userInfo.getId());
}

启动测试代码如下:
在这里插入图片描述
查询数据库如下:
在这里插入图片描述

🎄删(Delete)

删除代码如下:

@Delete("delete from userinfo where id=#{id}")
Integer delete(Integer id);

测试单元代码如下:

@Test
void delete() {
    int count = userInfoMapper.delete(7);
    log.info("改变数据行数为"+count);
}

运行结果如下:
在这里插入图片描述
查询数据库如下:
在这里插入图片描述
id为7的数据已被删除

🌲改(Update)

将id为5的密码改为000000,接口代码如下:

@Update("update userinfo set password=#{password} where id=#{id} ")
Integer update(UserInfo userInfo);

测试单元代码如下:

@Test
void update() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(5);
    userInfo.setPassword("000000");
    int cound = userInfoMapper.update(userInfo);
    log.info("改变行数为:"+cound);
}

启动测试后,观察日志如下:
在这里插入图片描述

查询数据库如下:
在这里插入图片描述

已更改完成

🌳查(Select)

我们查询所有数据,并用日志打印出来,代码如下:

@Select("select * from userinfo")
List<UserInfo> select2();

测试单元代码如下:

@Test
void select2() {
    List<UserInfo> list = userInfoMapper.select2();
    System.out.println(list);
}

单元测试执行如下:

在这里插入图片描述

注意事项:

  • MyBatis会根据⽅法的返回结果进⾏赋值.
  • ⽅法⽤对象UserInfo接收返回结果,MySQL查询出来数据为⼀条,就会⾃动赋值给对象.
  • ⽅法⽤List接收返回结果,MySQL查询出来数据为⼀条或多条时,也会⾃动赋值给List.
  • 但如果MySQL查询返回多条,但是⽅法使⽤UserInfo接收,MyBatis执⾏就会报错.

从运⾏结果上可以看到,我们SQL语句中,查询了delete_flag,create_time,update_time,但是这⼏个属性却没有赋值.

这是什么原因呢“

当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略⼤⼩写)。这意味着如果发现了ID列和id属性,MyBatis会将列ID的值赋给id属性

在这里插入图片描述
但是由于数据库与java命名规则不同,数据库的蛇形将转换成驼峰,所以无法识别。

解决方法有以下三种:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

🚩起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样

@Select("select id, username, `password`, age, gender, phone, delete_flag as deleteFlag, " +
        "create_time as createTime, update_time as updateTime from userinfo")
List<UserInfo> select3();

再次运行查看
在这里插入图片描述
就可以看到对应属性已经有值了

但是这种方式一般不推荐,因为相当于将这个工作交给数据库来做了。会降低效率,且不可控

🚩结果映射

使用注解,以及相关操作如下:

@Results({
        @Result(column = "delete_flag",property = "deleteFlag"),
        @Result(column = "create_time",property = "createTime"),
        @Result(column = "update_time",property = "updateTime")
})
@Select("select * from userinfo")
List<UserInfo> select4();

如果其他SQL,也希望可以复⽤这个映射关系,可以给这个Results定义⼀个名称

@Results(id = "resultMap",value = {
        @Result(column = "delete_flag",property = "deleteFlag"),
        @Result(column = "create_time",property = "createTime"),
        @Result(column = "update_time",property = "updateTime")
})
@Select("select * from userinfo")
List<UserInfo> select4();

后续代码使用相应的@ResultMap进行调用即可
在这里插入图片描述

🚩开启驼峰命名(推荐使用)

通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词),⽽Java属性⼀般遵循驼峰命名法约定.为了在这两种命名⽅式之间启⽤⾃动映射,需要将mapUnderscoreToCamelCase 设置为true。

application.yml配置如下:

mybatis:
 configuration:
  map-underscore-to-camel-case: true #配置驼峰⾃动转换

仅限遵守两种命名规则的转换。

这时候我们直接使用查询即可

@Test
void select2() {
    List<UserInfo> list = userInfoMapper.select2();
    System.out.println(list);
}

查询后发现
在这里插入图片描述
已经进行了自动映射,字段全部进⾏正确赋值

⭕总结

关于《【JavaEE进阶】 MyBatis使用注解实现增删改查》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

代课老师是劳务派遣吗

劳务派遣是一种特殊的用工形式&#xff0c;指由劳务派遣机构与派遣劳工签订劳动合同&#xff0c;并支付报酬&#xff0c;把劳动者派向其他用工单位&#xff0c;再由其用工单位向派遣机构支付一笔服务费用的一种用工形式。也就是说&#xff0c;劳务派遣的员工和实际工作的单位没…

谁能做智驾?国内电动车新王者诞生在望

书接上回&#xff0c;我来告诉你们&#xff0c;近来国内科技巨头华为和比亚迪之间&#xff0c;在电动车智能化领域也快开打起来了&#xff01;你们心里一定有一个问题—这两家公司到底是为什么要较量呢?难道仅仅是想比比看谁技术更强?还是产品谁能卖的更好?其实&#xff0c;…

【Linux】文件周边001之系统文件IO

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.C语言文件IO 1.1…

HCIP网络类型+串线+GRE

一.网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 -- 在一个MA网络中同时存在广播&#xff08;泛洪&#xff09;机制 NBMA&#xff1a;非广播型多路访问 -- 在一个MA网络中&#xff0c;没有泛洪机制-----不怎么使用了 MA&#xff1a;多路访问 -- 在一个…

手机App防沉迷系统 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 智能手机方便了我们生活的同时&#xff0c;也侵占了我们不少的时间。“手机Ap防沉迷系统” 能够让我们每天合理的规划手机App使用时间&#xff0c;在正确的时间做…

Redis - redis.windows.conf配置文件及RDB和AOF数据持久化方案

Redis - redis.windows.conf配置文件及RDB和AOF数据持久化方案 Redis的高性能是由于其将所有数据都存储在了内存中&#xff0c;为了使Redis在重启之后仍能保证数据不丢失&#xff0c;需要将数据从内存中同步到硬盘中&#xff0c;这一过程就是持久化。 Redis支持两种方式的持久化…

Vue3 Suspense 优雅地处理异步组件加载

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

[Linux]HTTP状态响应码和示例

1xx&#xff1a;信息响应类&#xff0c;表示接收到请求并且继续处理 2xx&#xff1a;处理成功响应类&#xff0c;表示动作被成功接收、理解和接受 3xx&#xff1a;重定向响应类&#xff0c;为了完成指定的动作&#xff0c;必须接受进一步处理 4xx&#xff1a;客户端错误&#x…

[笔记]Spring AOP

Spring AOP&#xff08;Aspect Oriented Programming&#xff09; AOP将应用程序分为核心业务和非核心的公共功能&#xff0c;AOP的关注点是系统中的非核心的公共功能&#xff1b; AOP可以通过预编译或者运行期动态代理的方式&#xff0c;为横跨多个对象&#xff08;没有继承关…

四、Flask学习之JavaScript

四、Flask学习之JavaScript JavaScript&#xff0c;作为一种前端脚本语言&#xff0c;赋予网页生动的交互性和动态性。通过它&#xff0c;开发者能够操作DOM&#xff08;文档对象模型&#xff09;实现页面元素的动态改变、响应用户事件&#xff0c;并借助AJAX技术实现异步数据…

omron adept控制器维修SmartController EX

欧姆龙机器人adept运动控制器维修SmartController EX 19300-000 维修范围&#xff1a;姆龙机器人&#xff1b;码垛机器人&#xff1b;搬运机器人&#xff1b;焊机机器人&#xff1b;变位机等。 Adept Viper s650/s850用于装配、物料搬运、包装和机械装卸&#xff0c;循环周期短…

基于YOLOv8深度学习的102种花卉智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

dom-to-image-more 使用

与网上不同的使用方式&#xff1a; 官网 dom-to-image-more - npm 这里不会出现两行缩略不行的bug yarn add dom-to-image-more 下面 生成图片并下载图片 const picture ref() const dom2img () > {var node picture.valuedomtoimage.toPng(node, { cacheBust: t…

iou的cpu和gpu源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 简介 IoU&#xff08;Intersection over Union&#xff09;是一种测量在特定数据集中检测相应物体准确度的一个标准&#xff0c;通常用于目标检测中预测框&#xff08;bounding box&#xff09;之间准确度的…

Arduino U8g2库:图形界面库的强大利器,

Arduino U8g2库&#xff1a;图形界面库的强大利器 介绍 在Arduino世界中&#xff0c;图形界面的显示通常是一项关键的任务。为了简化这个过程&#xff0c;提高开发效率&#xff0c;许多库被开发出来&#xff0c;其中U8g2库就是其中之一。U8g2库是一个功能强大的图形库&#x…

uniapp复选框 实现排他选项

选择了排他选项之后 复选框其他选项不可以选择 <view class"reportData" v-for"(val, index) in obj" :key"index"> <view v-if"val.type 3" ><u-checkbox-group v-model"optionValue" placement"colu…

web系统服务器监控检查

一、检查操作系统是否存在增减文件&#xff0c;是否有shell被上传 要检查操作系统是否存在增减文件或是否有shell被上传&#xff0c;您可以按照以下步骤进行操作&#xff1a; 文件完整性检查&#xff1a; 使用文件系统的完整性检查工具&#xff0c;例如fsck&#xff08;对于ext…

项目一:踏上Java开发之旅

文章目录 一、实战概述二、实战步骤任务1&#xff1a;安装配置JDK并开发第一个Java程序步骤一&#xff1a;安装JDK步骤二&#xff1a;配置JDK环境变量步骤三&#xff1a;开发第一个Java程序 课堂练习任务1、打印个人信息任务2、打印直角三角形任务3、打印一颗爱心任务4、打印史…

git:使用git rebase合并多次commit为一个

git log&#xff1a;找到需要合并的最早 commit 的父级 git rebase -i 73a5cd8597除第一个 pick 外&#xff0c;将其它改成 s&#xff0c;改完后保存退出 保存完后弹出 commit message 合并提示&#xff0c;根据这次合并的目的&#xff0c;重写commit message&#xff0c;改完后…

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…