秋招Java后端开发冲刺——Mybatis使用总结

一、基本知识
1. 介绍
- MyBatis 是 Apache 的一个开源项目,它封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要再进行繁琐的 JDBC 编码。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO(Plain Old Java Objects)到数据库中的记录。
- MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
2. 特点
- SQL 优先:MyBatis 让 SQL 语句可以清晰地写在 XML 文件或注解中,支持动态 SQL。
- 简单易用:简化了 JDBC 代码,专注于 SQL 本身。
- 灵活性强:可以根据需要自定义 SQL 语句,满足复杂查询需求。
- 支持多种数据库:支持 MySQL、PostgreSQL、Oracle 等主流数据库。
3. Maybatis VS JDBC
| 特性 | JDBC | MyBatis |
|---|---|---|
| SQL 编写与管理 | 手动编写 SQL 并嵌入 Java 代码中。SQL 管理复杂,维护困难。 | SQL 语句可放在 XML 文件或注解中,代码与 SQL 分离,结构清晰。 |
| 参数处理 | 手动设置 SQL 语句中的参数,代码量大且易出错。 | 自动处理参数设置,简化代码。 |
| 结果集映射 | 手动处理结果集并映射为 Java 对象,过程繁琐。 | 自动将结果集映射为 Java 对象,支持复杂对象映射。 |
| 数据库连接管理 | 需手动管理数据库连接和资源,易出现资源泄漏。 | 使用内置连接池,自动管理连接,减少资源泄漏风险。 |
| 事务管理 | 需手动处理事务。 | 提供方便的事务管理功能,可通过配置或编程方式管理事务。 |
| 动态 SQL 支持 | 需通过字符串拼接实现动态 SQL,易引发 SQL 注入问题,代码难维护。 | 提供强大的动态 SQL 支持,通过 XML 标签或注解生成动态 SQL,安全易维护。 |
| 缓存支持 | 不直接提供缓存机制,需自行实现。 | 内置一级缓存和二级缓存,通过配置轻松启用缓存。 |
| 开发效率 | 需编写大量样板代码,开发效率较低。 | 减少样板代码,提高开发效率。 |
| 灵活性 | 提供底层 API,允许对数据库操作进行精细控制。 | 提供灵活的 SQL 控制,适合需要直接编写 SQL 的场景。 |
二、Mybatis的基本使用
1. 环境配置
- 添加依赖(以 Maven 为例):在配置文件中添加mybtis依赖
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version>
</dependency>
2. 配置数据库连接
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/UserMapper.xml"/></mappers>
</configuration>
3. 基本使用(以用户管理为例)
- 创建用户实体类
public class User {private int id;private String name;private String email;private int age;private String address;
}
- 定义mapper接口
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
//简单的查询实际上不用定义XML文件,直接在mapper接口上面即可@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);List<User> getAllUsers();@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}
- 编写 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.example.mapper.UserMapper"><select id="getAllUsers" resultType="User">SELECT * FROM users</select><insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users (name, email, age, address) VALUES (#{name}, #{email}, #{age}, #{address})</insert><update id="updateUser" parameterType="User">UPDATE users SET name = #{name}, email = #{email}, age = #{age}, address = #{address} WHERE id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete>
</mapper>
注:Mybatis使用只需要定义mapper接口,不用再有具体的实现
三、Mybatis动态sql
MyBatis 提供了强大的动态 SQL 功能,允许开发者根据不同的条件动态生成 SQL 语句。动态 SQL 通常用于处理复杂的查询条件或可选的查询参数。MyBatis 的动态 SQL 是通过 XML 配置文件中的一些特殊标签来实现的,这些标签包括 if, choose, when, otherwise, trim, where, set 和 foreach 等。长常见标签的使用如下:
1. if 标签
- if标签用于根据条件动态生成 SQL 片段。如果条件为真,则包含该 SQL 片段;否则忽略。
<select id="findUsers" parameterType="map" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="email != null">AND email = #{email}</if><if test="age != null">AND age = #{age}</if></where>
</select>
2. choose>标签
- choose 标签类似于 Java 中的 switch 语句,用于选择其中一个条件。它包含多个 when 标签和一个可选的 otherwise 标签。
- 示例
<select id="findUser" parameterType="map" resultType="User">SELECT * FROM users<where><choose><when test="id != null">AND id = #{id}</when><when test="name != null">AND name = #{name}</when><otherwise>AND email = #{email}</otherwise></choose></where>
</select>
3. where标签
- where 标签自动添加 WHERE 关键字,并处理 SQL 片段的 AND/OR 前缀,在条件中使用动态sql时就需要使用where标签。
- 示例
<select id="findUsers" parameterType="map" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="email != null">AND email = #{email}</if><if test="age != null">AND age = #{age}</if></where>
</select>
4. set 标签
- set 标签用于生成 UPDATE 语句中的 SET 子句,自动处理末尾的逗号。
- 示例
<update id="updateUser" parameterType="User">UPDATE users<set><if test="name != null">name = #{name},</if><if test="email != null">email = #{email},</if><if test="age != null">age = #{age},</if><if test="address != null">address = #{address}</if></set>WHERE id = #{id}
</update>
5. foreach 标签
- foreach 标签用于处理集合类型参数,如 List、Set 或数组。
- 示例
<select id="findUsersByIds" parameterType="list" resultType="User">SELECT * FROM users WHERE id IN<foreach item="id" index="index" collection="list" open="(" separator="," close=")">#{id}</foreach>
</select>
四、使用注意事项
- Mapper接口和XML映射文件
- 确保 XML 映射文件中的 namespace 与 Mapper 接口的全限定名完全匹配。
- XML 映射文件中的 SQL 语句 ID 必须与 Mapper 接口中的方法名一致。
- 确保 Mapper 接口方法的参数类型与 XML 中定义的 parameterType 一致。
- 确保 Mapper 接口方法的返回类型与 XML 中定义的 resultType 或 resultMap 一致。
- 其他
- 如果 Mapper 接口方法有多个参数,XML 中需要使用 @Param 注解来指定参数名称,或者使用 Map 作为参数类型
- 当查询结果与实体类字段不完全匹配时,可以使用 ResultMap 进行映射
- 在使用动态 SQL 时,尽量使用 MyBatis 提供的参数绑定方式,而不是直接拼接字符串,以防止 SQL 注入
- 如果在 Mapper 接口中使用注解来定义 SQL 语句,则不需要在 XML 中重复定义,但确保注解和方法签名一致
相关文章:
秋招Java后端开发冲刺——Mybatis使用总结
一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目,它封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO(Plain …...
怎么压缩视频文件?简单的压缩视频方法分享
视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高,文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件,使其既能保持清晰,又能轻松分享?今天,给大家分享五种实用的视频压缩方法,快来…...
【Oracle】Oracle语法之递归查询
目录 递归查询使用场景备注 语法相关属性解释 案例基本使用升级版-带上递归查询的属性 总结: 递归查询 Oracle的递归查询是指在一个查询语句中使用自引用的方式进行循环迭代查询。它可以用于处理具有层次结构的数据,如组织架构、产品类别等。递归查询通…...
【教程】Vue2中使用svg矢量图
1.npm导包 npm i svg-sprite-loader --save2.创建目录放入svg文件,创建SvgIcon.js 3.SvgIcon.js const req require.context(./svg, false, /\.svg$/) const requireAll requireContext > requireContext.keys().map(requireContext) requireAll(req)4.vue.c…...
简约唯美的404HTML源码
源码介绍 简约唯美的404HTML源码,很适合做网站错误页,将下面的源码放到一个空白的html里面,然后上传到服务器里面即可使用 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…...
PDF 转图片并插入到 EXCEL 再转PDF
pom.xml 引用 <dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>21.11</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>as…...
jmeter之变量随机参数化以及解决多线程不会随机变化
参考链接: https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函数多线程运行时数据不会随机变化?_jmeter 线程组循环执行时 变量不变-CSDN博客 1、如下图所示,需要对请求参数 autor 和phone进行随机参数化 2、目前有…...
24/7/12总结
axios Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…...
sentinel网关限流配置及使用
sentinel控制台源码:https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包:https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…...
# 如何解决 App Store 审核中的 4.3(a) 问题:Guideline 4.3(a) - Design - Spam
如何解决 App Store 审核中的 4.3(a) 问题:Guideline 4.3(a) - Design - Spam 4.3(a) 审核问题是指:你的应用与其他开发者提交的应用在二进制文件、元数据和/或概念上存在相似之处,仅有微小差别。这通常会导致你的应用被视为垃圾应用而被拒绝…...
最长上升子序列(LIS)
最长上升子序列(最长递增子序列,LIS) 给定长度为 n n n的序列 v v v,求此序列中严格递增(上升)的子序列长度最大值(子序列可由原序列中不连续的元素构成) 朴素DP( O ( n 2 ) O(n^2) O(n2)) 闫氏DP分析法 状态表示: 集合 d p dp dp:所有满足…...
自动驾驶车道线检测系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection
文章目录 1. 摘要概述2. 背景介绍3. 方法3.1 俯视图投影3.2 网络结构3.2.1 投影变换层3.2.2 投影变换层3.2.3 道路投影预测分支 3.3 车道预测头3.4 训练和真实值关联 4. 实验4.1 合成 3D 车道数据集4.2 真实世界 3D 车道数据集4.3 评估结果4.4 评估图像仅车道检测 5. 总结和讨论…...
手工创建 postgres kamailio 数据库
测试环境如下: postgres server 16: ip 地址为 192.168.31.100,用户 postgres 的密码为 ****** kamailio v5.7.5: ip 地址为 192.168.31.101 1.1. 创建 kamailio 用户和 kamailio 数据库 ssh 登陆 kamailio (192.168.31.101)&a…...
装饰设计模式
装饰设计模式应用在IO流上面可以得到体现 装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能。 原来的inputstream已经可以读取数据了,但是是一个字节一个字节的读取的,为了优化这个我们采用了buffered,…...
Linux 线程初步解析
1.线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列。在linux中,由于线程和进程都具有id,都需要调度等等相似性,因此都可以用PCB来描述和控制,线程含有PCB&am…...
为ppt中的文字配色
文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色,有如下几点: 1.可以使用对比色,表示强调。 2.可以使用近似色,使得和谐统一。 3.最好一张ppt中,使用的颜色不超过三种主要颜色。 但我想强调…...
python-区间内的真素数(赛氪OJ)
[题目描述] 找出正整数 M 和 N 之间(N 不小于 M)的所有真素数。真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为真素数。 例如,11,13 均为真素数,因为 11 的反序…...
TCP/IP、UDP、HTTP 协议介绍比较和总结
TCP/IP、UDP、HTTP是网络通信中的三种重要协议,各自具有不同的特点和应用场景。以下是对这三种协议的详细介绍、比较和总结。 TCP/IP协议 传输控制协议/互联网协议(TCP/IP, Transmission Control Protocol/Internet Protocol) 特点: 可靠性:TCP提供可靠的通信,通过握手…...
Unity Meta Quest 开发:如何在每只手指上添加 Poke 交互
XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 找到玩家物体 OVRCameraRig 下的子物体 HandInteractorsRight/Left(分别管理左右手的 Interactor)下的 HandPokeInteractor 子物体&#x…...
MyBatis的原理?
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数及获取结果集。MyBatis可以通过简单的XML或注解来配置和映射原生类型、接口和Java的POJOs(Plain Old Java Objects)为…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
