Mybatis编写SQL

文章目录

  • 一、用注解编写
    • 1.1 增
      • 普通增加
      • 获取自增ID
    • 1.2 删和改
    • 1.3 查
      • 单表查询
      • 多表查询
  • 二、用xml编写
    • 2.1 使用xml的流程
    • 2.2 增
      • 普通增加
      • 获取自增ID
    • 2.3 删 和 改
    • 2.4 查
  • 三、#{} 和 ${}
    • 3.1 #{} 、${}
    • 3.1 预编译 SQL 、即时编译SQL

两种写法是可以同时存在的

一、用注解编写

1.1 增

普通增加

  1. 拼接字符串:如果注解里面的字符串太长了,可以用 +即【拼接字符串】的方式。直接按回车即可。
  2. 返回值:增删改时,返回值可以为Integer,也可以为void。但我们一般还是会设置为Integer的,因为【有时候我们的程序是否执行成功,是没有什么提示的,此时,我们就可以用“受影响的行数”来判断程序有无执行成功】
    • 当为Integer时,返回的是“受影响的行数”
    • 为void就什么都不返回
  3. 参数:也可以一个一个传。因为要传的参数比较多,此处是用对象来传参
@Mapper
public interface UserInfoMapper {@Insert("insert into userinfo (username, password, age, gender, phone)" +"values(#{username}, #{password}, #{age}, #{gender}, #{phone})")Integer insert(UserInfo userInfo);
}

获取自增ID

  1. 使用场景:有很多服务都是需要拿到id后,才能进行下一步操作。如订单团队,需要获取你的订单ID,后续才能进行支付对账操作。
  2. 代码:使用@Options注解
    • useGeneratedKeys:是否自动生成key,默认为false,这里要设置为 true
    • keyProperty:要把生成的key(主键)的值赋值给谁。下面示例中是赋值给了userinfo对象的id属性。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo (username, password, age, gender, phone)" +"values(#{username}, #{password}, #{age}, #{gender}, #{phone})")
Integer insert(UserInfo userInfo);

1.2 删和改

  1. 删除
 @Delete("delete from userinfo where id = #{id}")Integer delete(Integer id);
  1. 修改
@Mapper
public interface UserInfoMapper {@Update("update userinfo set age = #{age} where id = #{id}")Integer update(UserInfo userInfo);
}
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setAge(22);userInfo.setId(11);Integer res = userInfoMapper.update(userInfo);//使用返回值判断【程序是否正确运行】if (res > 0){log.info("数据更新成功");}}
}

1.3 查

单表查询

  1. 不带有参数
@Mapper
public interface UserInfoMapper {@Select("select * from userInfo")List<UserInfo> selectAll();
}
  1. 带参数
    • 如果只有一个参数,名称是可以不匹配的,但通常情况下,为了方便去阅读,我们还是会让他们保持一致
    • 如果有多个参数,是需要我们匹配的

参数匹配

@Mapper
public interface UserInfoMapper {@Select("select * from userInfo where id = #{id}")UserInfo selectUser(Integer id);
}

参数不匹配

@Mapper
public interface UserInfoMapper {@Select("select * from userinfo where id = #{id}")UserInfo selectUser(Integer id123);
}

多表查询

  1. 避免使用多表查询:我们要尽量避免使用多表查询,尤其是性能要求很高的项目

    • 原因
      • :如果查询两个表分别要10s,把他们放在一起查询肯定会大于10s,因为多表查询还有【整理】的操作
      • 程序员不可控:Java方面可以使用多线程的方式优化多表查询,但如果直接使用多表查询的SQL语句,相当于直接把优化的操作交给了Mysql,程序员层面无法再优化了
      • 会影响其他项目:通过情况下,数据库是集群使用的,即很多项目都会用到一个数据库。此时,当出现慢查询时,会影响整个集群,即会影响到所有使用该集群的项目。
      • 扩容效率低:当要进行扩容操作时,Java服务器扩容十分方便,但是数据库集群扩容就需要专门的人员来处理,十分麻烦
    • 多表查询的优势:操作简单。如果使用多线程优化,我们还需要进行逻辑上的处理,所以一些对性能要求不是很高的项目,还是可以使用多表查询的
  2. 如何使用多表查询:直接用多表查询的SQL + Java对象有对应的属性

    • 原理:Mybatis不在乎是多表SQL还是单表SQL
      • Mybatis的工作是把这个方法的SQL语句发送给Mysql,在Mysql给我们返回一个结果(可以通过打印的Mybatis日志查看)后,Mybatis进行结果映射,并按照方法定义返回对应的值
      • 所以,Mybatis根本不关注SQL是单表还是多表,它所关注的只是如何进行结果映射,我们只要确保对象里有对应的属性就行。

在这里插入图片描述

二、用xml编写

2.1 使用xml的流程

  1. 配置数据库资源:和注解时配置的一样
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
  1. 配置路径
    在这里插入图片描述
  2. 对xml进行声明
    • namespace:表示要实现哪个接口,要求写接口的全限定类名(如果按住ctrl能来到想要的接口,就说明没有写错路径)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMLMapper"></mapper>
  1. 编写xml
    • 换行规则:xml的SQL区域,换行直接敲回车即可,整块会被当成一个字符串
    • 返回类型的指定:只有查询时,需要去说明返回的类型,其他的增删改则不需要指定
      • 指定返回类型的规则
        • 使用全限定类名
        • 不需要指定返回的是List,Mybatis能识别出我们返回的是List 还是 其他的数据类型
@Mapper
public interface UserInfoXMLMapper {List<UserInfo> selectAll();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMLMapper"><select id="selectAll" resultType="com.example.demo.model.UserInfo">select * from userinfo	<!-->直接在这里写SQL语句即可<--></select>
</mapper>

2.2 增

普通增加

  1. 未重命名
@Mapper
public interface UserInfoXMLMapper {Integer insert(UserInfo userInfo);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMLMapper"><insert id="insert">insert into userinfo (username, password, age, gender, phone)values(#{username}, #{password}, #{age},#{gender}, #{phone})</insert>
</mapper>
  1. 重命名:重命名方法和【注解方式】一致
@Mapper
public interface UserInfoXMLMapper {Integer insert(@Param("user") UserInfo userInfo);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMLMapper"><insert id="insert">insert into userinfo (username, password, age, gender, phone)values(#{user.username}, #{user.password}, #{user.age},#{user.gender}, #{user.phone})</insert>
</mapper>

获取自增ID

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMLMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, password, age, gender, phone)values(#{username}, #{password}, #{age},#{gender}, #{phone})</insert>
</mapper>

2.3 删 和 改

  1. 删除
<delete id="delete">delete from userinfo where id = #{id}
</delete>
  1. 修改
<update id="update">update userinfo set age = #{age} where id = #{id}
</update>

2.4 查

  1. 关于resultType的指定
    • 范围:只有查询操作需要指定
    • 使用方法:使用全限定类名。不需要指定返回的是List,Mybatis能识别出我们返回的是List 还是 其他的数据类型
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMLMapper"><select id="selectAll" resultType="com.example.demo.model.UserInfo">select * from userinfo	<!-->直接在这里写SQL语句即可<--></select>
</mapper>

三、#{} 和 ${}

3.1 #{} 、${}

  1. 使用方面:优先使用#,不能直接使用#,就搭配内置函数或写多个接口等,最后考虑用$
  2. #{}、${}区别
    • 共同点:都是用来获取变量的值
    • 不同点
      • #{}是预编译SQL,${}是即时编译SQL
      • 特殊情况下不能直接使用#
  3. 无法使用直接#的场景:当参数为String,自动加的引号多此一举时。如排序、模糊查询、表名字段名等作为了参数。下面的解决方法其实也是#{}解决SQL注入的方法。
    • 升序降序:如果升序降序是参数,即使我们加了引号也无法运行
      在这里插入图片描述

    • 模糊查询
      在这里插入图片描述

3.1 预编译 SQL 、即时编译SQL

  1. 什么是预编译SQL 和 即时编译SQL
    • 预编译SQL:编译后缓存,后续从缓存拿,直接执行
      • 编译一次后会将编译后的SQL语句缓存起来,后续再执行这条语句时,不会再次编译(只是输入的参数不同),省去了前面的过程,直接执行,以此来提高效率
      • 相当于是一个框架,给你提前预留好一个位置,不管你是什么,都会把你作为id的参数塞进去
    • 即时编译SQL:直接去拼接,不管你这个参数里面是什么样,直接去拼上,也就会有【SQL注入】的问题了。

在这里插入图片描述
在这里插入图片描述

  1. 预编译SQL VS 即时编译SQL区别
    • 性能对比:预编译SQL占优
      • 预编译SQL:因为有缓存,可以直接去拿,性能高
      • 即时编译SQL:当出现【select * from bookinfo where id = ‘1’】的情况时,虽然 Mysql 会自动转化类型,代码依旧可以正常运行。但是当类型不一样时,有可能会出现一些性能问题
    • SQL注入问题:预编译SQL不存在SQL注入的问题,$则有
      • 什么是SQL注入问题:当参数中有SQL语句,可能会把这个语句当做SQL执行。
      • 示例:如【select * from bookinfo bookName = ‘’ or 1 = ‘1’]】,实际需求是要找bookName为【'or 1 = '1】的数据,但由于前后引号闭合了,or直接作为SQL语句执行,最终出现了bug

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

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

相关文章

mediasoup基础概览

提示&#xff1a;本文为之前mediasoup基础介绍的优化 mediasoup基础概览 架构&#xff1a;2.特性&#xff1a;优点缺点 3.mediasoup常见类介绍js部分c 4.mediasoup类图5.业务类图 Mediasoup 是一个构建在现代 Web 技术之上的实时通信&#xff08;RTC&#xff09;解决方案&#…

快速排序详讲(两种方法)

目录 原理 实现方式 正常实现 理由 先从右到左&#xff0c;在从左到右 先从左到右&#xff0c;先从右到左 挖坑法 效率 优化 测试 代码 原理 快速排序是将最左侧的数字当作关键数字&#xff0c;将关键数字放在对应位置&#xff0c;且关键数字左侧均大于它&#xff…

模拟集成电路(6)----单级放大器(共源共栅级 Cascode Stage)

模拟集成电路(6)----单级放大器&#xff08;共源共栅级 Cascode Stage&#xff09; 大信号分析 对M1 V x ≥ V i n − V T H 1 V x V B − V G S 2 V B ≥ V i n − V T H 1 V G S 2 V_{x}\geq V_{in}-V_{TH1}\quad V_{x}V_{B}-V_{GS2}\\V_{B}\geq V_{in}-V_{TH1}V_{GS2} Vx…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转&#xff0c;然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

进程——linux

目录 冯诺依曼体系结构&#xff08;计算机组成原理与体系结构&#xff09; 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…

盒模型及其应用(溢出、外边距塌陷)

一、盒模型 盒模型详解-CSDN博客 CSS学习笔记3&#xff1a;CSS三大特性、盒子模型-CSDN博客 1.盒模型组成 &#xff08;1&#xff09;padding padding和border都会撑大盒子&#xff0c;margin不会. 如果没有指定盒子的width/height&#xff0c;那么padding不会撑大盒子。 &am…

详解动态库和静态库

文章目录 前言静态库静态库制作静态库的生成发布静态库使用静态库安装静态库卸载静态库 动态库动态库的制作动态库的生成动态库的发布使用动态库 动态库VS静态库 前言 在C、C中我们使用过标准库&#xff0c;比如在使用strerror、vector、string等时&#xff0c;都只是调用了这…

【对算法期中卷子的解析和反思】

一、程序阅读并回答问题&#xff08;共30分&#xff09; #include<cstdio>#include<cstring>#include<iostream>using namespace std;char chess[10][10];int sign[10];int n, k, ans;void dfs(int x, int k) { if (k 0){ans;return; } if (xk-1 >…

智能学工系统实现学生管理

人才培养是高校的榜首要务&#xff0c;高校在抓好学生教育作业的一起&#xff0c;更多的是要加强对学生的办理作业。作为在校大学生健康成长的指导者和引路人&#xff0c;面临很多的学生办理作业内容杂乱&#xff0c;事无巨细&#xff0c;但在传统的办理方式下&#xff0c;尽管…

Java集合:数据存储与操作的瑞士军刀

Java集合概述 集合是用来存储多个元素的容器。文章从四个方面来概述下集合&#xff0c;让读者对集合有一个大致的了解。 一、 多样化的容器 Java 集合大致包含 2 大体系 Collection体系 List&#xff1a;存储有序、重复的元素 Set&#xff1a;存储无序、不可重复的元素…

摸鱼大数据——Hive函数7-9

7、日期时间函数 Hive函数链接&#xff1a;LanguageManual UDF - Apache Hive - Apache Software Foundation SimpleDateFormat (Java Platform SE 8 ) current_timestamp: 获取时间原点到现在的秒/毫秒,底层自动转换方便查看的日期格式 常用 to_date: 字符串格式时间…

【Self-Attention——Transform—Bert】相关的基础理论

1.Self-Attention模型图解 传统的循环神经网络&#xff0c;如上左图1&#xff0c;并不能解决并行化的问题&#xff0c;右图就是一个self-Attention可以实现并行化&#xff0c;并且能解决对于所有信息的读取利用。 将self—Attention替换相应的GRU或者RNN&#xff0c;就能实现从…

单片机原理及应用复习

单片机原理及应用 第二章 在AT89S52单片机中&#xff0c;如果采用6MHz晶振&#xff0c;一个机器周期为 2us 。 时钟周期Tocs1focs 机器周期 Tcy12focs 指令周期&#xff1a;一条指令所用的时间&#xff0c;单字和双字节指令一般为单机器周期和双机器周期。 AT89S5…

Sentinel限流学习

Sentinel限流学习 初识Sentinel运行sentinel雪崩问题服务保护技术对比微服务整合Sentinel 限流规则簇点链路 流控模式-关联流控模式-链路流控模式有哪些&#xff1f; 流控效果流控效果-warm up流控效果-排队等待 热点参数限流隔离和降级Feign整合Sentinel线程隔离有两种方式实现…

【论文复现|智能算法改进】基于多策略麻雀搜索算法的机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进的无限折叠迭代混沌映射 无限折叠迭代映射(ICMIC) 常用于图像加密方向的研究, 基本思想是首先生成[0,1]之间的混沌序列, …

摸鱼大数据——Hive函数10-12

10、堆内存错误 报错&#xff1a; Error while processing statement: FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Java heap space 解决方案: 在node1上面操作即可 方式1: 找到/export/server/hive/conf/hive-env.sh,添…

CTF本地靶场搭建——静态flag题型的创建

静态flag题型的创建 首先这里要说的是静态flag和动态flag。 在CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;静态flag的使用通常与特定的赛制或题目类型关联&#xff0c;而不是直接与题型绑定。静态flag意味着这些flag是预先设定好的&#xff0c;不会随比…

MySQL 导出导入的101个坑

最近接到一个业务自行运维的MySQL库迁移至标准化环境的需求&#xff0c;库不大&#xff0c;迁移方式也很简单&#xff0c;由开发用myqldump导出数据、DBA导入&#xff0c;但迁移过程坎坷十足&#xff0c;记录一下遇到的各项报错及后续迁移注意事项。 一、 概要 空间问题源与目…

排序进阶----快速排序

当我们写了插入和希尔排序后&#xff0c;我们就应该搞更难的了吧。大家看名字就知道我们这篇博客的内容了吧。而且从名字上来看。快速排序就很快吧。那么为什么这个排序怎么能叫快速排序啊。我们希尔排序不是很快嘛。那么我们的快速排序肯定是有特殊之处嘞。不然这就太自负了。…