MyBatis初阶
概述mybatis就是使用注释就能够完成JDBC需要大量做的事情但终归会有不能SQL语句,参数赋值,结果映射Mapper public interface UserInfoMapper { Select(select * from user_info) ListUserInfo selectAll(); }此时需要测试一下是否成功只要有mybatis依赖,就需要添加数据库信息基础操作打印日志打印出来的信息可以比作调试,能够看到sql语句的执行、执行传递的参数以及执行结果.在配置文件中进行配置mybatis: configuration: # 配置打印 MyBatis⽇志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl参数传递以及赋值方法中的参数传递到此方法之后,使用#{}获取方法中的参数,进行赋值Select(select * from user_info where id #{id}) ListUserInfo selectById(Integer id);参数重命名#{}必须和Param中的名字一致Select(select * from user_info where id #{id} and age #{age}) ListUserInfo selectByIdAndAge(Param(id) Integer id, Integer age);增Insert(insert into user_info (username,password,age,gender) values (#{username},#{password},#{age},#{gender})) Integer insertUser(UserInfo userInfo);//添加Param注释之后userInfo就不能自动赋值了,生成参数 Insert(insert into user_info (username,password, age ,gender) values (#{uerInfo.username},#{userInfo.password},#{userInfo.age},#{userInfo.gender})) Integer insertUser2(Param(userInfo) UserInfo userInfo);返回主键//插入想要得到id,keyProperty需要一个属性来接收 Options(useGeneratedKeys true,keyProperty id) Insert(insert into user_info (username,password,age,gender) values (#{username},#{password},#{age},#{gender})) Integer insertUser(UserInfo userInfo);删Delete(delete from user_info where id#{id}) Integer deleteById(Integer id);改Update(update user_info set username#{username} where id#{id}) void updateUsername(String username,Integer id);查使用SQL语句查询时,通过测试方法发现, 发现有一些字段没有进行赋值,只有Java对象属性和数据库字段一模一样时,才会赋值,那么我们通过什么方法才能够赋值?对SQL语句起别名// Select(select id,username,password,age,gender,phone,delete_flag as deleteFlag, // create_time as createTime,update_time as updateTime // from user_info)结果映射数据库查询到的结果与java对象属性进行映射Results({ Result(column delete_flag ,property deleteFlag), Result(column create_time ,property createTime), Result(column update_time ,property updateTime) }) Select(select id, username, password, age, gender, phone, delete_flag, create_time, update_time from user_info) ListUserInfo selectAll();如果其他SQL也想复用这个映射关系就需要:Results(id resultMap,value { Result(column delete_flag ,property deleteFlag), Result(column create_time ,property createTime), Result(column update_time ,property updateTime) }) Select(select id, username, password, age, gender, phone, delete_flag, create_time, update_time from user_info) ListUserInfo selectAll(); ResultMap(value resultMap) Select(select * from user_info where id #{id}) ListUserInfo selectById(Integer id);开启驼峰命名数据库一般时蛇形命名,而Java属性一般通过驼峰命名,怎么才能够自动启动映射呢?D:在配置文件添加mybatis: configuration: map-underscore-to-camel-case: true #配置驼峰⾃动转换MyBatisXMl配置文件mybatis开发有两种方式:1.使用注解2.使用XML配置文件MyBatis XML方式需要两步1.配置连接字符串(和注解的配置文件一样)和MyBatismybatis: mapper-locations: classpath:mybatis/**Mapper.xml2.写持久层代码方法定义:interfaceMapper public interface UserInfoXmlMapper { ListUserInfo selectAll(); ListUserInfo selectById(Integer id); ListUserInfo selectByIdAndGender(Integer id,Integer gender); Integer insertUser(UserInfo userInfo); Integer insertUser2(Param(userInfo) UserInfo userInfo); Integer deleteById(Integer id); void updateUsername(String username,Integer id); }方法实现:XXX.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.Kon.mybatis.mapper.UserInfoXmlMapper !--只有select需要对象映射,resultType -- select idselectAll resultTypecom.Kon.mybatis.entity.UserInfo select id, username, password, age, gender, phone, delete_flag, create_time, update_time from user_info /select select idselectById resultTypecom.Kon.mybatis.entity.UserInfo select * from user_info where id #{id} /select select idselectByIdAndGender resultTypecom.Kon.mybatis.entity.UserInfo select * from user_info where id #{id} and gender #{gender} /select insert idinsertUser useGeneratedKeystrue keyPropertyid insert into user_info (username,password,age,gender) values (#{username},#{password},#{age},#{gender}) /insert insert idinsertUser2 insert into user_info (username,password,age,gender) values (#{userInfo.username},#{userInfo.password},#{userInfo.age},#{userInfo.gender}) /insert delete iddeleteById delete from user_info where id#{id} /delete update idupdateUsername update user_info set username#{username} where id#{id} /update /mapperXML起别名和注释是非常相似的#{}和${}的区别#{}是预编译SQL,${}是即时SQL性能即时SQL每次都需要进行SQL语法解析、SQL优化、SQL编译,而预编译SQL再进行编译参数传递为String时,#{}会加引号,而${}不会安全使用${}可能会导致SQL注入SQL注入:通过改变事先预定好的参数的SQL语句,以达到执行代码对服务器进行攻击的方法select * from user_info where username or 1 1即时SQL是将参数进行拼接,而预编译SQL就已经确定这个位置应该放入哪些具体的数据排序功能${}还是有一些用处的,此处的${order}是不需要加引号的,因为排序不需要加 Select(select * from user_info order by id ${order}) ListUserInfo selectUserByOrder(String order);有 $ 的地方就会有SQL注入的问题,解决办法:规定只能有asc或者desc,定义为枚举就可以了Like查询使用#{}查不出来自动会加引号,但使用${}可以查出来但是依旧会有SQL注入的问题,那么我们就使用mysql的内置函数来解决Select(select * from user_info where username like concat(%,#{key},%)) ListUserInfo queryAllUserByLike(String key);数据库连接池用户多次创建和销毁连接会消耗比较多的资源,那么数据库连接池会提前创建多个连接,也就是多个连接对象,用户请求连接时,将连接对象connection获取给用户,SQL语句执行完之后再还给数据库连接池如果要切换连接池,只需要引入相关依赖即可

相关新闻

iceberge分区特性

iceberge分区特性

1.4 Iceberg 特点详述 1.4.1 Iceberg 分区与隐藏分区(Hidden Partition) 这部分介绍了 Iceberg 的分区机制及其带来的便利。 基本功能:Iceberg 支持分区来加速查询。写入数据时,相似的数据行会被分组;查询时&#xff0…

2026/7/18 5:51:13阅读更多 →
Unity视频播放进阶:从VideoPlayer.Play()到事件驱动与跨平台优化

Unity视频播放进阶:从VideoPlayer.Play()到事件驱动与跨平台优化

1. 项目概述:为什么VideoPlayer.Play()只是起点?如果你在Unity里处理视频,大概率用过VideoPlayer.Play()。点一下,视频开始播放,看起来一切顺利。但当你需要实现“视频播完自动跳转场景”、“根据播放进度更新UI进度条…

2026/7/18 5:51:13阅读更多 →
AI Skills:大语言模型的能力扩展包

AI Skills:大语言模型的能力扩展包

1. 为什么说Skills是AI时代的APP?十年前我们下载APP是为了让手机具备新功能,如今给AI安装Skills也是同样的逻辑。Skills本质上是一组预设的工作流和知识模板,它们教会大语言模型如何完成特定任务。就像APP扩展了智能手机的能力边界一样&#…

2026/7/18 5:46:13阅读更多 →
Ubuntu 18.04虚拟机编译Android源码实战指南

Ubuntu 18.04虚拟机编译Android源码实战指南

1. Ubuntu 18.04虚拟机环境下编译Android源码全指南在虚拟机环境中编译Android源码是许多开发者必经的"成人礼"。我曾在不同配置的机器上完成过数十次完整编译,从最初耗时两天一夜的煎熬到现在三小时搞定,积累了不少实战经验。本文将基于Ubunt…

2026/7/18 6:51:17阅读更多 →
【技术突破】隐私优先的离线OCR革命:Umi-OCR如何重新定义文字识别体验

【技术突破】隐私优先的离线OCR革命:Umi-OCR如何重新定义文字识别体验

【技术突破】隐私优先的离线OCR革命:Umi-OCR如何重新定义文字识别体验 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维…

2026/7/18 6:51:17阅读更多 →
解锁AI自动化:Awesome-Dify-Workflow带你玩转可视化工作流

解锁AI自动化:Awesome-Dify-Workflow带你玩转可视化工作流

解锁AI自动化:Awesome-Dify-Workflow带你玩转可视化工作流 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-D…

2026/7/18 6:51:17阅读更多 →
让你的老款Mac重获新生:OpenCore Legacy Patcher全面指南

让你的老款Mac重获新生:OpenCore Legacy Patcher全面指南

让你的老款Mac重获新生:OpenCore Legacy Patcher全面指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为老款Mac无法升级到最新macO…

2026/7/18 6:51:17阅读更多 →
JavaScript Proxy与Reflect:元编程核心技术与应用

JavaScript Proxy与Reflect:元编程核心技术与应用

1. Proxy与Reflect:JavaScript元编程的双子星在JavaScript的世界里,Proxy和Reflect这两个ES6引入的特性,为开发者提供了强大的元编程能力。它们就像是一对默契的搭档,Proxy负责拦截和自定义对象的基本操作,而Reflect则…

2026/7/18 6:51:17阅读更多 →
前端HTTP请求:Fetch API与Axios对比指南

前端HTTP请求:Fetch API与Axios对比指南

1. 前端HTTP请求的两种主流方案在现代前端开发中,HTTP请求是与后端交互的核心手段。目前主流方案主要有两种:浏览器原生提供的Fetch API和第三方库Axios。这两种方案各有特点,适用于不同的开发场景。Fetch API作为现代浏览器原生支持的API&am…

2026/7/18 6:46:16阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →