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了传统的设计中,在新增测试用例之后,代码会有以下几个问题:…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...