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了传统的设计中,在新增测试用例之后,代码会有以下几个问题:…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

