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

文章目录

  • 🍃前言
  • 🌴传递参数
  • 🎋增(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使用注解实现增删改查》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电源模块测试项目:输入低压点循环测试及测试方法

输入低压点循环测试是什么? 电源输入低压点循环测试是检测电源在低压条件下的性能和稳定性&#xff0c;它是一次电源模块的输入欠压点保护的设置回差测试。当输入电压较低&#xff0c;接近一次电源模块欠压点关断时&#xff0c;带载时欠压; 断后由于电源内阻原因&#xff0c;负…

初识Docker(架构、安装Docker)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中。这些容器可以在不同的计算平台上运行&#xff0c;如Linux和Windows&#xff0c;并且可以实现虚拟化。Docker 的设计目标是提供一种快速且轻量…

智能机器人与旋量代数(12)

Chapt 4. 旋量代数在机器人学中的应用 4.1 串联机器人正运动学的指数积(PoE, Product of Exponetial)公式 4.1.1 回顾&#xff1a;机器人正运动学的Denavit-Hartenberg (D-H)参数公式 D-H 建模法: D-H 建模方法是由 Denavit 和 Hartenberg (ASME, 1955) 提出的一种建模方法&…

谷歌浏览器新增3个重磅生成式AI!自动生成文本、壁纸等

1月24日&#xff0c;谷歌在官网宣布&#xff0c;在谷歌浏览器&#xff08;Chrome最新版本M121&#xff09;中新增自动生成文本、壁纸以及自动管理标签3个全新生成式AI功能&#xff0c; 这也是为数不多支持生成式AI的浏览器。需要注意的是&#xff0c;由于这三项功能处于预览测…

33、WEB攻防——通用漏洞文件上传中间件解析漏洞编辑器安全

文章目录 一、中间件文件解析——IIS&Apache&Nginx1、IIS2、Apache3、Nginx 二、web编辑器 一、中间件文件解析——IIS&Apache&Nginx 1、IIS IIS爆过漏洞的版本&#xff1a;IIS6.0&#xff08;windows server 2003&#xff09;、IIS7.0和IIS7.5&#xff08;w…

如何在CentOS使用docker-compose部署Apache Superset并实现公网访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

【云原生】Docker的安装和镜像操作

目录 什么是Docker&#xff1f; 容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; Docker与虚拟机的区别&#xff1a; 容器在内核中支持2种重要技术&#xff1a; Docker核心概念&#xff1a; 安装Docker 安装依赖包 设置阿里云镜像源 安装 Docker-CE并设置为开机…

简单Web UI 自动化测试框架 seldom

pyse 更名为 seldom WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动化测试框架。 特点 提供更加简单API编写自动化测试。提供脚手架&#xff0c;快速生成自动化测试项目。自动生成HTML测试报告生成。自带断言方…

vue3+ts+element-plus集成bpmn.js

Bpmn.js集成文档 说明&#xff1a; 本文档主要是作为集成&#xff0c;不是原创&#xff08;主要是填写转载他又让我写原文链接&#xff0c;但是我又没有原文链接哈哈哈&#xff09;&#xff0c;感谢以下参考博文。 本项目页面模板使用Geeker-Admin作为前端模板Geeker-Admin&a…

数据链路层——笔记·续

使用集线器的星形拓扑 传统以太网传输媒体&#xff1a;粗同轴电缆 -> 细同轴电缆 -> 双绞线。 采用双绞线的以太网采用星形拓扑。 在星形的中心则增加了一种可靠性非常高的设备&#xff0c;叫做集线器 (hub)。 传统以太网使用同轴电缆&#xff0c;采用总线形拓扑结构&am…

php no input file specified

一、修改 .user.ini 文件 内容 open_basedir/wab/led-sht.com/:/tmp/ led-sportslight.com是项目根目录位置 改好后保存并清空缓存硬刷新网站就行了 二、mkdir(): Permission denied /core/library/think/cache/driver/File.php 第 84 行左右 mkdir(): Permission denied 这个…

Windows AD 组策略 通过脚本修改管理员密码:以安全方式

因为本文主要讲的是通过脚本如何以安全方式设置密码&#xff0c;所以关于组策略如何设置请参考这里&#xff1a; WinServer 2019 AD 组策略 启用本地管理员账号&#xff0c;重置密码_ad域命令启用administrator账户-CSDN博客 我们首先要讲一下&#xff0c;以一般方法创建的脚…

FineReport链接本地DBeaver

finereport链接本地DBeaver fanruan.com/finereport/doc-view-101.html help.fanruan.com/finereport/doc-view-2583.html

PMP证书要怎么考,含金量怎么样?

PMP含金量更多的是“敲门砖”作用&#xff0c;公司招聘的门槛&#xff0c;现在坐项目的大部分都需要PMP/NPDP证书。 当然现在PMP管理模式也很热门&#xff0c;对企业发展很有利&#xff0c;各大企业都有引进改良应用在公司的项目上&#xff0c;之前在校友群里面大家在讨论PMP …

【MySQL源码】Seconds_Behind_Master是如何计算的

作为MySQL DBA&#xff0c;相信大家对参数 Seconds_Behind_Master 并不陌生&#xff0c;该字段的值可以通过 show slave status\G的输出&#xff0c;表示主从延迟的时间&#xff0c;单位为秒。监控主从延迟一般取这个值就足够了。0 表示无延迟&#xff0c;理想状态该值不要超…

selenium执行出现异常,SessionNotCreatedException ChromeDriver only supports

问题现状&#xff1a; 运行程序报错&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 121.0.6167.85 with binary path /App…

GraphicsMagick 的 OpenCL 开发记录(二十一)

文章目录 支持windows平台windows平台不能生成内核的.bin文件_aligned_free()和free()不匹配的问题 <2022-04-13 Wed> 支持windows平台 支持windows平台需要做的&#xff1a; 为GraphicsMagick/VisualMagick/configure/configure.exe增加“Enable OpenCL”多选框。 从…

【jQuery入门】链式编程、修改css、类操作和className的区别

文章目录 前言一、链式编程二、修改css2.1 获取css的值2.2 设置单个css属性2.3 设置类样式添加类移除类切换类 三、类操作与className的区别总结 前言 jQuery是一个流行的JavaScript库&#xff0c;广泛用于简化DOM操作和处理事件。在jQuery中&#xff0c;链式编程是一种强大的…

Tree-Shaking 作用和实现原理

一、什么是Tree-shaking Tree-shaking 它的名字来源于通过摇晃&#xff08;shake&#xff09;JavaScript代码的抽象语法树&#xff08;AST&#xff09;&#xff0c;是一种用于优化JavaScript代码的技术&#xff0c;主要用于移除未被使用的代码&#xff0c;使得最终生成的代码包…

【机组】计算机组成原理实验指导书.

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 第一章 性能特点 1.1 系…