MyBatis学习简要
目录
什么是MyBatis?
MyBatis实现的设想
MyBatis基于配置文件的开发步骤
mybatis的配置文件
Mapper代理开发
配置文件完成增删改查的三步
注解开发
一、条件查询
参数接收时,参数的设置:
动态条件查询:
二、添加功能
步骤:
Mybatis事务:
返回添加数据的主键:
三、修改功能
四、删除功能
参数传递
单个参数:
多个参数
mybatis常见问题
学习资料:
01-MyBatis简介_哔哩哔哩_bilibili
什么是MyBatis?
- MyBatis是一款持久层框架
- MyBatis是半自动的ORM框架,开发时,需要手动编写SQL语句
- 相比JDBC,MyBatis提供了输入映射和输出映射,便于进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提高了开发的效率。
MyBatis实现的设想
- 使用数据库连接池管理数据库连接
- 将sql语句及占位符号和参数全部配置在xml中
- 将查询的结果集自动映射成java对象
MyBatis基于配置文件的开发步骤
- 编写全局配置文件configuration
- 编写mapper映射文件,mapper.xml,书写SQL,并定义好SQL的输入、输出参数
- 加载全局配置文件,生成SqlSessionFactory
- 创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作
优点:
- 相较于基于注解的开发,用配置文件更方便后续代码的维护
mybatis的配置文件
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAllases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
<configuration><!--全局配置文件的配置顺序如下properties //引入放置了数据源信息的properties文件settings //用来开启或关闭mybatis的一些特性typeAliases //配置SQL语句的输入、输出参数细节要求等typeHandlers //用来处理java类型和jdbc类型之间的转换objectFactory //用于创建对象实例,用得少plugins //用来配置mybatis的插件environments //用来配置数据源environmenttransactionManagerdataSourcemappers-->
</configuration>
Mapper代理开发
- 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。接口和配置文件分开放,但包目录结构是一样的
- 设置SQL映射文件中的namespace属性为Mapper接口全限定名
- 在Mapper接口中定义方法,方法名就是SQL映射文件中的sql语句中的id,并保持参数类型和返回值类型一致
- 编码:
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sql的执行
//获取接口代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //执行方法,即执行sql语句 List<User> users=userMapper.selectAll();
配置文件完成增删改查的三步
- 编写接口方法
- 编写SQL
- 执行方法
注解开发
- 注解用于完成简单功能;配置文件用于完成复杂功能
- 常用注解:
- 查询:@Select
- 添加:@Insert
- 修改:@Update
- 删除: @Delete
@Select("select * from tb_user where id=#{id}") public User selectById(int id); //不用写xml文件了
一、条件查询
参数接收时,参数的设置:
- 散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称")
- 对象参数:对象的属性名称要和参数占位符名称一致
- map集合:SQL中的参数名要和map集合的键的名称一致
动态条件查询:
- if:用于判断参数是否有值
- test:逻辑表达式,进行条件判断
- 存在的问题:由于条件数目变化,where可能会和and连接,构成语句错误
- 解决法一:使用恒等式
- 解决法二:使用<where>标签替换where关键字
二、添加功能
步骤:
- 1、编写接口方法:Mapper接口
void add(Brand brand);- 2、编写SQL语句:SQL映射文件
<insert id="add">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brandName},#{companyName},#{ordered},#{description},#{status}); </insert>- 3、执行方法,测试
Mybatis事务:
- 1、openSession():默认开启事务,需要使用sqlSession.commit();手动提交事务
- 2、openSession(true):自动提交事务
返回添加数据的主键:
- 1、添加两个属性
2、。。。
三、修改功能
- 普通修改和动态修改
- 步骤:
- 1、编写接口方法:Mapper接口
void update(Brand brand);- 2、编写SQL语句:SQL映射文件
<update id="update">update tb_brand;<set><if test="brandName !=null and brandName !=''">brand_name=#{brandName},</if><if test="companyName !=null and companyName !=''">companyName=#{companyName},</if><if test="ordered !=null">ordered=#{ordered},</if><if test="description !=null and description !=''">description=#{description},</if><if test="status !=null">status=#{status}</if></set>where id=#{id}; </update>- 3、执行方法,测试
四、删除功能
- 删除单个和批量删除
- 步骤:
- 1、编写接口方法:Mapper接口
void deleteByIds(@Param("ids") int[] ids);- 2、编写SQL语句:SQL映射文件
<delete id="deleteByIds">delete from tb_brandwhere id in (<foreach collection="ids" item="id" separator=",">#{id}</foreach>); </delete> <!-- mybatis会将数组参数封装为一个Map集合,所以需要foreach来遍历1、默认:array=数组 2、使用@Param注解来改变map集合的默认key的名称 -->- 3、执行方法、测试
参数传递
- Mybatis接口方法对 接收到的不同的参数 用ParamNameResolver类 进行 不同的封装处理
单个参数:
- 1、POJO类型:直接使用,属性名和参数占位符名称一致
- 2、Map集合:直接使用,键名和参数占位符名称一致
- 3、Collection:封装成Map集合
- map.put("arg0",collection集合);
- map.put("collection",collection集合);
- 4、List:封装成Map集合
- map.put("arg0",list集合);
- map.put("collection",list集合);
- map.put("list",list集合);
- 5、Array:封装成Map集合
- map.put("arg0",数组);
- map.put("array",数组);
- 6、其他类型
多个参数
封装成Map集合
User select(@Param("username")String username,String password);封装成Map集合后,建议使用@Param注解,替换Map集合中默认的键名,并使用修改后的名称来获取值,提高可读性
mybatis常见问题
- SQL映射文件的警告,无法识别表信息
- 解决:在idea中配置mysql数据库连接
- 实体类属性名和数据库表列名不一致,不能自动封装数据
- 解决:使用<resultMap>
- 使用参数占位符${}时,会存在sql注入问题
- 解决:使用#{}
- SQL语句中的特殊字符报错,比如"<"
- 解决:使用转义字符,比如"<"表示"<"
相关文章:
MyBatis学习简要
目录 什么是MyBatis? MyBatis实现的设想 MyBatis基于配置文件的开发步骤 mybatis的配置文件 Mapper代理开发 配置文件完成增删改查的三步 注解开发 一、条件查询 参数接收时,参数的设置: 动态条件查询: 二、添加功能 步骤…...
forlium 笔记 Map
用于创建交互式地图 1 主要参数 1.1. location 地图位置 地图的经纬度 import foliumm folium.Map(location[31.186358, 121.510256],zoom_start15)m 1.2 tiles 内置样式 默认是OpenStreetMap 1.2.1 Stamen Terrain 它强调了地形特征,如山脉、河流和道路 m …...
解读亚马逊云科技语义搜图检索方案
图像检索(包括文搜图和图搜图)是各个行业中常见的一个应用场景。比如在电商场景中,基于以图搜图做相似商品查找;在云相册场景中,基于文搜图来找寻所需的图像素材。 传统基于标签的图像检索方式,即先使用目标…...
git基本使用
1、创建仓库,提交代码 Git 全局设置: git config --global user.name "许歌" //全局绑定用户名 git config --global user.email "12075507xu-ge111user.noreply.gitee.com" //全局绑定邮箱创建 git 仓库: mkdir t…...
为C# Console应用化个妆
说到Windows的cmd,刻板印象就是黑底白字的命令行界面。跟Linux花花绿绿的界面比,似乎单调了许多。但其实C#开发的Console应用也可以摆脱单调非黑即白的UI。 最近遇到个需求,要在一堆纯文本文件里找指定的关键字(后续还要人肉判断…...
VUE环境下 CSS3+JS 实现发牌 翻牌
创建牌容器(关键点:overflow:hidden): <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…...
WSL Opencv with_ffmpeg conan1.60.0
我是ubuntu18. self.options[“opencv”].with_ffmpeg True 关键是gcc版本需要conan支持,比如我的是: compilergcc compiler.version7.5 此外还需要安装系统所需库: https://qq742971636.blog.csdn.net/article/details/132559789 甚至来…...
Android中正确使用Handler的姿势
在Android中,Handler是一种用于在不同线程之间传递消息和任务的机制。以下是在Android中正确使用Handler的一些姿势: 1. 在主线程中创建Handler对象 在Android中,只有主线程(也称为UI线程)可以更新UI。因此ÿ…...
webSocket前后端交互pc端版
前端代码 <!--* Author: 第一好帅宝* Date: 2023-08-29 16:12:26* LastEditTime: 2023-08-29 16:54:50* FilePath: \websocket\ceshi.html --> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&…...
Java-day13(枚举与注解)
枚举与注解 枚举 1.自定义枚举 如果枚举只有单个成员,则可以作为单例模式的实现方式 public class test{ public static void main(String[] args) { Season spring Season.spring;System.out.println(spring);spring.show();System.out.println(…...
vue PDF或Word转换为HTML并保留原有样式
方法一 要将PDF或Word转换为HTML并保留原有样式,可以使用pdfjs-dist和mammoth.js这两个库。首先需要安装这两个库: npm install pdfjs-dist mammoth.js然后在Vue项目中使用这两个库进行转换: import * as pdfjsLib from pdfjs-dist; impor…...
华硕笔记本摄像头倒置怎么办?华硕笔记本摄像头上下颠倒怎么调整
笔记本电脑相较于台式电脑,更易携带,解决了很大一部分人的使用需求。但是笔记本电脑也存在很多不足,比如华硕笔记本电脑就经常会出现摄像头倒置的错误,出现这种问题要如何修复呢?下面就来看看详细的调整方法。 华硕笔记…...
本地套接字通信
1.本地套接字 本地套接字的作用:本地的进程间通信 有关系的进程间的通信 没有关系的进程间的通信 本地套接字实现流程和网络套接字类似,一般采用TCP的通信流程 2.本地套接字通信的流程 - tcp // 服务器端 1.创建监听的套接字int lfd socket(AF_U…...
数据结构(Java实现)-优先级队列(堆)
队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队 列在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就…...
算法通关村第8关【黄金】| 寻找祖先问题
思路:递归三部曲 第一步:确定参数和返回值 题目要求找到指定的结点,就需要返回结点。 题目又涉及到p,q就需要传入p,q,需要遍历传入root 第二步:确定终止条件 当遍历到结点为空说明到底没找到返回空 或者遍历到p,…...
栈和队列(详解)
一、栈 1.1、栈的基本概念 1.1.1、栈的定义 栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。 栈顶(Top):线性表允许…...
iOS开发Swift-3-UI与按钮Button-摇骰子App
1.创建新项目Dice 2.图标 删去AppIcon,将解压后的AppIcon.appiconset文件拖入Assets包。 3.将素材点数1-6通过网页制作成2x,3x版本并拖入Asset。 4.设置对应的UI。 5.拖入Button组件并设置style。 6.Ctrl加拖拽将Button拖拽到ViewController里࿰…...
1、[春秋云镜]CVE-2022-32991
文章目录 一、相关信息二、解题思路(手注)三、通关思路(sqlmap) 一、相关信息 靶场提示:该CMS的welcome.php中存在SQL注入攻击。 NVD关于漏洞的描述: 注入点不仅在eid处!!ÿ…...
pdf如何删除其中一页?了解一下这几种删除方法
pdf如何删除其中一页?随着电子文档的广泛应用,PDF已成为最常见的文档格式之一。然而,有时候你可能会发现,你的PDF文档中包含了一些多余的页面,或者你需要删除其中的某一页。那么,该如何删除PDF中的页面呢&a…...
PO设计模式是selenium自动化测试中最佳的设计模式之一
Page Object Model:PO设计模式是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,也就是在实际测试中只关注业务流程就OK了传统的设计中,在新增测试用例之后,代码会有以下几个问题:…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

