详解MyBatis(二)

目录

1.MyBatis的基本操作

1.1增(Insert)

1.1.1返回主键

 1.2删(Delete)

1.3改(Update)

1.4查(Select)

1.4.1起别名

1.4.2结果映射 

 1.4.3开启驼峰命名(推荐)

2.MyBatis XML配置文件

2.1 配置连接字符串和MyBatis

2.2添加Mapper接口

2.3添加 UserInfoXMLMapper.xml

2.4增删改查操作

2.4.1增(Insert)

 2.4.2删(Delete)

2.4.3改(Update)

2.4.4查(Select)


承接上文 详解MyBatis(一)

1.MyBatis的基本操作

1.1增(Insert)

SQL语句:

insert into userinfo (username, `password`, age, gender, phone) values
("zhaoliu","zhaoliu",19,1,"18700001234")

Mapper接口:

SQL中的常量替换为动态的参数,直接使⽤UserInfo对象的属性名来获取参数

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

测试代码:

    @Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhaoliu");userInfo.setPassword("zhaoliu");userInfo.setGender(2);userInfo.setAge(21);userInfo.setPhone("18612340005");userInfoMapper.insert(userInfo);}

运行后, 观察数据库执行结果:

1.1.1返回主键

Insert 语句默认返回的是 受影响的

但有些情况下, 数据插入之后, 还需要有后续的关联操作, 需要获取到新插入数据的id

如订单系统、我们下完订单之后, 需要通知物流系统, 库存系统, 这时候就需要拿到订单ID

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

    @Options(useGeneratedKeys = true, keyProperty = "id")@Insert("insert into userinfo (username, age, gender, phone) values (#{userinfo.username}, #{userinfo.age}, #{userinfo.gender}, #{userinfo.phone})")Integer insert(UserInfo userInfo);

`useGeneratedKeys` 是 MyBatis 中的一个属性设置。 当设置为 `true` 时,它表示在执行插入操作后,希望获取由数据库自动生成的主键值(如果存在)并将其设置到插入对象对应的属性中。这样可以方便地获取到新插入记录的主键值,以便后续进行相关操作。

当在 MyBatis 的配置文件中设置了`useGeneratedKeys=true`时,表示使用数据库的自增主键。而keyProperty属性则用于将自动生成的主键与实体类的属性进行绑定。通过将keyProperty设置为实体类中对应的属性名,MyBatis 会在执行插入操作后,将自动生成的主键值赋给该属性

例如,如果实体类中有一个名为id的属性用于存储主键值,可以将keyProperty设置为"id"

测试代码:

    @Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("Romised");userInfo.setPassword("Romised");userInfo.setGender(2);userInfo.setAge(22);userInfo.setPhone("1525523111");Integer count = userInfoMapper.insert(userInfo);System.out.println("添加数据条数:" +count +", 数据ID:" + userInfo.getId());}

运行结果:

 1.2删(Delete)

SQL 语句:

delete from userinfo where id = 6;

Mapper接口:

SQL中的常量替换为动态的参数 

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

1.3改(Update)

SQL 语句:

update userinfo set username="zhaoliu" where id=5

Mapper接口:

SQL中的常量替换为动态的参数 

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

1.4查(Select)

我们在上面查询时发现, 有几个字段是没有赋值的, 只有Java对象属性和数据库字段⼀模⼀样时, 才会进行赋值接下来我们多查询⼀些数据

 @Select("select id, username, `password`, age, gender, phone, deleteFlag,
createTime, updateTime from userinfo")List<UserInfo> queryAllUser()

查询结果:

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

 MyBatis 会根据方法的返回结果进⾏赋值.

方法⽤对象 UserInfo接收返回结果, MySQL 查询出来数据为⼀条, 就会自动赋值给对象.

方法⽤List<UserInfo>接收返回结果, MySQL 查询出来数据为⼀条或多条时, 也会自动赋值给List. 但如果MySQL 查询返回多条, 但是方法使⽤UserInfo接收, MyBatis执⾏就会报错.

原因分析:

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

 解决方法:

1.4.1起别名

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

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

SQL语句太长时, 使⽤加号+进行字符串拼接

1.4.2结果映射 

@Select("select id, username, `password`, age, gender, phone, delete_flag, create_time, update_time from userinfo")
@Results({@Result(column = "delete_flag", property = "deleteFlag"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")})List<UserInfo> queryAllUser();

使用id属性给该Results定义别名,使用@ResultMap注解来服用其他定义的ResultMap

 1.4.3开启驼峰命名(推荐)

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

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

驼峰命名规则: abc_xyz => abcXyz   表中字段名:abc_xyz    类中属性名:abcXyz

Java代码中不做任何处理,添加上述配置,运行代码:

字段全部进行正确赋值 

2.MyBatis XML配置文件

使⽤Mybatis的注解方式 ,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中.

2.1 配置连接字符串和MyBatis

此步骤需要进⾏两项设置 ,数据库连接字符串设置和 MyBatis  XML ⽂件配置。 如果是application.yml文件, 配置内容如下:

# 数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:mapper-locations: classpath:mapper/**Mapper.xml

如果是application.properties文件,配置内容如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding 
#连接数据库的⽤户名
spring.datasource.username=root 
#连接数据库的密码
spring.datasource.password=root
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis.mapper-locations=classpath:mapper/**Mapper.xml

2.2添加Mapper接口

@Mapper
public interface UserInfoXMLMapper {List<UserInfo> queryAllUser();Integer insert(UserInfo userInfo);Integer delete(Integer id);Integer update(Integer id,String username);
}

2.3添加 UserInfoXMLMapper.xml

数据持久层的实现 MyBatis 的固定 xml 格式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatistest.mapper.UserInfoXMLMapper"></mapper>

注意:namespace的路径要和上面创建的Mapper路径一致,按住Ctrl点击Mapper可以进入。

创建UserInfoXMLMapper.xml, 路径参考yml中的配置(目录名和后缀要一致

2.4增删改查操作

2.4.1增(Insert)

UserInfoMapper接口:

Integer insertUser(UserInfo userInfo);

UserInfoMapper.xml实现:

其中设置useGeneratedKeys keyProperty属性,可以返回自增id

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username,password,age,gender,phone)values(#{username},#{password},#{age},#{gender},#{phone})</insert>

如果使⽤@Param设置参数名称的话, 使⽤方法和注解类似 

 2.4.2删(Delete)

UserInfoMapper接口:

Integer deleteUser(Integer id);

UserInfoMapper.xml实现:

 <delete id="deleteUser">delete from userinfo where id = #{id}</delete>

2.4.3改(Update)

UserInfoMapper接口:

Integer updateUser(UserInfo userInfo);

UserInfoMapper.xml实现:

 <update id="updateUser">update userinfo set username=#{username} where id=#{id}</update>

2.4.4查(Select)

同样的, 使⽤XML 的⽅式进⾏查询, 也存在数据封装的问题 我们把SQL语句进⾏简单修改, 查询更多的字段内容

 <select id="queryAllUser" resultType="com.example.demo.model.UserInfo">select id, username,`password`, age, gender, phone, delete_flag, create_time</select>

运行结果:

 结果显⽰: deleteFlag, createTime, updateTime 也没有进行赋值. 

解决办法和注解类似:1.  起别名、2.  结果映射、3.  开启驼峰命名

其中1,3的解决办法和注解⼀样,不再多说, 接下来看下xml如果来写结果映射 Mapper.xml

 <resultMap id="BaseMap" type="com.example.demo.model.UserInfo"><id column="id" property="id"></id><result column="delete_flag" property="deleteFlag"></result><result column="create_time" property="createTime"></result><result column="update_time" property="updateTime"></result></resultMap><select id="queryAllUser" resultMap="BaseMap">select id, username,`password`, age, gender, phone, delete_flag, create_time</select>

 

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

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

相关文章

【Maxcompute】bd09、gcj02、wgs84经纬度坐标系转换udf函数

1.梳理、总结经纬度处理在Maxcompute平台上的实战应用&#xff0c;如bd09、gcj02、wgs84经纬度坐标系转换UDF函数注册与使用。 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 文章目录 1.参考代码 1.参考代码 坐标系转换 bd09坐标系&#xff08;百度坐标系&#xff09;…

【Node】Node的Buffer模块介绍和使用

目录 简言Buffer模块Buffer和字符编码Buffer和 TypedArrays 缓冲区和类数组视图Buffers 和 iteration 缓冲区和迭代(遍历)Class: Blobnew buffer.Blob([sources[, options]]) 创建blob实例blob.arrayBuffer() 转换成ArrayBufferblob.size 数据大小blob.slice([start[, end[, ty…

我更看好开源大模型的发展前景

目录 开源大模型与闭源大模型&#xff0c;你更看好哪一方&#xff1f; 方向一&#xff1a;数据隐私 开源大模型&#xff1a; 闭源大模型&#xff1a; 方向二&#xff1a;商业应用 开源大模型&#xff1a; 闭源大模型&#xff1a; 方向三&#xff1a;社区参与 开源大模…

常用开关电源拓扑演进

目录 常用开关电源拓扑演进 一、概述 二、升压变换器(buck)与降压变换器(boost)

Oracle查看执行计划的方法

使用 EXPLAIN PLAN 命令: 首先&#xff0c;你需要执行 EXPLAIN PLAN FOR 你的查询语句。例如&#xff1a;EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id 10;然后&#xff0c;从系统表 PLAN_TABLE 中查询执行计划详情&#xff1a;SELECT * FROM TABLE(dbms_xp…

AR眼镜定制开发_在AR眼镜中实现ChatGPT功能

AR眼镜定制方案中&#xff0c;需要考虑到强大的算力、轻巧的设计和更长的续航时间等基本要求。然而&#xff0c;AR眼镜的设计方案不仅仅需要在硬件和显示技术方面取得突破&#xff0c;还要在用户体验方面有所进展。 过去&#xff0c;由于造价较高&#xff0c;AR眼镜的普及和商业…

Android 编译文件简述(Makefile 2)

Android 编译文件简述(Makefile 2) 承接上一篇Android 编译文件简述(Makefile),继续讲解Make使用方法。本篇文章简述Makefile的编译和执行流程控制。 作者:炭烤毛蛋 ,点击博主了解更多。 提示:了解Makefile 规则,构建Makefile变得简单。 文章目录 Android 编译文件简述(M…

按钮组切换控制统计图显示【统计图切换渲染失败】

背景 需要实现点击左上角按钮组的按钮&#xff0c;切换对应的统计图 点击按钮1呈现的统计图。映射的实体类Vo1 点击按钮2呈现的统计图。映射的实体类Vo2 可能会出现的问题&#xff1a; &#xff08;1&#xff09; 空白&#xff1a;进入页面只渲染第一个统计图&#xff0c;点…

TypeScript核心类型概览与应用-1

文章目录 TypeScript入门1.TypeScript介绍2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类…

OpenGL系列(四)Shader

通过VBO和VAO准备好数据后&#xff0c;接下来要指示GPU如何通过这些数据绘制图形。类似CPU可以通过执行程序来完成特定的任务&#xff0c;GPU也可以执行特定的程序来完成绘制任务&#xff0c;GPU执行的程序称为Shader&#xff0c;也叫着色器。 GPU绘制图形分为不同的处理阶段&a…

09-使用JavaScript处理长列表数据:惰性渲染、虚拟滚动与分批渲染

使用JavaScript处理长列表数据&#xff1a;惰性渲染、虚拟滚动与分批渲染 笔记分享 在前端开发中&#xff0c;处理长列表数据是一项常见且具有挑战性的任务。为了提升性能和用户体验&#xff0c;开发者可以采用多种技术和方法来优化渲染过程。本文将介绍如何使用原生JavaScrip…

数据库课程设计mysql

数据库课程设计&#xff1a;MySQL 一、引言 数据库设计是数据库技术的一个重要方面&#xff0c;它涉及到数据的组织、存储、检索和管理。MySQL作为目前流行的关系数据库管理系统之一&#xff0c;广泛应用于各种应用场景中。本课程设计旨在通过MySQL平台&#xff0c;让学生深入…

深入探讨Qt中的容器类:QList与QVector

深入探讨Qt中的容器类&#xff1a;QList与QVector 在C的Qt框架中&#xff0c;容器类的选择对性能和内存使用有着重要影响。QList和QVector是Qt中两个常用的容器类&#xff0c;它们虽然在某些方面非常相似&#xff0c;但在实现细节和适用场景上存在显著差异。本文将详细介绍这两…

【Zero to One系列】SpringCloud Gateway结合Nacos完成微服务的网关路由

前期回顾&#xff1a; 【Zero to One系列】springcloud微服务集成nacos&#xff0c;形成分布式系统 1、Gateway依赖配置 主要Maven依赖如下&#xff1a; <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>…

oracle date类型如何比较时间

在 Oracle 数据库中&#xff0c;如果你想要比较 DATE 类型的时间部分&#xff0c;你需要意识到 DATE 类型实际上包含日期和时间信息&#xff0c;精确到秒。但是&#xff0c;由于 DATE 类型没有单独的时间组件&#xff0c;你通常需要一些额外的逻辑来提取或比较时间部分。 以下…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑发用电相似性的海上风电中长期双边协商交易优化决策模》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

小鸡庄园智慧农场养殖游戏开发:科技与农业的完美结合

随着科技的进步&#xff0c;一种全新的游戏模式——智慧农场养殖游戏&#xff0c;正在逐渐崭露头角。本文将深入探讨小鸡庄园智慧农场养殖游戏的开发背景、特点、技术实现方式以及未来的发展趋势&#xff0c;以期为游戏产业创新和农业现代化提供新的思路和启示。 一、开发背景…

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …

【Nacos】docker-compose启动nacos v2.2.3,启动时修改默认密码不使用naocs

1. 背景 出于安全考虑&#xff0c;我司DevOps平台自动部署的容器化nacos密码不能是弱密码或默认值 但是nacos-v2.2.3官方镜像启动后会初始化nacos用户密码为nacos&#xff0c;修改启动时的变量并没有生效。 2. 部署验证 2.1 yml文件如下 注意将derby库的初始化文件挂载出来…

探索Linux中的fdisk命令:磁盘分区管理的利器

探索Linux中的fdisk命令&#xff1a;磁盘分区管理的利器 在Linux系统管理中&#xff0c;磁盘分区是一项非常重要的任务。它涉及到数据的存储、备份和恢复&#xff0c;以及系统的性能和稳定性。而fdisk&#xff0c;作为Linux下的一款经典磁盘分区工具&#xff0c;凭借其强大的功…