MyBatis注解方式:从CRUD到数据映射的全面解析

目录

  • 1. MyBatis是什么?
  • 2.准备工作
    • 2.1创建工程
    • 2.2 数据准备
    • 2.3 持久层代码
    • 2.4 单元测试
  • 3.Mybatis的增删改查操作(使用注解方式)
    • 3.1 增(insert)
    • 3.2 删(delete)
    • 3.3 改(update)
    • 3.4 查(select)
  • 4.总结

1. MyBatis是什么?

MyBatis 是一个功能强大的持久层框架,专注于简化数据库操作。它通过配置文件或注解来管理 SQL 语句,支持动态 SQL,使开发更加灵活和高效。与 Hibernate 等 ORM(对象关系映射)框架不同,MyBatis 更加注重 SQL 的控制,允许开发者直接编写和优化 SQL 语句。
在这里插入图片描述


简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库工具
接下来,我们就通过⼀个入门程序,让大家感受⼀下通过Mybatis如何来操作数据库。

2.准备工作

Mybatis操作数据库的步骤:

  1. 准备工作(创建springboot工程、数据库表准备、实体类)
  2. 引⼊Mybatis的相关依赖,配置Mybatis(数据库连接信息)
  3. 编写SQL语句(注解/XML)
  4. 测试

2.1创建工程

创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。
在这里插入图片描述


项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖。

<!--	Mybatis 依赖包	--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency>
<!--数据库驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

2.2 数据准备

创建用户表(这里使用的是Navicat)

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;-- 使用数据数据
USE mybatis_test;-- 创建表[用户表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`username` VARCHAR ( 127 ) NOT NULL,`password` VARCHAR ( 127 ) NOT NULL,`age` TINYINT ( 4 ) NOT NULL,`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-女 0-默认',`phone` VARCHAR ( 15 ) DEFAULT NULL,`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now(),PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; -- 添加用户信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

在这里插入图片描述
成功创建。

创建对应的实体类UserInfo

import lombok.Data;
import java.util.Date;
@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;
}

配置数据库连接字符串
Mybatis中要连接数据库,需要数据库相关参数配置
• MySQL驱动类
• 登录名
• 密码
• 数据库连接字符串

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

# 数据库连接配置datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

也可以用.porperties配置文件进行配置,前面文章有介绍,本篇文章统一使用yml配置文件。


注意事项:
如果使用 MySQL 是 5.x 之前的使用的是"com.mysql.jdbc.Driver",如果是大于 5.x 使用的
是“com.mysql.cj.jdbc.Driver

2.3 持久层代码

创建一个Mapper接口(比如UserInfoMapper)

在这里插入图片描述

import com.sliqvers.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
// @Mapper 交给spring 进行管理@Mapper
public interface UserInfoMapper {@Select("SELECT * FROM user_info")List<UserInfo> selectAll();
}

Mybatis的持久层接口规范⼀般都叫 XxxMapper。
@Mapper注解:表⽰是MyBatis中的Mapper接口,交给Spring进行管理。
• 程序运行时, 框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理。
• @Select注解:代表的就是select查询,也就是注解对应方法的具体实现内容。


2.4 单元测试

在创建出来的SpringBoot工程中,在src下的test目录下,已经自动帮我们创建好了测试类 ,我们可以
直接使用这个测试类来进行测试。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class UserInfoMapperTest {@Autowired
private UserInfoMapper userInfoMapper;@Testvoid selectAll() {System.out.println(userInfoMapper.selectAll());}
}

解释:
1.@Spring boot Test 加载Spring运行环境
2.@Autowired注解:为UserInfo进行赋值,否则userInfo为空,则程序报错。
3.@Test注解:这是一个测试方法,可以在测试类进行测试。
启动测试观察结果:
在这里插入图片描述
可以看到成功了。

idea 自动生成测试类的方法:
在这里插入图片描述


3.Mybatis的增删改查操作(使用注解方式)

在学习这些操作之前, 我们先来学习MyBatis日志打印
在前面的运行结果可以看到
在这里插入图片描述
这样子的日志并不直观,那怎么办呢?我们进行一下Mybatis的日志打印配置(在.yml文件当中添加):

mybatis:configuration: # 配置打印 MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

运行结果:
在这里插入图片描述
可以看到打印出来的结果比之前的打印结果更加直观了


3.1 增(insert)

增加之前:
在这里插入图片描述
SQL语句:

insert into user_info (username, `password`, age, gender, phone) values
("张三","张三",19,1,"1646566787");

java代码:

@Mapper
public interface UserInfoMapper {//插入@Insert("insert into user_info (username, password, age,phone) values (#{username},#{password},#{age},#{phone})")Integer insertUser(UserInfo userinfo);
}

测试代码:

   @Testvoid insertUser() {UserInfo userInfo=new UserInfo();userInfo.setUsername("张三");userInfo.setPassword("张三");userInfo.setAge(19);userInfo.setPhone("1646566787");Integer result=userInfoMapper.insertUser(userInfo);System.out.println("影响行数" + result + " ,id" + userInfo.getId());}

运行结果:
在这里插入图片描述
刷新数据库,看是否插入成功了
在这里插入图片描述
可以看到插入成功了。


提出问题
我们同时看到那个数据库的id是主动自增了的,但是在控制台输出的id是null,那这个是怎么回事呢?

如果想要拿到⾃增id, 需要在Mapper接口的方法上添加一个Options的注解。

@Mapper
public interface UserInfoMapper {//插入@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("insert into user_info (username, password, age,phone) values (#{username},#{password},#{age},#{phone})")Integer insertUser(UserInfo userinfo);
}

useGeneratedKeys:这会令 MyBatis使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内
部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字
段),默认值:false.
• keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或
insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)

我们在新增加一个数据,看是否可以在控制台获取到id的自增值。
增加之前的数据:
在这里插入图片描述

代码(insert):

    @Testvoid insertUser() {UserInfo userInfo=new UserInfo();userInfo.setUsername("张si");userInfo.setPassword("张si");userInfo.setAge(19);userInfo.setPhone("1646566787");Integer result=userInfoMapper.insertUser(userInfo);System.out.println("影响行数" + result + " ,id:" + userInfo.getId());}

运行结果:
在这里插入图片描述
刷新数据库:
在这里插入图片描述

可以看到获取到了自增的值,至于为什么这个id是7,原因是因为我之前插入了一条数据,然把她删掉了,然后再插入的时候就是从6开始自增了,这是一个自增的知识点的断点问题。

3.2 删(delete)

SQL语句:

delete from user_info where id=7;

java代码:

@Mapper
public interface UserInfoMapper {//删除@Delete("delete from user_info where id=#{id}")void delete(Integer id);
}

测试代码:

@Testvoid delete() {userInfoMapper.delete(7);System.out.println("删除成功");}

运行结果:
在这里插入图片描述
打开数据库并且刷新看是否删除成功:
在这里插入图片描述
可以看到成功了。

3.3 改(update)

SQL语句:

update user_info set username="lisi" where id=5;

java代码:

@Mapper
public interface UserInfoMapper {//更新@Update("update user_info set username=#{username} where id=#{id}")void update(Integer id);
}

测试:

   @Testvoid update() {UserInfo userInfo=new UserInfo();userInfo.setId(5);userInfo.setUsername("lisi");userInfoMapper.update(userInfo);System.out.println("更新成功");}

数据更新前:
在这里插入图片描述
启动项目:
运行结果:
在这里插入图片描述
打开数据库并且刷新查询是否更新数据成功:
在这里插入图片描述
可以看到更新成功了。

3.4 查(select)

SQL语句:

select * from user_info;

java代码:

@Mapper
public interface UserInfoMapper {//查询@Select("SELECT * FROM user_info")List<UserInfo> selectAll();}

测试:

    @Autowired
private UserInfoMapper userInfoMapper;@Testvoid selectAll() {System.out.println(userInfoMapper.selectAll());}

运行结果:
在这里插入图片描述
可以看到查询成功了。

但是这里会有一个问题:我们先把Mybatis的日志配置取消掉为了便于观察:

启动项目:
在这里插入图片描述
我们可以看到这个这里这个没有获取到数据库表的数据。
这个原因是什么呢?
这是数据库表里的字段名字
在这里插入图片描述
再看java代码当中的字段名字:
在这里插入图片描述
可以看到他们是有区别的。当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性那么怎么解决这个问题呢?

三种方法

1.起别名:

   @Select("select id, username,`password`, age, gender,  phone, " +"delete_flag as deleteFlag, create_time as createTime, update_time as updateTime" +" from user_info")

2.结果映射:

     @Results(id = "BaseMap", value = {@Result(column = "delete_flag", property = "deleteFlag"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")})

3.驼峰命名(推荐):

mybatis:configuration: # 配置打印 MyBatis日志map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.总结

这篇博客详细介绍了使用MyBatis注解方式实现增删改查操作的全过程,并针对select查询时数据库数据获取不到的问题,提供了三种有效的解决方案:通过取别名、结果映射和设置驼峰大小转换。这些方法能够帮助开发者快速解决数据映射的问题,提高开发效率。下一篇博客中,我们将继续探讨MyBatis的另一配置方式——XML方式,并揭示它在增删改查操作中的独特优势。希望这篇博客能帮助大家更加全面地掌握MyBatis的核心功能,从而在实际项目中游刃有余。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 大视界 -- 基于 Java 的大数据机器学习模型的多模态融合技术与应用(143)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

进程管理笔记1-进程线程基础知识

5.1 进程线程基础知识 进程 进程的基本定义&#xff1a; 进行的程序。代码经过编译&#xff0c;变成二进制可执行文件&#xff0c;运行这个可执行文件后&#xff0c;装载到内存中&#xff0c;然后CPU执行其中指令。 并行和并发&#xff1a; 并行指两个任务并列前行&#x…

【VolView】纯前端实现CT三维重建-CBCT

文章目录 什么是CBCTCBCT技术路线使用第三方工具使用Python实现使用前端实现 纯前端实现方案优缺点使用VolView实现CBCT VolView的使用1.克隆代码2.配置依赖3.运行4.效果 进阶&#xff1a;VolView配合Python解决卡顿1.修改VtkThreeView.vue2.新增Custom3DView.vue3.Python生成s…

OpenEuler kinit报错找不到文件的解决办法

客户一套华为大数据集群平台,在一台arm平台openEuler服务器上面安装完集群客户端之后,使用kinit认证出现报错No such file or directory: 最终定位是操作系统/lib64缺少ld包导致,执行下面的命令恢复&#xff1a; ln -sv /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.s…

国内首家,百度智能云千帆AppBuilder全面兼容MCP协议

百度智能云千帆 AppBuilder 已兼容 MCP 协议&#xff01;作为国内首家支持 MCP 协议的大模型应用开发平台&#xff08;Claude、LangGraph、Cursor、Cline、N8N等海外平台已支持&#xff09;&#xff0c;千帆 AppBuilder 完成兼容后&#xff0c;用户可通过千帆 AppBuilder 轻松调…

uniapp自身bug | uniapp+vue3打包后 index.html无法直接运行

前提&#xff1a; 已经修改了基础路径 打开打包文件&#xff0c;双击运行index.html报错&#xff0c;无法访问页面 uniappvue2项目是可以正常运行的 vue3修改publicPath: ./后&#xff0c;也是可以正常访问打包文件中的index.html 点进控制台提供的链接&#xff1a;https:/…

Ubuntu快速安装使用gRPC C++

目录 引言一、快速安装1. 安装必要依赖库2. 安装gRPC 二、测试使用三、参考博客 引言 关于gRPC随着云原生微服务的火热也流行了起来&#xff0c;而且学好一个gRPC框架对目前来说也是必须的了。然而对于一个基础的小白来说&#xff0c;这个gRPC的框架运用起来是及其的困难&…

AES 简介 以及 C# 和 js 实现【加密知多少系列_3】

〇、AES 简介 AES 的全称是 Advanced Encryption Standard&#xff0c;意思是高级加密标准。它的出现主要是为了取代 DES&#xff08;Data Encryption StandardData Encryption Standard&#xff09;加密算法的&#xff0c;因为我们都知道 DES 算法的密钥长度是 56Bit&#xf…

在Django模型中的Mysql安装

安装mysql驱动 文章目录 安装mysql驱动1.打开PowerShell 安装mysql的驱动2.安装mysqlclient驱动2.1开始安装2.2 pip list 进行验证 出现mysqlclient 以及pymysql即可 3.正式安装mysql3.1打开mysql官网 www.mysql.com3.2点击下载 然后划到最后点击mysql社区下载 3.3 点击适合win…

AI赋能企业协作6-FizEIM的功能探索

本系列文章AI赋能企业协作与第一个系列IM工具对比中反复比较了国内外、商业、开源的IM工具以及IM工具的AI支持&#xff0c;在之前的比较对象中&#xff0c;由于信息偏差&#xff0c;Workplus&#xff08;BeeWorks&#xff09;已不再开源&#xff0c;这里向各位读者致歉&#xf…

java项目之基于ssm的旅游论坛(源码+文档)

项目简介 旅游论坛实现了以下功能&#xff1a; 用户信息管理&#xff1a; 用户信息新增 用户信息修改 景点信息管理&#xff1a; 景点信息添加 景点信息删除 景点信息修改 论坛类型管理 论坛类型添加 论坛类型修改 论坛类型删除 公告类型管理&#xff1a; 公告类型添加 公…

Linux安装Elasticsearch集群-----docker安装es集群

目录 技术背景 1.2 实验目标 二、实验内容 1.1 服务器规划 二、传统方式安装Elasticsearch集群 2.1 安装Java环境&#xff08;10.1.1.6/8&#xff09; 2.3 配置集群节点&#xff08;以10.1.1.6&#xff09; 2.4 启动服务 ES Data节点1&#xff08;10.1.1.8&#xff09;…

【嵌入式】复刻SQFMI开源的Watchy墨水屏电子表——(2)软件部分

书接上文 基于乐鑫 ESP32-PICO-D4 模块的墨水屏智能手表开源项目Watchy 完成了硬件部分&#xff0c;接下来就是软件部分&#xff1a; 一 开发环境配置&#xff08;Arduino ESP32&#xff09; 首先需要进行 Arduino ESP32 开发环境的安装配置&#xff0c;过程参考之前的帖子&a…

关于微信小程序端base64解码问题

由于atob是浏览器端的&#xff0c;对于微信小程序不支持&#xff0c;导致模拟器【开发工具】显示正常&#xff0c;但真机异常解析失败问题&#xff0c;微信小程序原有的api&#xff0c;官方文档中也废弃了 解决方案&#xff1a; 调用&#xff1a; const decodedString ba…

如何通过Odoo 18创建与配置服务器操作

如何通过Odoo 18创建与配置服务器操作 服务器操作是Odoo实现业务流程自动化的核心工具&#xff0c;允许你在服务器端执行自动化任务&#xff0c;通常由按钮点击或自动化工作流等事件触发。这些操作使用 Python 编写&#xff0c;能够执行复杂的业务逻辑&#xff0c;从而增强 Od…

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理&#xff0c;欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图&#xff1a; 注意&#xff0c;下面谈及的所有方式&#xff0c;都要求两者的IP地址处于同一网段&#xff0c;涉及到的软件资源见felm。 一、Windows主…

[设计模式与源码]1_Spring三级缓存中的单例模式

欢迎来到啾啾的博客&#x1f431;&#xff0c;一个致力于构建完善的Java程序员知识体系的博客&#x1f4da;&#xff0c;记录学习的点滴&#xff0c;分享工作的思考、实用的技巧&#xff0c;偶尔分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604…

微服务架构中的API网关:Spring Cloud与Kong/Traefik等方案对比

微服务架构中的API网关&#xff1a;Spring Cloud与Kong/Traefik等方案对比 一、API 网关的概念二、API 网关的主要功能2.1 统一入口与路由转发2.2 安全与权限控制2.3 流量管理与容错2.4 API 管理与聚合2.5 监控与日志2.5 协议转换与适配2.6 控制平面与配置管理 三、API 网关选型…

中兴B860AV3.2-T/B860AV3.1-T2_S905L3-B_2+8G_安卓9.0_先线刷+后卡刷固件-完美修复反复重启瑕疵

中兴电信B860AV3.2-T&#xff0f;B860AV3.1-T2_晶晨S905L3-B芯片_28G_安卓9.0_先线刷后卡刷-刷机固件包&#xff0c;完美修复刷机后盒子反复重启的瑕疵。 这两款盒子是可以通刷的&#xff0c;最早这个固件之前论坛本人以及其他水友都有分享交流过不少的固件&#xff0c;大概都…

Stable Diffusion lora训练(一)

一、不同维度的LoRA训练步数建议 2D风格训练 数据规模&#xff1a;建议20-50张高质量图片&#xff08;分辨率≥10241024&#xff09;&#xff0c;覆盖多角度、多表情的平面风格。步数范围&#xff1a;总步数控制在1000-2000步&#xff0c;公式为 总步数 Repeat Image Epoch …