MyBatis基础之执行SQL

news/2024/5/14 20:23:11/文章来源:https://blog.csdn.net/m0_73393501/article/details/133069764

在这里插入图片描述

文章目录

  • 执行 SQL 语句
    • 1. 增删改操作
      • insert 元素
      • insert 过程中的主键回填
      • delete 元素 和 update 元素
    • 2. getMapper 方法
    • 3. 查操作
      • select 元素
      • select 与 聚合函数
    • 4. 传递多个参数
      • 使用 Map 传递多参数
      • 使用 JavaBean 传递多参
      • 使用注解方式传递多参数

执行 SQL 语句

Mapper 是 MyBatis 最强大的工具与功能,它用于执行 SQL 语句。

<?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="..."><insert id="..."> ... </insert><delete id="..."> ... </delete><update id="..."> ... </update><select id="..."> ... </select>
</mapper>
元素描述备注
select查询语句,常用又复杂可以自定义参数,返回结果集等
insert插入语句执行后返回一个整数,代表插入的条数
update更新语句执行后返回一个整数,代表更新的条数
delete删除语句执行后返回一个整数,代表删除的条数
resultMap定义查询结果映射关系,常用又复杂它将提供映射规则

1. 增删改操作

insert 元素

insert 元素的必要属性有 :

元素名说明
id和 Mapper 的 namespace 组合起来是唯一的,提供给 MyBatis 调用。
parameterType类的完全限定名,或内置/自定义的类的别名(Alias)。
可以向 SQL 传递 JavaBean 和 Map 等复杂参数类型,但 Map 参数不建议使用

MyBatis 在执行插入之后会返回一个 整数,以表示插入的记录数。

<insert id="insertDepartment" parameterType="com.xja.hemiao.bean.Department">INSERT INTO dept(dname, loc) VALUES(#{dname}, #{loc});
</insert>

在传递参数时,MyBatis 中可用的占位符有两种:#{}${}

  • #{}:MyBatis 使用的是 JDBC 中的 PreparedStatement
  • ${}:MyBatis 使用的是 JDBC 中的 Statement
--   #{}是占位符,会进行预编译,传参 'admin' or '1'='1', 0
-- ${}是直接替换,可能会改变你的sql语法(sql注入)传参  
select * from users where username=#{} and password = #{}username = '' admin' or '1'='1'' and password = '0'select * from users where username=${} and password =${}username = 'admin' or '1'='1' and password = '0'--  从消耗来说,二者单次的消耗是相同的,批处理时预编译则更友好,缓存重复利用,
-- 当然 就算是#{}也不是完全保证sql的安全,之后可以增加逻辑判断,密码加密等手段
// 这是一个相较于 classpath 的文件路径名。而且,不需要使用 / 。
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();Department dept = new Department("Test", "BeiJing");
int n = session.insert("xxx.yyy.zzz.insertDepartment", dept);System.out.println(n);      // 输出打印 1session.commit();
session.close();

insert 过程中的主键回填

大多数情况下,插入信息的主键是由数据库底层生成的,在插入数据后,我们往往需要这个主键,以便于未来的操作。为此,MyBatis 提供了主键回填功能。这个功能需要数据库和数据库驱动支持,MyBatis 才能正常使用它。

开启主键回填功能的 insert 必要属性:

属性说明
useGeneratedKeys启用主键回填功能的开关属性。"true"
keyProperty指定需要回填的 Bean 属性(对应数据库主键列的那个属性)

如果你有大量的 insert 都要用到主键回填功能,而你又觉得要在所有的这些 <insert ...> 中每一个都去写 userGeneratedKeys="true" 很麻烦,MyBatis 的核心配置文件中的 <settings> 中有一个全局设置,可以帮你批量开启所有的 <insert ...> 的主键回填功能:

<settings>...<!-- 默认值是 false 。因此你要一个个地写。 --><setting name="useGeneratedKeys" value="true" />...
</settings>

[!attention] 注意
留意 <settings> 的位置。MyBatis 对配置文件的内容的先后顺序有要求。

delete 元素 和 update 元素

和 insert 元素一样,MyBatis 执行完 update 元素 和 delete 元素后会返回一个整数,标示执行后影响的记录条数。

<update id="updateDepartment" parameterType="dept">UPDATE dept SET dname = #{dname}, loc = #{loc} WHERE deptno = #{deptno}
</update><delete id="deleteDepartment" parameterType="int">DELETE FROM dept WHERE deptno = #{deptno}
</delete>
....
session.insert("xxx.yyy.zzz.insertDepartment", dept);
....
session.update("xxx.yyy.zzz.updateDepartment", dept);
....
session.delete("xxx.yyy.zzz.deleteDepartment", 41);
....

2. getMapper 方法

通过 SqlSession 的 insert、upate、delete 和 selectOne、selectList 方法可以去调用 Mapper.xml 中定义的配置文件,进而操作数据库。不过,MyBatis 提供了更『高端』的操作,『帮』程序员去实现 DAO 层代码。

如果将 Mapper.xml 配置文件的 namespace 故意写的和一个 DAO 接口的完全路径名一样,并且该接口中的方法名有“碰巧”和 Mapp.xml 配置文件中的各个 SQL 语句的 id 值一样,那么 MyBatis 就会去为该接口动态生成一个实现类。

通过 SqlSession 的 getMapper 方法传入接口的类对象,就可以获得这个由 MyBatis 动态生成的 DAO 接口的实现类。

3 个“保持一致”:

  • Mapper.xmlnamespace 与接口的完全限定名保持一致。

  • SQL 语句的 id 属性值与接口中的方法名保持一致。

  • SQL 语句的 parameterType 属性值与接口的方法的参数类型保持一致。

package xxx.yyy.zzz.dao;public interface DepartmentDao {public List<Department> listDepartments();...
}
<mapper namespace="xxx.yyy.zzz.dao.DepartmentDao"> <!-- 注意,此处是接口的完全限定名字。--><select id="listDepartments" resultType="dept">SELECT * FROM dept</select>...
</mapper>
DepartmentDao dao = session.getMapper(DepartmentDao.class);List<Department> list = dao.listDepartments();

3. 查操作

select 元素

通过 MyBatis 执行 SQL 后,MyBatis 通过其强大的映射规则,可以自动地将返回的结果集绑定到 JavaBean 中。

select 元素的必要属性有:

属性说明
id和 Mapper 的 namespace 组合起来必须唯一
parameterType类的完全限定名,或内置/自定义的类的别名(Alias)
。可以向 SQL 传递 JavaBean 和 Map 等复杂参数类型。
resultType类的完全限定名,查询结果将通过固定规范进行映射;
或者定义为 int、double、float 等参数。
resultMapresultType 的「高级版」,允许我们自定义映射规则。
不能与 resultType 同时使用

select 与 聚合函数

并不是所有的 select 语句都会返回一行,或多行记录。例如,在 select 中使用聚合函数。这种情况对于 MyBatis 而言最为简单,因为不需要将结果集映射成 JavaBean ,它只需要返回一行一列的单个数据。

<select id="getMaxSal" resultType="int">SELECT * FROM dept WHERE deptno = #{deptno}
</select><!-- 此处特意是 string 类型,以验证效果 -->
<select id="getEmployeeCount" resultType="string">SELECT count(empno) FROM emp;
</select>
int n = session.selectOne("xxx.yyy.zzz.getMaxSal");
System.out.println(n);String str = session.selectOne("xxx.yyy.zzz.getemployeeCount");
System.out.println(str);

MyBatis 可以很智能地将返回结果转换为你所指定的类型,如:int、String 等。

4. 传递多个参数

多参数的传递有三种方法:

传递方式说明
使用 Map 传参不建议使用(已被 JavaBean 传参替代)
使用 JavaBean 传参大量多参 传递时使用
使用 注解 传参少量多参 传递时使用

使用 Map 传递多参数

MyBatis 支持 Map 对象作为参数,此时,要求 select 元素的 parameterType 值为 map

List<Employee> selectBySal1(Map<String, Integer> salMap);
<select id="selectBySal1" parameterType="map" resultType="Employee">select * from emp where sal >= #{minSal} and sal &lt; #{maxSal}
</select>
Map<String, Integer> map = new HashMap<>();
map.put("minSal", 1000);
map.put("maxSal", 2000);List<Employee> list = dao.selectBySal1(map);
for (Employee emp : list) {log.info("{}", emp);
}

使用 JavaBean 传递多参

由于 Map 的无语义性,因此官方 不建议使用 Map 传参!

此时,要求 select 元素的 parameterType 属性值为 JavaBean 的完全限定名(或别名)。

@Data
public class SallaryRegion {private Integer minSallary;private Integer maxSallary;
}
List<Employee> selectBySal2(SallaryRegion region);
<select id="selectBySal2"parameterType="com.microboom.bean.po.SallaryRegion"resultType="Employee">select * from emp where sal >= #{minSallary} and sal &lt; #{maxSallary}
</select>

使用注解方式传递多参数

如果所有的多参数传递都通过定义并使用 JavaBean 来进行,那么项目中会出现大量的参数 JavaBean 的定义,显然这也并不太合理。

为此,Mybatis 提供了参数注解,以减少参数 JavaBean 的定义。

List<Employee> selectBySal3(@Param("xxx") Integer minSallary,@Param("yyy") Integer MaxSallary);
<select id="selectBySal3" resultType="Employee">select * from emp where sal >= #{xxx} and sal &lt; #{yyy}
</select>

补充MyBatis 框架的注解功能相对而言比较薄弱,官方推荐使用 XML 配置,而非注解,但是少量的多参数传递,是 必须使用注解 的场景。

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

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

相关文章

(2) Java 8 实战第二版——补充 收集数据、并行数据处理能力与性能

第6章 用Collectors类创建和使用收集器将数据流归约为一个值汇总&#xff1a;归约的特殊情况数据分组和分区开发你的自定义收集器 对一个交易列表按货币分组&#xff0c;获得该货币的所有交易额总和&#xff08;返回一个Map<Currency, Integer>&#xff09;。将交易列表…

面向组织分析的内容

声明 本文是学习GB-T 42859-2023 航天产品质量问题三个面向分析方法实施要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了航天产品质量问题三个面向分析方法实施的一般要求、程序和分析内容。 本文件适用于承担航天产品研制…

性能测试 —— Tomcat监控与调优:Jconsole监控

JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具&#xff0c;JConsole使用Java虚拟机(Java VM)&#xff0c;提供在Java平台上运行的应用程序的性能和资源消耗的信息。在Java平台&#xff0c;标准版(Java SE平台)6&#xff0c;JConsole的已经更新到目前的外观…

阿里云服务器价格表,轻量和服务器最新活动价格表汇总

租用阿里云服务器怎么收费&#xff1f;阿里云服务器配置不同一年价格也不同&#xff0c;阿里云2核2G3M带宽108元一年、2核4G4M带宽297.98元12个月&#xff0c;云服务器u1公网带宽可选1M到5M&#xff0c;系统盘为ESSD云盘40GB起&#xff0c;CPU内存配置可选2核2G、2核4G、4核8G、…

抖音seo矩阵系统源码分享-技术梳理

抖音seo源码&#xff0c;抖音seo矩阵系统源码技术搭建&#xff0c;抖音seo源码技术开发思路梳理搭建 抖音账号矩阵系统部分源代码分享 if (empty($video_item)) {$this->displayJsonError(参数错误);}$curr_platform json_decode($video_item[dv_platform], 1);$curr_plat…

牛客网Verilog刷题 | 快速入门-基础语法

1、VL1 四选一多路器 描述 制作一个四选一的多路选择器&#xff0c;要求输出定义上为线网类型 状态转换&#xff1a; d0 11 d1 10 d2 01 d3 00 信号示意图&#xff1a; 输入描述&#xff1a; 输入信号 d1,d2,d3,d4 sel 类型 wire 输出描述&#xff1a; 输出信号 mux_ou…

vim缓存-交换文件

Catf1agCTF靶场 web swp 题目链接&#xff1a;http://catf1ag.cn/ 个人博客&#xff1a;https://sword-blogs.com/ 题目考点&#xff1a; vim在编辑文档的过程中如果异常退出&#xff0c;会产生缓存文件 vim 交换文件名 参考文章&#xff1a;vim手册 https://yianwillis.…

ROS2 的行为树 — 第 1 部分:解锁高级机器人决策和控制

一、说明 在复杂而迷人的机器人世界中&#xff0c;行为树&#xff08;BT&#xff09;已成为决策过程中不可或缺的一部分。它们提供了一种结构化、模块化和高效的方法来对机器人的行为进行编程。BT起源于视频游戏行业&#xff0c;用于控制非玩家角色&#xff0c;他们在机器人领域…

云原生的简单理解

一、何谓云原生&#xff1f; 一种构建和运行应用软件的方法 应用程序从设计之初即考虑到云的环境&#xff0c;原生为云而设计&#xff0c;在云上以最佳姿势运行&#xff0c;充分利用和发挥云平台的弹性分布式优势。 二、包括以下四个要素 采用容器化部署&#xff1a;实现云平…

机器学习(17)---支持向量机(SVM)

支持向量机 一、概述1.1 介绍1.2 工作原理1.3 三层理解 二、sklearn.svm.SVC2.1 查看数据集2.2 contour函数2.3 画决策边界&#xff1a;制作网格2.4 建模画图 三、非线性情况推广3.1 查看数据集3.2 线性画图3.3 为非线性数据增加维度并绘制3D图像 四、核函数 一、概述 1.1 介绍…

hadoop测试环境sqoop使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Sqoop看这篇文章就够了_must contain $conditions in where clause._SoWhat1412的博客-CSDN博客 大数据环境 C:\Windows\System32\drivers\etc 修改ip和hostname的对应关系 1…

记一次hyperf框架封装swoole自定义进程

背景 公司准备引入swoole和rabbitmq来处理公司业务。因此&#xff0c;我引入hyperf框架&#xff0c;想用swoole的多进程来实现。 自定义启动服务封装 <?php /*** 进程启动服务【manager】*/ declare(strict_types1);namespace App\Command;use Swoole; use Swoole\Proce…

StarRocks 社区:从初生到两周年的进化之路

2021 年 9 月 8 日&#xff0c;StarRocks 开源社区诞生。从第一天开始&#xff0c;我们怀揣着“打造世界一流的数据分析产品”的梦想&#xff0c;踏上了星辰大海的征途。 两年间&#xff0c;StarRocks 在 GitHub 上收获了 5.4K Stars&#xff0c;产品共迭代发布了 90 余个版本&…

Java下打印九九乘法表

这个算法是基于打直角三角型演变而来&#xff0c;代码如下&#xff1a; public class MyWork {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System.out.print(j "x" i "" i*j "\t&qu…

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII GMAC系统框架&#xff08;EMAC是百兆mac&#xff0c; GMAC是千兆mac&#xff09;网卡网卡系统框架结构 PHY&#xff08;Physical Layer&#xff0c;物理层&#xff09;MAC(Media Access Control、媒体访问控制器)以太网结构大框架…

HTTPS 证书生成脚本详细讲解

前言 HTTPS证书的作用是用于保障网站的安全性。在HTTPS协议中&#xff0c;通过使用证书来实现客户端与服务器之间的认证和数据加密&#xff0c;防止中间人攻击、信息泄漏等安全问题的发生。https证书也就是SSL证书&#xff0c;我们首先要确定好需要 https 安全连接的域名&…

Springboot整合jdbc和Mybatis

目录 整合jdbc 1. 新建项目 2. 编写yaml配置文件连接数据库 3. 测试类 使用原生的jdbcTemplate进行访问测试 使用Druid连接池 1. 添加类型 2. 初始化连接池 3. 编写config类 配置Druid数据源监视 整合Mybatis 1. 导入依赖 2. 编写mapper接口 3. 编写实体类 4. 编…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果&#xff1a; 输入&#xff1a;nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3]&#xff0c;一共有2个 利用枚举法&#xff1a; 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

HiEV独家 | 接棒余承东,华为光产品线总裁靳玉志出任车BU CEO

作者 | 德新 编辑 | 王博 HiEV从多个信息源获悉&#xff0c;华为光产品线总裁靳玉志已于近期接任智能汽车解决方案BU CEO一职&#xff0c;而余承东担任智能汽车解决方案BU&#xff08;以下简称「车BU」&#xff09;董事长一职。 华为光产品线又称华为光传输与接入产品线&#…

极光笔记 | 大语言模型插件

在人工智能领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;是根据预训练数据集进行”学习“&#xff0c;获取可以拟合结果的参数&#xff0c;虽然随着参数的增加&#xff0c;模型的功能也会随之增强。但无论专业领域的小模型&#xff0c;还是当下最火、效果最好的大模…