[spring]用MyBatis XML操作数据库 其他查询操作 数据库连接池 mysql企业开发规范 动态sql

文章目录

  • 一. MyBatis XML配置文件
    • 1. 配置链接字符串和MyBatis
    • 2. 写持久层代码
      • 方法定义Interface
      • 方法实现xml
      • 测试
    • 3. 增删改查
      • 增:
  • 二. 开发规范(mysql)
  • 三. 其他查询操作
    • 1. 多表查询
    • 2. #{} 和 ${}(面试题)
      • 使用
      • 区别
    • 排序功能
    • like查询
  • 三. 数据库连接池
  • 四. 动态sql
    • 1. < if > 标签
    • 2. < trim >标签
    • < where > 标签
    • < set > 标签
    • < foreach > 标签
    • < sql > < include > 标签

一. MyBatis XML配置文件

MyBatis开发有两种方式:

  1. 注解
  2. XML
    使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中.
    在这里插入图片描述

1. 配置链接字符串和MyBatis

添加配置:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis:# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件mapper-locations: classpath:mapper/**.xml

在resources路径下, 创建mapper文件, 在mapper文件下创建**.xml文件, 以xml结尾的文件
和mapper-locations: classpath:后的路径对应即可
在这里插入图片描述

2. 写持久层代码

在这里插入图片描述

方法定义Interface

在这里插入图片描述

方法实现xml

MyBatis的固定xml格式:

<?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接口所对应的路径-->
<mapper namespace="com.bite.mybatis.mapper.UserInfoXmlMapper"></mapper>

查询:

<?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.bite.demo.mapper.UserInfoXMLMapper"><select id="queryAllUser" resultType="com.bite.demo.model.UserInfo">select * from userinfo</select>
</mapper>
  1. < mapper> 标签: 需要指定< namespace>属性, 表示命名空间, 值为mapper接口的全限定名, 即包名.类名
  2. < select>查询标签, 用来执行数据库的查询操作
  • id : 是和接口中定义的方法名
  • resultType : 是返回的数据类型

测试

在这里插入图片描述

在这里插入图片描述

3. 增删改查

增:

 <insert id="insertUser">insert into userinfo (username, `password`, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})</insert>

在这里插入图片描述

在这里插入图片描述
返回自增id:
接口定义不变, 设置useGeneratedKeys 和keyProperty属性

 <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, `password`, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})</insert>

 <delete id="deleteUser">delete from userinfo where id = #{id}</delete>

在这里插入图片描述

 <update id="updateUser">update userinfo set username = #{username} where id = #{id}</update>

在这里插入图片描述

和注解一样, 映射也有三种解决办法:
在这里插入图片描述
1和3和注解一样
** xml结果映射:**

 <resultMap id="BaseMap" type="com.bite.demo.model.UserInfo"><id column="id" property="id"></id><result column="delete_flag" property="deleteFlag"></result><result column="create_time" property="createTime"></result><result column="update_time" property="updateTime"></result></resultMap>

在这里插入图片描述

二. 开发规范(mysql)

阿里巴巴java开发手册的规范:
1.
在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

三. 其他查询操作

1. 多表查询

  1. 准备工作
    创建一个文章表
    文章表的uid, 对应上述用户表的id
-- 创建⽂章表
DROP TABLE IF EXISTS articleinfo;
CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEFAULT 0 COMMENT '0正常, 1删除',create_time DATETIME DEFAULT now(),update_time DATETIME DEFAULT now() ) DEFAULT charset 'utf8mb4';-- 插⼊测试数据INSERT INTO articleinfo ( title, content, uid ) VALUES ( 'Java', 'Java正文', 1 );

sql: 查询id=1的作者的相关信息

selectta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender
fromarticleinfo ta
left join userinfo tb onta.uid = tb.id
whereta.id = 1
  1. 实体类:
@Data
public class ArticleInfo {private Integer id;private String title;private String content;private Integer uid;private Integer deleteFlag;private Date createTime;private Date updateTime;//用户相关信息private String username;private Integer age;private Integer gender;
}
  1. 接口定义:
@Mapper
public interface ArticleInfoMapper {@Select("SELECT ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender " +"FROM articleinfo ta LEFT JOIN userinfo tb ON ta.uid = tb.id " +"WHERE ta.id = #{id}")ArticleInfo queryUserByUid(Integer id);}
  1. 测试类:
@SpringBootTest
class ArticleInfoMapperTest {@Autowiredprivate ArticleInfoMapper articleInfoMapper;@Testvoid queryUserByUid() {articleInfoMapper.queryUserByUid(1);}
}

在这里插入图片描述

2. #{} 和 ${}(面试题)

使用

  1. 传递Integer类型的参数
    #{ }:
    在这里插入图片描述
    结果:
    在这里插入图片描述我们输⼊的参数并没有在后⾯拼接,id的值是使⽤ ? 进⾏占位. 这种SQL我们称之为**“预编译SQL”**
    ${ }:
    在这里插入图片描述
    结果:
    在这里插入图片描述
    这次的参数是直接拼接在SQL语句中, 叫做即时SQL
    两种方法都不会报错
  2. 传递String类型的参数
    #{ }
    在这里插入图片描述
    在这里插入图片描述
    KaTeX parse error: Double superscript at position 213: …串作为参数时,需要添加引号' '̲, ⽤{} 不会拼接引号 ’ ‘, 导致程序报错
    就需要我们手动添加’ ’
    在这里插入图片描述
    在这里插入图片描述

区别

1. #{} 和${} 的区别就是预编译SQL和即时SQL的区别
在这里插入图片描述
预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译
(只是输⼊的参数不同),省去了解析优化等过程,以此来提⾼效率
2. $ { }存在sql注入问题(重点)
SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。
例如, 如果使用${}, 传递的参数为’ or 1=’ 1, 返回的数据用List接收, 就会发生
在这里插入图片描述
在这里插入图片描述
输入一个用户名, 就拿到了全部用户的数据, 这是非常不安全的
可以看出:
在这里插入图片描述
⽤于查询的字段,尽量使⽤ #{} 预查询的⽅式

排序功能

排序功能就是${} 的使用场景
在这里插入图片描述
mapper实现:
在这里插入图片描述

在这里插入图片描述
可以实现逆序返回的功能
如果使用#{}:
在这里插入图片描述
使用#{}, 将参数带入到sql中, 如果是字符串类型, 会自动加上’ ', 此时sql语句就变成:
select * from userinfo order by id ‘desc’, 语法错误

那么在完成排序功能时, 使用${ }, 也是存在sql注入的问题的, 所以一般需要排序的场景, 用户并不是自己输入的, 而是通过按钮等方式, 就行选择, 就避免了sql注入的问题

在这里插入图片描述

like查询

在这里插入图片描述

三. 数据库连接池

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

  1. Hikari : SpringBoot默认使⽤的数据库连接池
    从Spring打印的日志就可以看出来
    在这里插入图片描述
  2. Druid
    如果我们想把默认的数据库连接池切换为Druid数据库连接池,只需要引⼊相关依赖即可
 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.21</version></dependency>

如果SpringBoot版本为2.X,使⽤druid-spring-boot-starter依赖

 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency>

在这里插入图片描述

四. 动态sql

1. < if > 标签

在这里插入图片描述
接口定义:
在这里插入图片描述
xml实现:

<insert id="insertUserByCondition">insert into userinfo (username, password, age, <if test="gender != null">gender,</if>phone)values (#{username},#{password},#{age},<if test="gender != null">#{gender},</if>#{phone})</insert>

注解实现(不推荐):
把上⾯SQL(包括标签),使⽤< script > < /script > 标签括起来就可以

@Insert("<script>" +"INSERT INTO userinfo (username,`password`,age," +"<if test='gender!=null'>gender,</if>" +"phone)" +"VALUES(#{username},#{age}," +"<if test='gender!=null'>#{gender},</if>" +"#{phone})"+"</script>")Integer insertUserByCondition(UserInfo userInfo);

在这里插入图片描述
gender是有默认值的
在这里插入图片描述

上述没有设置gender, 所以会将gender设为默认值0, 而不是null

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

2. < trim >标签

在这里插入图片描述

 <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>

在这里插入图片描述

如果不加trim时, 那么phone后面就会多一个 ,
加上trim: 自动帮我们去掉 ,
在这里插入图片描述

< where > 标签

看下⾯这个场景, 系统会根据我们的筛选条件,动态组装where条件

在这里插入图片描述
< where > 只会在子元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的AND或OR
在这里插入图片描述

 <select id="queryByCondition" resultType="com.bite.demo.model.UserInfo">select * from userinfo <where><if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if></where>
</select>

在这里插入图片描述

在这里插入图片描述

< set > 标签

需求:根据传⼊的用户对象属性来更新用户数据,可以使⽤标签来指定动态内容.
在这里插入图片描述

 <update id="updateUserByCondition">update userinfo<set><if test="age != null">age = #{age}</if><if test="username != null">username = #{username}</if><if test="gender != null">gender = #{gender}</if></set>where id = #{id}
</update>

在这里插入图片描述
在这里插入图片描述
以上标签也可以使⽤< trim prefix=“set” suffixOverrides=“,” > 替换

< foreach > 标签

在这里插入图片描述
需求:根据多个userid,删除用户数据
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

< sql > < include > 标签

在xml映射⽂件中配置的SQL,有时可能会存在很多重复的⽚段,此时就会存在很多冗余的代码
在这里插入图片描述
在这里插入图片描述

<sql id="allColumn">id,username,age,gender,phone,delete_flag,create_time, update_time
</sql>
<select id="queryAllUser" resultType="com.bite.demo.model.UserInfo">select<include refid="allColumn"></include>from userinfo
</select>   

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

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

相关文章

使用shc|gzexe加密shell脚本,并配置全局可用

前言&#xff1a;堡垒机上多厂家共用&#xff0c;导致脚本需要加密并设置过期时间 一、使用shc&#xff08;二进制&#xff09; 1、安装shc sudo yum install epel-release sudo yum -y install shc sudo yum -y instal epel-release && sudo yum -y install shc 2、…

图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)

1. 论文基本信息 论文标题&#xff1a;Deep Retinex Decomposition for Low-Light Enhancement 作者&#xff1a;Chen Wei等 发表时间和期刊&#xff1a;2018&#xff1b;BMVC 论文链接&#xff1a;https://arxiv.org/abs/1808.04560 2. 研究背景和动机 低光照条件下拍摄的…

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

tauri开发软件中,使用tauri自带的api用浏览器打开指定的url链接

有能力的可以看官方文档&#xff1a;shell | Tauri Apps 就是使用这个api来打开指定的url链接&#xff0c;要在tauri.config.json中配置打开这个api&#xff1a; 然后在前端页面中导入使用&#xff1a; import { open } from tauri-apps/api/shell; // opens the given URL o…

ODA(Open Design Alliance)试用小记-ODA提供源码下载就完全可控了吗?

1.概述 ODA(Open Design Alliance)库架构如下&#xff1a; 产品体系如下&#xff1a; ODA的产品体系越来越壮大&#xff0c;包括主流BIM格式SDK、Viewer、Cloud、数据交换等&#xff0c;每个模块需要单独购买&#xff0c;并提供“源码服务”。 2.是否可控&#xff1f; 值得…

【rust】 基于rust编写wasm,实现markdown转换为html文本

文章目录 背景转换预览核心代码前置依赖rustup换源 cargo本地路径修改&#xff08;可选&#xff09;cargo换源中科大 wasm-pack安装 背景 尝试用rust编写一款markdown转html的插件&#xff0c;通过wasm给html使用&#xff0c;不得不说体积挺小&#xff0c;约200K&#xff0c; …

深度学习——D2(数据操作)

N维数组 创建数组 访问元素 一列: [ : , 1 ] 反向累积、正向累积&#xff08;自动求导&#xff09; 梯度 梯度&#xff08;Gradient&#xff09;是微积分中的一个重要概念&#xff0c;主要用于描述一个函数在某个区域内的变化情况。以下是对梯度的详细解释&#xff1a; 一…

Qorvo® 推出具有卓越能效的新一代 Matter™ 解决方案

全新 SoC 利用 ConcurrentConnect™ 技术实现智能家居的无缝互联 Qorvo今日宣布&#xff0c;推出面向智能家居设备的全新片上系统&#xff08;SoC&#xff09;解决方案——QPG6200L&#xff0c;并已向主要客户提供样品。该款下一代物联网&#xff08;IoT&#xff09;解决方案采…

数据结构双链表和循环链表

目录 一、循环链表二、双向链表三、循环双向链表 一、循环链表 循环链表就是首尾相接的的链表&#xff0c;就是尾节点的指针域指向头节点使整个链表形成一个循环&#xff0c;这就弥补了以前单链表无法在后面某个节点找到前面的节点&#xff0c;可以从任意一个节点找到目标节点…

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件&#xff0c;例如 工作流引擎activiti&#xff0c;暂未适配yashandb&#xff0c;使用中会出现如下异常&#xff1a; 问题的风险及影响 …

实际有库存却提示可用量不足保存不了杂发单

财务要统计研发费用&#xff0c;成本的金额。研发人员没有足够的意识配合。开立请购单时兴之所致&#xff0c;任性自由。想弄一个项目号就弄一个。不开心就没有项目号啦。哪管他人死活。 U9的逻辑&#xff0c;请购单如果带入项目号&#xff08;客制化的功能&#xff09;&#x…

《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测

文章目录 一、Harris 角点检测1.基本思想2.检测步骤3.OpenCV实现 二、SIFT特征检测1. SIFT特征检测的基本原理2. SIFT特征检测的特点3. OpenCV 实现 一、Harris 角点检测 OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法&#xff0c;它通过计算每个像素点的响…

Java五子棋

目录 一&#xff1a;案例要求&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;案例要求&#xff1a; 实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘&#xff0c;把每个元素赋值位“┼”可以画出棋…

一文说透RTMP、RTSP、RTP、HLS、MPEG-DASH

实时视频传输协议 1. RTMP&#xff08;Real Time Messaging Protocol&#xff09; 简介&#xff1a;RTMP是由Adobe公司开发的实时消息传输协议&#xff0c;主要用于流媒体数据的传输。它基于TCP传输&#xff0c;具有低延迟、高可靠性的特点。特点&#xff1a;RTMP支持多种视频…

9.29总结

这星期学了概率和组合数学 这是我觉得的一个有趣的题目&#xff0c;每个人身上都有n-1根绳子&#xff0c;如果组不成稳定三角&#xff0c;那么肯定有两个人相邻两根绳子颜色不一样&#xff0c;那么每两个这样的人就会贡献一个不稳定三角形&#xff0c;所以只要所有三角形减去每…

统信UOSv20专业版(1050)桌面操作系统设置root密码

统信UOSv20专业版(1050)桌面操作系统设置root密码 1. 系统版本信息 版本信息 kalamiuos:~$ uname -r 4.19.0-amd64-desktop kalamiuos:~$ kalamiuos:~$ uname -a Linux uos 4.19.0-amd64-desktop #5310 SMP Mon Oct 10 19:43:13 CST 2022 x86_64 GNU/Linux kalamiuos:~$ kal…

Vue3-TS-Lodash:理解Lodash / 常用方法积累

一、Lodash官网 Lodash 简介 | Lodash中文文档 | Lodash中文网 二、理解Lodash Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。它提供了大量的函数来帮助你处理数组、数值、对象、字符串等&#xff0c;使你的代码更加简洁、易读和高效。Lodash 的设计哲学是…

【Mybatis篇】动态SQL的详细带练

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af;一.动态SQL简单介绍 &#x1f6a6;动态S…

端侧Agent系列 | 端侧AI Agent任务拆解大师如何助力AI手机?(详解版)

引言 简介 Octo-planner 规划和执行Agent框架 规划数据集 基准设计 实验设计 结果 全量微调与LoRA 多LoRA训练与合并 不同基础模型的全量微调 不同数据集大小的全量微调 总结 实战 英文 中文示例1&#xff1a; 中文示例2&#xff1a; 0. 引言 人生到处知何似…

【有啥问啥】具身智能(Embodied AI):人工智能的新前沿

具身智能&#xff08;Embodied AI&#xff09;&#xff1a;人工智能的新前沿 引言 在人工智能&#xff08;AI&#xff09;的进程中&#xff0c;具身智能&#xff08;Embodied AI&#xff09;正逐渐成为研究与应用的焦点。具身智能不仅关注于机器的计算能力&#xff0c;更强调…