目录

 

基础操作

准备:

删除:

新增:

更新:

查询:

条件查询:

XML映射文件

动态SQL

if

foreach

sql&include


 

基础操作

准备:

准备数据库表

创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)

application.properties中引入数据库连接信息

创建对应的实体类(实体类属性采用驼峰命名)

准备Mapper接口

删除:

    @Delete("delete from teachnewstudent where id=#{id}")public void delete(Long id);
特别指出占位符 #{id}

删除是由返回值的,数据的返回值改为int即可删除数据

注意事项:如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value}。

日志输出:

可以在application.properties中,打开mybatis的日志,并指定输出到控制台。

#指定mybatis输出日志的位置,输出控制台mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

预编译SQL

优势:性能更高

更安全(防止SQL注入)

SQL注入:

SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
使用#{}即为预编译

新增:

 @Insert("insert into user(name,intro,state) values(#{name},#{intro},#{state}")public void insert(User user);

 如果有多个参数可使用实体类来封装多个参数

主键返回:

描述:在数据添加成功后,需要获取插入数据库的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据。

实现:加上注解@Options(框架会自动将生成的主键值,赋值给user对象的id属性)

    @Options(keyProperty="id", useGeneratedKeys = true)@Insert("insert into user(name,intro,state)+values(#{name},#{intro},#{state}")public void insert(User user);

更新:

一般是根据主键来修改(因为主键是不改变的)

    @Update("update user set name=#{name},intro=#{intro},state=#{state} where id=#{id}")public void update(User user);

查询:

根据id查询

   @Select("select * from user where id=#{id}")public User getById(Long id);

数据封装:

实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。

如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。

解决方案:

方案一:给字段起别名,让别名与实体类属性一致

  @Select("select id,name,create_time createTime,update_time updateTime from user where id=#{id}")public User getById(Long id);

方案二:通过@Results,@Result 注解手动映射封装

 @Results({@Result(column="",property="")})@Select("select * from user where id=#{id}")public User getById(Long id);

 column为需要封装的字段,property为封装到的属性

方案三:开启mybatis的驼峰命名自动映射开关 即:a_ column------>aColumn

在application.properties配置mybatis.configuration.map-underscore-to-camel-case=true

需要严格遵守数据库名为下划线,类型名为驼峰命名

 

条件查询:

    @Select("select * from user where name like '%${name}%' and state=#{state}")public List<User> list1(String name,Short state);

因为#{}是预编译符不能出现在""之内所以需要用$符号来代替(所以存在问题性能低、不安全、存在SQL注入问题)

解决方法:concat  字符串拼接函数

    @Select("select * from user where name like concat('%',#{name},'%') and state=#{state}")public List<User> list1(String name,Short state);

 在springboot的2.x版本,参数名与注解中引用部分相同,否则需要单独加入注解

 

XML映射文件

规范:

XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。

XML映射文件的namespace属性为Mapper接口全限定名一致。

XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

目录使用/来分隔

约束:

官方文档:入门_MyBatis中文网

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"></mapper>

namespace的属性值和接口全类名保持一致

<mapper namespace="com.example.demo.mapper.UserMapper"><select id="list" resultType="com.example.pojo.User">select * from user where name like'%${name}%' and state=#{state}</select>
</mapper>

 

 插件:MyBatisX(提高MyBatis效率)能够快速定位

 

动态SQL

动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句,我们称之为 动态SQL

 

if

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

<mapper namespace="com.example.mapper.Usermapper"><select id="list" resultType="com.example.pojo.User">select * from user<where><if test="name != null">name like'%${name}%'</if><if test="state!= null">and state=#{state}</if></where></select>
</mapper>

where标签会自动去除多余的and关键字,而且会判断条件成不成立,当条件不成立时不会生成where关键字 而且会自动去除子句开头的AND或者OR

需求:动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新。

在 if 中添加 test属性即可

<set>标签替换set关键字,能够去除掉多余的逗号

foreach

进行循环遍历的标签,通常用在批量删除中

属性:

collection:遍历的集合(与参数名保持一致)

item:遍历出来的元素

separator:分隔符

open:遍历开始前拼接的SQL片段

close:遍历结束后拼接的SQL片段

<delete id="deleteByIds">delete from user where id in<foreach collection="ids" item="id" separetor="," open="(" close=")">#{id}</foreach>
</delete>

 

sql&include

sql负责抽取一个片段,而include引用一个片段进行复用

<sql id="commonSelect">select id,name
</sql>

include 的 refid属性负责指定你要引用哪个片段值,该值为select的id值

 查询一个表的全部字段时不建议使用select*,而是要罗列所有字段(select*性能较低)

<include refid="commonSelect"/>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909722.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909722.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909722.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python校园拼团系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

多模态大语言模型arxiv论文略读(127)

When SAM2 Meets Video Camouflaged Object Segmentation: A Comprehensive Evaluation and Adaptation ➡️ 论文标题&#xff1a;When SAM2 Meets Video Camouflaged Object Segmentation: A Comprehensive Evaluation and Adaptation ➡️ 论文作者&#xff1a;Yuli Zhou, …

剑指offer32_二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则返回true&#xff0c;否则返回false。 假设输入的数组的任意两个数字都互不相同。 数据范围 数组长度 [ 0 , 1000 ] [0,1000] [0,1000]。 样例 输入&…

《仿盒马》app开发技术分享-- 订单结合优惠券结算(端云一体)

技术栈 Appgallery connect 开发准备 上一节我们已经实现了优惠券的选择&#xff0c;并且成功的把券后的价格也展示给用户&#xff0c;不能使用的优惠券我们也用友好的方式告知用户&#xff0c;这一节我们来实现优惠券内容的下一步&#xff0c;优惠券内容结合订单进行结算提…

Python+Selenium+Pytest+POM自动化测试框架封装

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、测试框架简介 1&#xff09;测试框架的优点 代码复用率高&#xff0c;如果不使用框架的话&#xff0c;代码会显得很冗余。可以组装日志、报告、邮件等一些…

宋代大模型:智能重构下的文明再发现

引言&#xff1a;当汴京城遇见生成式AI 一幅动态的《清明上河图》正通过全息投影技术演绎汴京城的市井百态。这个虚实交融的场景&#xff0c;恰似宋代大模型技术的隐喻——以人工智能为纽带&#xff0c;连接起东京梦华的繁盛图景与数字时代的文明重构。作为人工智能与历史学交…

K-means++:让K-means“聪明”地选择初始中心点

大家好&#xff01;欢迎来到我的技术分享博客~ &#x1f44b; 在前两篇博客中&#xff0c;我们深入探讨了经典的 K-means 算法 以及它的优化方案 Canopy K-means。如果你还没有看过&#xff0c;强烈建议先回顾一下&#xff0c;因为今天的主题 K-means 和它们有着千丝万缕的联系…

Langchain学习笔记(1)——如何调用Huggingface的模型并实现实时返回生成结果

Langchain支持很方便的OpenAI模型的调用&#xff0c;可以做到快速开发大模型应用。但是要使用Huggingface上的开源模型就没有那么方便了&#xff0c;本文就详细阐述如何用Langchain开发基于Huggingface上的模型&#xff0c;并实时返回生成结果。 实时返回生成结果是LLM很关键的…

Java安全-常规漏洞问题(SQL注入,XXE,SSRF,RCE)

靶场搭建 靶场下载 &#xff1a; https://github.com/whgojp/JavaSecLab这个靶场是使用Springboot搭建的所以不要下载 jar 文件运行&#xff0c;要使用IDEA运行他的文件夹 先打开pom 然后进行maven一下 改一下端口 配置完成之后修改一下 运行的模式 使用phpstudy搞一个sql数…

基于视频的 AI 内存库,极速语义检索

简介 在大模型应用里&#xff0c;将文本数据分块嵌入存储在向量数据库已经是标准做法。然而&#xff0c;传统向量数据库虽然功能强大&#xff0c;但其高昂的RAM和存储需求&#xff0c;以及复杂的部署运维&#xff0c;常常让开发者望而却步。今天&#xff0c;介绍一个名为 Memv…

接口适配器模式实现令牌桶算法和漏桶算法

以下是令牌桶算法、漏桶算法和雪花算法的清晰对比解析。它们属于完全不同的技术领域&#xff0c;前两者用于流量控制&#xff0c;后者用于分布式ID生成&#xff1a; 1. 令牌桶算法&#xff08;Token Bucket&#xff09; 领域&#xff1a;流量整形 / 速率限制核心目标&#xff…

618背后的电商逻辑重构:从价格血战到价值共生

“今年终于没做数学题。” 618进行到一半&#xff0c;行云已经买了很多&#xff0c;大件的有iPad、iWatch&#xff0c;小件的有运动鞋、面膜、纸巾。往年她要凑凑减减&#xff0c;经常要找个店铺凑单&#xff0c;下完单再马上退掉&#xff0c;今年她没废太多脑细胞&#xff0c…

解决 PyTorch 与 Python 3.12 的兼容性问题:`operator torchvision::nms does not exist` 深度解析

解决 PyTorch 与 Python 3.12 的兼容性问题 问题现象错误根源分析终极解决方案🚀 推荐方案:创建 Python 3.11 虚拟环境⚡ 备选方案:使用 PyTorch 夜间构建版(Python 3.12)验证修复技术深度解析最佳实践建议问题现象 当在 Python 3.12 环境中运行以下代码时: from tran…

Git 实战场景

四、标签管理 4.1、标签的理解 在使用 Git 进行版本管理时&#xff0c;**标签&#xff08;Tag&#xff09;**扮演着非常重要的角色。它其实就是对某次提交&#xff08;commit&#xff09;的一个简洁标识&#xff0c;相当于给这次提交起了一个可读、易记的“别名”。比如&…

在同态加密系统中,参与角色以及各角色的功能作用流程图,私钥和公钥分发流程,可能遇到的攻击

一、角色划分与职责 角色身份核心任务密钥权限客户端数据所有者 &#xff08;如医院、用户&#xff09;1. 加密原始数据 2. 上传密文至服务器 3. 接收并解密结果&#xff08;可选&#xff09;持有公钥服务器计算服务提供方 &#xff08;如云平台&#xff09;1. 接收客户端密文…

langchain从入门到精通(六)——LCEL 表达式与 Runnable 可运行协议

1. 多组件 invoke 嵌套的缺点 prompt ChatPromptTemplate.from_template("{query}") llm ChatOpenAI(model"gpt-3.5-turbo-16k") parser StrOutputParser() # 获取输出内容 content parser.invoke( llm.invoke( prompt.invoke( {"query": r…

ArcGIS中批量获取输入面图层A中各要素的四至点的实现方法

一、背景及意义 在日常工作中&#xff0c;我们经常会需要获取面图层的四至点&#xff0c;我们能否在ArcGIS中直接获取面图层的四至点呢&#xff1f;答案是肯定的&#xff0c;请继续往下看。 二、大体思路 使用字段计算器计算输入面图层A中各面要素的XY的最大值和最小值&…

大IPD之——华为的战略本质与实践(二)

华为战略执行的能力如此强&#xff0c;有两个核心原因&#xff1a;一是管理体系起了非常重大的作用&#xff1b;二是企业文化导致华为的执行力特别强。华为在战略方面&#xff0c;为什么每次都能转型成功&#xff1f;背后是有很多实质性的内容支撑的。而华为如何做战略&#xf…

『大模型笔记』第3篇:多长的 Prompt 会阻塞其他请求?优化策略解析

『大模型笔记』多长的 Prompt 会阻塞其他请求?优化策略解析 文章目录 一、更简单的问题:长 Prompt 阻塞请求队列1. 请求并行预填方案(Request-Parallel Prefills)二、根本的问题(Fundamental Flaw):Token 生成被并行预填拖慢1. 解耦预填(Disaggregated Prefill):以延迟优…

21 - GAM模块

论文《Global Attention Mechanism: Retain Information to Enhance Channel-Spatial Interactions》 1、作用 这篇论文提出了全局注意力机制&#xff08;Global Attention Mechanism, GAM&#xff09;&#xff0c;旨在通过保留通道和空间方面的信息来增强跨维度交互&#xf…