当前位置: 首页 > news >正文

springboot第14集:MyBatis-CRUD讲解

注意点:增、删、改操作需要提交事务!

  • 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

编写Mapper接口类

import com.da.pojo.User;
import java.util.List;
public interface UserMapper {List<User> selectUser();
}

编写Mapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.da.dao.UserMapper"><select id="selectUser" resultType="com.da.pojo.User">select * from user</select>
</mapper>

select

  • select标签是mybatis中最常用的标签之一

  • select语句有很多属性可以详细配置每一条SQL语句

    • SQL语句返回值类型。

    • 传入SQL语句的参数类型 。

    • 命名空间中唯一的标识符

    • 接口中的方法名与映射文件中的SQL语句ID 一一对应

    • id

    • parameterType

    • resultType

在UserMapper中添加对应方法

public interface UserMapper {//查询全部用户List<User> selectUser();//根据id查询用户User selectUserById(int id);
}

在UserMapper.xml中添加Select语句

<select id="selectUserById" resultType="com.da.pojo.User">select * from user where id = #{id}
</select>

在UserMapper接口中添加对应的方法

//添加一个用户
int addUser(User user);

在UserMapper.xml中添加insert语句

<insert id="addUser" parameterType="com.da.pojo.User">insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
//修改一个用户
int updateUser(User user);
<update id="updateUser" parameterType="com.da.pojo.User">update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>

根据id删除一个用户

//根据id删除用户
int deleteUser(int id);

编写对应的配置文件SQL

<delete id="deleteUser" parameterType="int">delete from user where id = #{id}
</delete>
select * from foo where bar like #{value}select * from foo where bar like "%"#{value}"%"
configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环境变量)transactionManager(事务管理器)dataSource(数据源)databaseIdProvider(数据库厂商标识)mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->
<environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>
</environments>

子元素节点:environment

  • 具体的一套环境,通过设置id进行区别,id保证唯一!

子元素节点:transactionManager - [ 事务管理器 ]

<!-- 语法 -->
<transactionManager type="[ JDBC | MANAGED ]"/>

子元素节点:数据源(dataSource)

  • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

  • 数据源是必须配置的。

type="[UNPOOLED|POOLED|JNDI]")
  • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。

  • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

  • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

  • 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等….

Mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.da.mapper.UserMapper">
</mapper>
  • namespace中文意思:命名空间,作用如下:

    • namespace的命名必须跟某个接口同名

    • 接口中的方法与映射文件中sql语句id应该一一对应

  1. namespace和子元素的id联合保证唯一 , 区别不同的mapper

  2. 绑定DAO接口

  3. namespace命名规则 : 包名+类名

MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地减少麻烦。

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456

typeAliases优化

`<!--配置别名,注意顺序-->`
`<typeAliases>`
`<typeAlias type="com.da.pojo.User" alias="User"/>`
`</typeAliases>`

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。

作用域理解

  • SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

  • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。

  • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。

  • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。

  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。

  • 所以 SqlSession 的最佳的作用域是请求或方法作用域。

@PreAuthorize("@ss.hasPermi('system:good:list')")
@GetMapping("/list")
public TableDataInfo list()
{startPage();List<GoodsGood> list = goodsGoodService.selectGoodsGoodList();return getDataTable(list);
}
<el-col :span="1.5"><el-buttontype="warning"plainicon="el-icon-download"size="mini"@click="handleExport"v-hasPermi="['goods:good:export']">导出</el-button>
</el-col>handleExport() {this.download('goods/good/export', {...this.queryParams}, `good_${new Date().getTime()}.xlsx`)
}
d3fa58fa132f3d83fd347761c2875518.png
image.png
public class User {private int id;  //idprivate String name;   //姓名private String password;   //密码和数据库不一样!//构造//set/get//toString()
}
//根据id查询用户
User selectUserById(int id);
<select id="selectUserById" resultType="user">select * from user where id = #{id}
</select><select id="selectUserById" resultType="User">select id , name , pwd as password from user where id = #{id}
</select>
@Test
public void testSelectUserById() {SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(1);System.out.println(user);session.close();
}

使用结果集映射->ResultMap

<resultMap id="UserMap" type="User"><!-- id为主键 --><id column="id" property="id"/><!-- column是数据库表的列名 , property是对应实体类的属性名 --><result column="name" property="name"/><result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">select id , name , pwd from user where id = #{id}
</select>

自动映射在 MyBatis 中扮演着非常重要且强大的角色,其中 resultMap 元素更是起到了关键作用。使用它可以让繁琐的 JDBC ResultSet 数据提取代码中解放出来,甚至对于连接复杂语句的映射代码,一份 resultMap 也能代替数千行的代码。

ResultMap 的设计思想非常巧妙,简单语句无需配置显式的结果映射,而对于稍微复杂一点的语句,只需要描述它们之间的关系即可。

<select id="selectUserById" resultType="map">select id , name , pwd from user where id = #{id}
</select>

将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。

<select id="selectUserById" resultMap="UserMap">select id , name , pwd from user where id = #{id}
</select><resultMap id="UserMap" type="User"><!-- id为主键 --><id column="id" property="id"/><!-- column是数据库表的列名 , property是对应实体类的属性名 --><result column="name" property="name"/><result column="pwd" property="password"/>
</resultMap>

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

相关文章:

springboot第14集:MyBatis-CRUD讲解

注意点&#xff1a;增、删、改操作需要提交事务&#xff01; 为了规范操作&#xff0c;在SQL的配置文件中&#xff0c;我们尽量将Parameter参数和resultType都写上&#xff01; 编写Mapper接口类 import com.da.pojo.User; import java.util.List; public interface UserMapper…...

ES6新特性(1)

目录 一、字符串扩展 &#xff08;1&#xff09;字符串遍历器接口&#xff08;for...of...&#xff09; &#xff08;2&#xff09;模板字符串 二、字符串新增方法 &#xff08;1&#xff09;包含方法 &#xff08;2&#xff09;重复方法 &#xff08;3&#xff09;补全方…...

这就是二分查找?(C语言版)

大家好&#xff01;我又来了&#xff0c;哈哈~今天我要和大家分享一种神奇的算法——二分查找&#xff01;你可能会问&#xff0c;“二分查找有什么好玩的&#xff1f;”但在我看来它就像一场魔法表演&#xff0c;当你输入一个数&#xff0c;他会在一堆数中快速找到它的位置。找…...

操作系统之内存管理

连续分配 一、单一连续 直接为要运行的进程分配一个内存&#xff0c;只适合单任务&#xff0c;只能用于单对象、单任务&#xff0c;内存被分配为系统区和用户区&#xff0c;系统区在低地址&#xff0c;用户区是一个用户独享 二、等分分区 由于分配一个内存只能执行单任务&a…...

【Python | matplotlib】matplotlib.cm的理解以及举例说明

文章目录 一、模块介绍二、颜色举例 一、模块介绍 matplotlib.cm是Matplotlib中的一个模块&#xff0c;它提供了一组用于处理颜色映射&#xff08;colormap&#xff09;的函数和类。颜色映射是一种将数值映射到颜色的方法&#xff0c;常用于制作热力图、等值线图、散点图等。 …...

数据库单实例升级

一、单实例环境,全时长二个半钟多。详细图文说明到这下载 1、停止所有oracle相关进程。 Emctlstop dbconsole Isqlplusctl stop Lsnrctl stop sqlplus /nolog sql>conn /as sysdba Connectedtoanidleinstance. sql>shutdown 然后&#xff0c;冷备份下数据库cp…...

Photoshop如何使用选区之实例演示?

文章目录 0.引言1.利用快速选择工具抠图2.制作网店产品优惠券3.利用选区改变眼睛颜色4.抠取复杂的花束5.制作丁达尔光照效果6.利用选区调整图像局部颜色 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及…...

ThreadLocal的使用介绍和底层原理解析和开源框架的使用实例

文章目录 ThreadLocal的使用介绍和底层原理解析和开源框架的使用实例ThreadLocal简介ThreadLocal使用示例ThreadLocal原理解析Spring中ThreadLocal的应用小结ThreadLocal的使用步骤常见面试题案例解析(框架源码经典案例)案例实战 ThreadLocal的使用介绍和底层原理解析和开源框架…...

带你学c带你飞-P7取值范围

比特位 CPU能读懂的最小单元——比特位&#xff0c;bit&#xff0c;b 字节 内存机构的最小寻址单元——字节&#xff0c;Byte&#xff0c;B 1Byte8bit 进制 怎么算 注意&#xff1a;int默认是signed类型&#xff0c;signed类型第一位是符号位 符号位 存放signed类型的存…...

ramfs, rootfsinitramfs

什么是ramfs? ramfs是一个非常简单的文件系统&#xff0c;它将Linux的磁盘缓存机制(页面缓存和dentry缓存)导出为一个动态可调整大小的基于ram的文件系统。 Linux通常将所有文件缓存在内存中。从后备存储(通常是挂载文件系统的块设备)读取的数据页被保留下来&#xff0c;以防…...

十三届蓝桥杯研究生组国赛-最大公约数(线段树+二分)

十三届蓝桥杯研究生组国赛-最大公约数 1、问题描述2、解题思路2.1 解法一:暴力查询区间gcd(75%)2.2 解法二:线段树+二分法(AC)1、问题描述 问题描述 给定一个数组, 每次操作可以选择数组中任意两个相邻的元素 x , y x,y x,y...

数据结构——二叉树层序遍历

数据结构——二叉树层序遍历 107. 二叉树的层序遍历 II199. 二叉树的右视图思路&#xff1a; 637. 二叉树的层平均值 107. 二叉树的层序遍历 II 107. 二叉树的层序遍历 II 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节…...

【微机原理】8088/8086微处理器

目录 一、8088/8086的功能结构 1.总线接口部件&#xff08;BIU&#xff09; 2.执行部件&#xff08;EU&#xff09; 二、8088/8086的寄存器结构&#xff08;14个&#xff09; 溢出标志的概念 溢出和进位的区别 8086CPU是Intel系列的16位微处理器&#xff0c;他有16根数据…...

springboot第12集:DAO功能代码

在Spring Boot中&#xff0c;DAO是数据访问对象的缩写&#xff0c;它是一种设计模式用于提供对数据库操作的抽象层。通过使用DAO模式&#xff0c;我们可以将数据操作与业务逻辑分离&#xff0c;并提供一个单独的接口来执行所有的数据库操作。 在Spring Boot中&#xff0c;通常使…...

基于KZG多项式承诺方案的RLN

1. 引言 RLN——Rate-Limiting Nullifier为PSE团队主导的项目&#xff0c;源自&#xff1a; Barry White Hat 2019年博客 Semaphore RLN, rate limiting nullifier for spam prevention in anonymous p2p setting RLN&#xff08;Rate-Limiting Nullifier&#xff09;是一种…...

《站在巨人的肩膀上学习Java》

Java从诞生距今已经有28年了&#xff0c;在这段时间里&#xff0c;随着Java版本的不断迭代&#xff0c;Java新特性的不断出现&#xff0c;使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一&#xff0c;Java一直排行在编程语言热门程度的前3名。 可想而…...

敏捷ACP.敏捷估计与规划.Mike Cohn.

第一部分 传统规划失败的原因 vs 敏捷规划有效的原因 传统的项目规划方式往往会让我们失望。要回答-一个 新产品的范围/进度/资源的组合问题&#xff0c;传统规划过程不一定会产生令人非常满意的答案和最终产品。以下- -些论据可以支持这个结论: ●大约2/3的项目会显著超…...

[创新工具和方法论]-01- DOE课程基础知识

文章目录 1.DOE实验设计的介绍1.1 什么是实验设计DOE?1.2 DOE的优势有哪些?1.3 如何开展DoE研究&#xff1f;步骤 2.DOE实验培训3.数据分析步骤4.实验的随机化5.偏差6.R方 相关系数假设检验 7.三因子二水平全因子设计 1.DOE实验设计的介绍 实验设计是一种安排实验和分析实验数…...

LeetCode-1033. 移动石子直到连续

题目链接 LeetCode-1033. 移动石子直到连续 题目描述 题解 题解一&#xff08;Java&#xff09; 作者&#xff1a;仲景 这题目挺难懂的&#xff0c;得画画图才能更好的理解 这也是LeetCode的尿性&#xff0c;习惯了&#xff0c;非得整这种别人看不懂的鸟语 你可以这样理解&a…...

JVM调优入门指南:掌握步骤、参数和场景

前言 作为Java开发者&#xff0c;我们经常需要优化应用的性能&#xff0c;其中JVM调优是非常重要的一部分。在本文中&#xff0c;我们将介绍JVM调优的一般步骤和方法&#xff0c;了解JVM调优参数&#xff0c;如堆大小、新生代比例、GC算法等参数的作用和配置方式&#xff0c;并…...

5步搞定OpenClaw+Qwen3-32B:RTX4090D镜像一键接入实战

5步搞定OpenClawQwen3-32B&#xff1a;RTX4090D镜像一键接入实战 1. 为什么选择云端沙盒方案 当我第一次听说OpenClaw这个开源自动化框架时&#xff0c;内心既兴奋又忐忑。作为一个喜欢折腾新技术的开发者&#xff0c;我迫不及待想尝试这个能像人类一样操作电脑的AI助手。但看…...

AI训练师真实收入全景图:软件测试员的蓝海突围指南

一、薪资迷雾&#xff1a;从“月入六万神话”到基层现实2026年AI训练师岗位呈现极端薪资分化&#xff0c;需穿透表象看本质&#xff1a;头部光环案例&#xff1a;大厂高阶岗位&#xff08;如AI伦理设计师、大模型优化专家&#xff09;年薪可达60-100万元&#xff0c;但通常要求…...

eSearch终极指南:5分钟掌握OCR屏幕工具的强大功能

eSearch终极指南&#xff1a;5分钟掌握OCR屏幕工具的强大功能 【免费下载链接】eSearch 截屏 离线OCR 搜索翻译 以图搜图 贴图 录屏 滚动截屏 Screenshot OCR search translate search for picture paste the picture on the screen screen recorder 项目地址: https://gitco…...

OpenClaw极简部署:5分钟体验Qwen3.5-9B基础自动化功能

OpenClaw极简部署&#xff1a;5分钟体验Qwen3.5-9B基础自动化功能 1. 为什么选择这个组合&#xff1f; 第一次听说OpenClaw时&#xff0c;我正被日常重复性工作困扰——每天要手动整理会议纪要、归档文件、检查数据报表。作为一个技术背景的产品经理&#xff0c;我既想要自动…...

中文语义相似度计算新范式:技术演进与实践路径

中文语义相似度计算新范式&#xff1a;技术演进与实践路径 【免费下载链接】Awesome-Chinese-LLM 整理开源的中文大语言模型&#xff0c;以规模较小、可私有化部署、训练成本较低的模型为主&#xff0c;包括底座模型&#xff0c;垂直领域微调及应用&#xff0c;数据集与教程等。…...

一键部署生产力:星图平台OpenClaw+Qwen3.5-9B体验

一键部署生产力&#xff1a;星图平台OpenClawQwen3.5-9B体验 1. 为什么选择云端沙盒方案 上周我在本地尝试部署OpenClaw时&#xff0c;经历了Python版本冲突、CUDA驱动不兼容等一系列典型环境问题。当看到星图平台提供预装OpenClawQwen3.5-9B的完整镜像时&#xff0c;第一反应…...

ComfyUI工作流迁移终极指南:从新手到专家的完整备份与复用教程

ComfyUI工作流迁移终极指南&#xff1a;从新手到专家的完整备份与复用教程 【免费下载链接】ComfyUI 最强大且模块化的具有图形/节点界面的稳定扩散GUI。 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI 想要将精心设计的AI创作工作流在不同设备间无缝迁移吗…...

如何用AnythingLLM构建企业级知识库:从零到一的完整指南

如何用AnythingLLM构建企业级知识库&#xff1a;从零到一的完整指南 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08;L…...

CosyVoice模型怎么选?300M、0.5B、SFT、Instruct版本差异与实战效果对比

CosyVoice模型选型指南&#xff1a;从参数规模到微调版本的深度解析 当你成功安装CosyVoice后&#xff0c;打开pretrained_models目录可能会被琳琅满目的模型文件搞得一头雾水——300M、0.5B、SFT、Instruct这些后缀究竟意味着什么&#xff1f;作为一款新兴的开源语音合成系统&…...

Dify + Weaviate/Qdrant混合重排架构实践(支持动态权重调度、Fallback降级与A/B测试埋点)

第一章&#xff1a;Dify重排序架构的核心设计哲学Dify 的重排序&#xff08;Reranking&#xff09;模块并非简单叠加于检索之后的后处理步骤&#xff0c;而是在整个 LLM 应用生命周期中承担语义对齐、意图强化与可信度校准三重使命的设计原语。其核心哲学可凝练为&#xff1a;*…...