八、MyBatis

一、MyBatis介绍

MyBatis 是持久层框架,它支持自定义 SQL、存储过程以及⾼级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置 和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.1 MyBatis功能
MyBatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具
2.2 框架交互流程图
MyBatis 也是⼀个 ORM 框架, ORM(Object Relational Mapping),即对象关系映射。在面向 对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动的完成数据与对象 的互相转换:
(1)将输⼊数据(即传⼊对象)+SQL 映射成原生SQL
(2)将结果集映射为返回对象,即输出对象 ORM 把数据库映射为对象:
  • 数据库表(table)—> 类(class) 
  • 记录(record,行数据)—> 对象(object) 
  • 字段(field) —> 对象的属性(attribute)
一般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。 也就是说使用MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换。

二、搭建MyBatis开发环

添加MyBatis框架时要同时添加对应数据库驱动,他们总是成对存在
项目所需基本依赖
创建完SSM项目,项目中添加了Mybatis + MySQL.之后,项目启动,一定会报错!!!这是正常现象,因为没有配置数据库连接信息
2.1 注解实现Mybatis操作

yml文件配置数据库连接信息

spring:datasource:
#    user是数据库的名称url: jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false
#    数据库用户名username: root
#    数据库密码password: "123456"
通过注解来进行数据库的操作
(1)@Select//Mapper层
@Mapper
public interface UserMapper {//查询所有⽤⼾ @Select("select * from userinfo")public List queryAllUser();
}//service层
@Service
public class UserService {@Autowiredprivate   UserMapper userMapper;//查询所有用户public List<UserInfo> queryAllUser(){return userMapper.queryAllUser();}
}//controller层
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;//查询所有用户@RequestMapping("/queryAllUser")public List<UserInfo> queryAllUser(){return userService.queryAllUser();}
}使⽤#{} 的方式获取⽅法中的参数
public interface UserInfoMapper {@Select("select * from userinfo where id= #{id} ")UserInfo queryById(Integer id);
}
数据库中的字段名与Java中对象名字不一致时,如何配置让数据库与属性匹配?
2.2 XML实现Mybatis(前提配置Maven)
2.2.1 配置数据库连接信息
1、配置数据库连接信息
spring:datasource:
#    user是数据库的名称url: jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false
#    数据库用户名username: root
#    数据库密码password: "123456"driver-class-name: com.mysql.cj.jdbc.Driver
2.2.2 配置 MyBatis 映射文件位置路径
这个配置使 MyBatis 能够扫描指定目录下的所有映射文件,并将它们加载到 MyBatis 的配置中,以便在运行时使用这些映射文件中的 SQL 语句和映射规则。此处映射到当前目录的mapper目录下的所有带有·Mapper.xml的文件
声明接口
@Mapper
public interface UserXmlMapper {
//声明查询所有用户信息的接口
   public List<UserInfo> queryXmlAllUser();
}
2.2.3 xml文件实现sql语句查询

三、解决数据库字段名与java对象属性名不一致问题

如果Java属性和mysql的字段一样, mybatis会进行自动赋值,如果不一样,则不赋值
(1)起别名
(2)结果映射
使⽤ id 属性给该 Results 定义别名,使⽤ @ResultMap 注解来复⽤其他定义的 ResultMap
(3)开启驼峰命名
驼峰命名规则:abc_xyz=>abcXyz
• 表中字段名:abc_xyz
• 类中属性名:abcXyz
三、mybatis进阶
3.1 #{属性名}和${属性名}区别
当是$时,sql语句id中会被直接替换为设置的值
当是#时,sql语句中为预编译处理会被替换为?占位符
因此当 $: 如果是整数时,不受影响,当为字符串时直接为username=张三,但是sql只能识别username='张三',所以推荐使用#更安全
但在特定情况下只能使用$
比如给查询的数据排序select * from userinfo order by desc
此时传入排序规则desc/asc(逆序/顺序)必须使用 $直接替换,否则使用#会预编译处理识别成字符串加引号,这样sql识别,语句就会发生错误
#和$区别
1.$存在SQL注入的问题,会将参数作为sql的一部分,造成信息泄露等问题
2.$直接替换;#是预处理。
3. $使用注意事项:一定是可以穷举的值,在使用之前一定要对传递的值进行合法性验证(安全性验证)。

四、动态SQL

4.1 if标签
//Controller
//1、if标签
@RequestMapping("/addUserByIf")
public Integer addUserByIf(){UserInfo userInfo = new UserInfo();userInfo.setAge(11);userInfo.setPassword("ifififififfi");userInfo.setUsername("if标签测试2");return userXmlService.addUserByIf(userInfo);
}//Service
//1、if标签
public Integer addUserByIf(UserInfo userInfo) {return userXmlMapper.addUserByIf(userInfo);
}//Mapper
Integer addUserByIf(UserInfo userInfo);//xm文件
//
<insert id="addUserByIf" >insert into userinfo(username,<if test="age != null">age,</if><if test="gender != null">gender,</if>password)values(#{username},<if test="age != null">#{age},</if><if test="gender != null"> gender,</if>#{password})
</insert>
注册信息时有必填字段和非必填字段,可以使用if标签实现sql。使用if标签中的内容,如果程序中有数据则将字段执行到sql中,否则sql排除该字段

4.2 trim标签
prefix:表示整个语句块,以prefix的值作为前缀
suffix:表 整个语句块,以suffix的值作为后缀
prefixOverrides:表 整个语句块要去除掉的前缀
suffixOverrides:表 整个语句块要去除掉的后缀
<insert id="insertUserByCondition"> INSERT INTO userinfo <trim prefix="(" suffix=")" suffixOverrides=","> <if test="username !=null"> username, </if> <if test="password !=null"> password, </if> <if test="age != null"> age, </if><if test="gender != null"> gender, </if> <if test="phone != null"> phone, </if> </trim> VALUES <trim prefix="(" suffix=")" suffixOverrides=","> <if test="username !=null"> #{username}, </if><if test="password !=null"> #{password}, </if><if test="age != null"> #{age}, </if> <if test="gender != null"> #{gender}, </if> <if test="phone != null">#{phone} </if> </trim> 
</insert>
在以上sql动态解析时,会将第⼀个部分做如下处理:
基于 prefix 配置,开始部分加上 (
基于 suffix 配置,结束部分加上 )
多个组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于
suffixOverrides 配置去掉最后⼀个 ,
注意 中的 username 是传⼊对象的属性

4.3 where标签
<select id="queryByCondition" resultType="com.example.demo.model.UserInfo"> select id, username, age, gender, phone, delete_flag, create_time, update_time from userinfo <where> <if test="age != null"> and age = #{age} </if> <if test="gender != null"> and gender = #{gender} </if><if test="deleteFlag != null"> and delete_flag = #{deleteFlag} </if></where> 
</select>
删除代码块最前面的and
查询条件为空时去除where关键字

4.4 set标签
<update id="updateUserByCondition"> update userinfo <set> <if test="username != null"> username = #{username}, </if><if test="age != null"> age = #{age}, </if> <if test="deleteFlag != null"> delete_flag = #{deleteFlag}, </if> </set> where id = #{id} 
</update>
动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号.(⽤于update语句中)

4.5 foreach标签
对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
collection:绑定方法参数中的集合,如List,Set,Map或数组对象
item:遍历时的每⼀个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
<delete id="deleteByIds"> delete from userinfo where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> 
</delete>

4.6 sql标签与include标签
<sql id="allColumn"> id, username, age, gender, phone, delete_flag, create_time, update_time 
</sql><select id="queryAllUser" resultMap="BaseMap"> select <include refid="allColumn"></include> from userinfo 
</select>

我们可以对重复的代码⽚段进⾏抽取,将其通过 标签封装到⼀个SQL⽚段,然后再通过标签进行引用。

定义可重用的SQL片段
通过属性refid,指定包含的SQL片段

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

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

相关文章

最新版的AutoGPT,我搭建好了

最近AutoGPT不是更新了嘛 安装 我按照官方的教程 在本地搭建好了 改动 可见的改动&#xff0c;主要是把原来的纯命令行改成前后端的形式 看下前端界面 界面比较简单&#xff0c;主要分3个大块 监控 第一个是监控 主要是看你在 build 里构建的Agents的运行情况 build 第一个是Ag…

前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别

前端项目中的Server-sent Events(SSE)项目实践 前言 在前端开发中&#xff0c;实时数据更新是提升用户体验的重要因素之一。Server-SentEvents(SSE)是一种高效的技术&#xff0c;允许服务器通过单向连接将实时数据推送到客户端。下面将从SSE的基本改变&#xff0c;使用场景展…

大数据Flink(一百零九):阿里云Flink的基本名称概念

文章目录 阿里云Flink的基本名称概念 一、层次结构 二、​​​​​​​​​​​​​​概念说明 1、工作空间&#xff08;Workspace&#xff09; 2、项目空间&#xff08;Namespace&#xff09; 3、资源&#xff08;Resource&#xff09; 4、草稿&#xff08;Draft&#…

Spring-MyBatis整合:No qualifying bean of type ‘XXX‘ available: ...

1.看一下核心配置中有没有导入myBatis配置 2.看一下service和dao有没有相应注解 3.看一下MyBatisConfig中有没有对sqlSessionFactory和mapperScannerConfigurer注释成bean对象以及有没有配置映射文件路径

【扒网络架构】backbone、ccff

backbone CCFF 还不知道网络连接方式&#xff0c;只是知道了每一层 backbone backbone.backbone.conv1.weight torch.Size([64, 3, 7, 7])backbone.backbone.layer1.0.conv1.weight torch.Size([64, 64, 1, 1])backbone.backbone.layer1.0.conv2.weight torch.Size([64, 64,…

Datawhale AI夏令营第四期 | AIGC文生图——可图Kolors-LoRA风格故事 Task1笔记

Hi&#xff0c;大家好&#xff0c;我是半亩花海。最近在尝试学习AIGC的内容&#xff0c;并报名参加了Datawhale举办的2024年AI第四期夏令营&#xff0c;主要学习内容是从零入门AI生图原理和实践。本次活动基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”进而开展的项目实践学习…

【最新】推荐6款论文ai写论文软件推荐网站平台

在当前的学术研究和写作环境中&#xff0c;AI写作工具已经成为许多学者和学生的重要助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助优化文章结构、润色语言以及进行查重等任务。以下将推荐六款优秀的AI写论文软件&#xff0c;并详细介绍它们的功能和特点。 1. 千笔-…

C语言 ——— 学习并使用memset函数

目录 memset函数的功能 学习memset函数​编辑 使用memset函数 memset函数的功能 memset函数是内存设置函数&#xff0c;将数据设置成传递的参数&#xff0c;以字节来设置 学习memset函数 函数的参数&#xff1a; void* ptr&#xff1a;数据要设置的起始位置的指针 int …

【代码随想录】区间和——前缀和方法

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 原题链接&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; 题目描述 给定一个整数数组 Array&#xff0c;请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为…

VS /PROFILE(性能工具探查器)的使用

/PROFILE&#xff08;性能工具探查器&#xff09; 在 Visual Studio 开发环境中设置此链接器选项 打开项目的“属性页” 对话框。 有关详细信息&#xff0c;请参阅在 Visual Studio 中设置 C 编译器和生成属性。 选择“配置属性”>“链接器”>“高级”属性页。 修改配…

动态规划之——背包DP(完结篇)

文章目录 概要说明分组背包模板例题1思路code模板例题2思路code 有依赖的背包问题模板例题思路code 背包问题求方案数模板例题思路code 背包问题求具体方案模板例题思路code 概要说明 本文讲分组背包、有依赖的背包、 背包问题求方案数以及背包问题求具体方案 入门篇(01背包和…

STM32G070KBT6的RTC HAL库使用

*配置问题 首先使能时钟源&#xff0c;这里在时钟配置中选择LSI&#xff0c;为什么后面会说&#xff0c;然后使能Calender结构体&#xff0c;保证可以对RTC的年月日时分秒等进行写入和读取&#xff1b;alarmA和alarmB是闹钟&#xff0c;这里不用就Disable&#xff1b; Tam…

ShardingSphere之ShardingProxy集群部署

文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置&#xff0c;就是关于集群部署的 mode: # typ…

极狐GitLab CICD Catalog Beta 功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

视觉SLAM中的数学基础01 -3D空间的位置表示

在视觉SLAM中&#xff0c;理解和表示3D空间中的位置是至关重要的。这涉及到多种数学概念和工具&#xff0c;如坐标系、向量、矩阵、旋转和平移等。这些数学基础构成了视觉SLAM算法的核心。以下是3D空间位置表示的基本数学概念。 这是一个表示世界坐标系和相机坐标系之间关系的3…

JNPF快速开发平台赋能数字办公方式转变

随着信息技术的飞速发展&#xff0c;数字化转型已成为各行各业提升效率、优化流程的重要手段。JNPF快速开发平台正是在这样的背景下应运而生&#xff0c;它通过简化开发流程&#xff0c;使得非技术人员也能参与到应用的构建中来&#xff0c;从而加速了数字办公方式的转变。 数字…

畅捷通基于Flink的实时数仓落地实践

摘要&#xff1a;本文整理自畅捷通总架构师、阿里云MVP专家郑芸老师在 Flink Forward Asia 2023 中闭门会上的分享。内容主要为以下四部分&#xff1a; 业务背景数仓建设具体案例未来展望 一、业务背景 畅捷通是用友旗下成员企业&#xff0c;一直持续专注于小微企业的数字化转…

4K YouTube to MP3 Pro:跨平台音频提取与转换的好用工具

4K YouTube to MP3 Pro是一款专为追求高品质音频体验的用户设计的跨平台&#xff08;支持Mac与Windows&#xff09;音频提取与转换软件。该软件以其卓越的音频提取能力和简便的操作流程&#xff0c;在同类产品中脱颖而出&#xff0c;成为众多用户的心头好。 功能强大&#xff…

AI革新3D建模:Stable Fast 3D工具的高效应用——图片快速生成3D模型

在3D建模领域,AI技术的介入正引发一场革命。Stable Diffusion(SD)的最新应用——Stable Fast 3D,为快速生成3D模型提供了一个强大的解决方案。以下是对这项技术及其应用的详细介绍和优化建议。 一、工具概览 Stable Fast 3D模型:这是一个基于AI的3D模型生成工具,可通过H…

社交电商系统:技术融合与商业创新

一、引言 随着社交平台的普及和电商系统的不断发展&#xff0c;社交电商系统作为一种新型的商业模式应运而生。这种模式结合了传统电子商务和社交媒体的优势&#xff0c;为消费者和商家提供了一个全新的购物和销售环境。本文将深入探讨社交电商系统的技术架构、主要模式、优势以…