详解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,一经查实,立即删除!

相关文章

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

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

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

背景 需要实现点击左上角按钮组的按钮&#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…

文章解读与仿真程序复现思路——电力系统自动化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库的初始化文件挂载出来…

Python | Leetcode Python题解之第129题求根节点到叶节点数字之和

题目&#xff1a; 题解&#xff1a; class Solution:def sumNumbers(self, root: TreeNode) -> int:if not root:return 0total 0nodeQueue collections.deque([root])numQueue collections.deque([root.val])while nodeQueue:node nodeQueue.popleft()num numQueue.p…

产品人生(9):从“波士顿矩阵”看“个人职业规划”

波士顿矩阵&#xff08;简称BCG矩阵&#xff09;是一种战略规划工具&#xff0c;由波士顿咨询公司的创始人布鲁斯亨德森&#xff08;Bruce Henderson&#xff09;于1970年代初提出的&#xff0c;它以两个关键指标作为分析维度&#xff1a;市场增长率和相对市场份额&#xff0c;…

探索k8s集群的配置资源(secret和configmap)

目录 ConfigMap ConfigMap&#xff08;主要是将配置目录或者文件挂载到k8s里面使用&#xff09; 与Secret类似&#xff0c;区别在于ConfigMap保存的是不需要加密配置的信息。&#xff08;例如&#xff1a;配置文件&#xff09; ConfigMap 功能在 Kubernetes1.2 版本中引入&…

过期视频怎么恢复?如何从手机、电脑和其他设备中恢复?

过期视频是指那些被误删、丢失或因系统升级等原因而无法正常访问的视频文件。这些视频可能包含了我们珍贵的回忆、重要的信息或者具有商业价值的内容。过期视频的恢复可以帮助我们找回失去的数据&#xff0c;减少损失&#xff0c;提高工作效率和生活质量。过期视频怎么恢复&…

Android WebView上传文件/自定义弹窗技术,附件的解决方案

安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是&#xff1a; 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…

【AI基础】第二步:安装AI运行环境

开局一张图&#xff1a; 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本&#xff0c;上层的版本由下层版本决定 比如CUDA的版本&#xff0c;需要看显卡安装了什么版本的驱动&#xff0c;然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&#xff…

毕业论文word常见问题

0、前言&#xff1a; 这里的问题都是以office办公软件当中的word为例&#xff0c;和WPS没有关系。 1、页眉横线删不掉&#xff1a; 解决方案&#xff1a;进入页眉编辑状态&#xff0c;在开始选项栏中选择页眉字体样式&#xff0c;清除格式。 修改方式如下&#xff1a; 2、…

Linux——简单指令汇总

Linux&#xff0c;一般指GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&#xff0c;是一个…

C++ | Leetcode C++题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; class Solution { public:const int dx[4] {1, -1, 0, 0};const int dy[4] {0, 0, 1, -1};void solve(vector<vector<char>>& board) {int n board.size();if (n 0) {return;}int m board[0].size();queue<pair<…

C++类的继承与派生概念

派生和继承是自然界普遍存在的一种现象。例如&#xff0c;“猫”和“白猫”。当人们谈及“猫”时&#xff0c;知道它有4条腿&#xff0c;1条尾巴&#xff0c;抓老鼠,为哺乳动物。如谈论“白猫”时&#xff0c;它也是猫&#xff0c;只不过增加了一个新的特征&#xff0c;即它的毛…

Redis缓存(笔记二:Redis常用五大数据类型)

目录 1、Redis中String字符串 1.1 常用命令解释&#xff1a; 1.2 原子性 1.3 具有原子性的常用命令 1.4 String数据结构 1、Redis中String字符串 概念 String 是 Redis 最基本的类型&#xff0c;可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key对应一个 value…

第100天:权限提升-数据库RedisPostgre第三方软件TV向日葵服务类

目录 思维导图 案例一: 数据库-Redis 数据库权限提升-计划任务 案例二: 数据库-PostgreSQL 数据库权限提升-漏洞 PostgreSQL 提权漏洞&#xff08;CVE-2018-1058&#xff09; PostgreSQL 高权限命令执行漏洞&#xff08;CVE-2019-9193&#xff09; 案例三: 三方应用-…