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了传统的设计中,在新增测试用例之后,代码会有以下几个问题:…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

