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

文章目录

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

矩阵的逆怎么算?逆矩阵公式来了(附逆矩阵计算器)

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4da; 在线性代数中&#xff0c;逆矩阵是一个非常重要的概念。一个方阵如果存在逆矩阵&#xff0c;意味着该矩阵是可逆的&#xff0c;或者说是非奇异的。逆矩阵在解决线性方程组、计算矩阵的方根等方面有着广泛的应…

啤酒过滤——关于过滤助剂的介绍

在啤酒的酿造过程中&#xff0c;过滤是一个关键步骤&#xff0c;在啤酒厂中最常用的过滤助剂主要有两种&#xff1a;硅藻土和珍珠岩。它们能够帮助去除杂质&#xff0c;确保啤酒的清澈和口感。过滤助剂通常以粉状形式存在&#xff0c;它们被涂抹在过滤机的支撑材料上&#xff0…

应急响应--来不来得及走流程...

免责声明&#xff1a;本文仅做分享&#xff01; 应急响应详解 概述 应急响应是现代信息安全管理中的重要一环。随着网络威胁的日益复杂化&#xff0c;企业和组织必须具备快速响应安全事件的能力&#xff0c;以最大限度地减少数据泄露、业务中断以及经济损失。本文将从应急响应…

衍射的角谱理论

一、单色平面波与本征函数 不考虑夫琅禾费近似, 则相干光场在给定二平面间的传播过程就是通过一个二维线性空不变系统。 上式函数是这个系统的本征函数,表示振幅为1的平面波在xy平面上的复振幅分布,空间频率分量 = cos / , = cos / 与平面波的传播方向相联系, 空间…

单链表进阶

之前已经介绍过单链表及其一些简单的功能 这次来简单介绍单链表一些的其他接口 1.在指定位置之前插入数据 具体原码&#xff0c;三个参数&#xff0c;phead是链表的指针&#xff0c;pos是节点的地址&#xff0c;x是需要插入的数据。 pos不能为空指针&#xff0c;因为pos为空…

P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

原理构造法 令ans c1 c2 .. cn ci 余数 * &#xff08;c1乘到cn但不乘ci&#xff09;* &#xff08;c1乘到cn但不乘ci 的逆元&#xff0c;模ci意义下&#xff09; 定理&#xff1a;在模M c1乘到cn 意义下&#xff0c;解唯一。 #include<bits/stdc.h> #define in…

如何修改音频的音量增益

一、前言 在开发音频相关的功能&#xff08;比如说语音通话、播放音乐&#xff09;时&#xff0c;经常会遇到音量太小的问题&#xff0c;这时候就需要我们对原始数据进行处理。本文将介绍如何通过修改原始音频数据来增加增益&#xff0c;本文包含如下内容&#xff1a; 1.音频数…

HTML标题标签与其属性

在HTML中标题是通过<h1..6> </h1...6>标签进行定义的。其中<h1>是定义最大的标题&#xff0c;<h6>是定义最小的标题。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

项目启动卡住不动Property ‘mapperLocations‘ was not specified.

问题如上图所示&#xff1b; 原因&#xff1a;在mapper打了个断点&#xff01;

Mapbox封装图形绘制工具 线,圆,polygon,删除,点 mapbox-gl-draw-circle mapbox-gl-draw

使用插件&#xff0c;安装 npm install mapbox-gl-draw-circle //绘制圆 npm install mapbox/mapbox-gl-draw //绘制点线面删除相关API地址&#xff1a;https://github.com/mohong/mapbox-gl-draw-circle https://github.com/mapbox/mapbox-gl-draw/blob/main/docs/API.md…

大数据Flink(一百二十四):案例实践——淘宝母婴数据加速查询

文章目录 案例实践——淘宝母婴数据加速查询 一、​​​​​​​创建数据库表并导入数据 二、​​​​​​​​​​​​​​创建session集群 三、​​​​​​​​​​​​​​源表查询 四、​​​​​​​​​​​​​​指标计算 案例实践——淘宝母婴数据加速查询 随着…

【信息论基础第三讲】再谈离散信源的信息测度之熵的性质多符号信源的信息测度

一、Piece Of Cake 1、离散信源X的熵是H(X)是一个常数而不是一个变量 解释&#xff1a;离散信源的熵也就是自信息I(X)的数学期望&#xff0c;即H(X) E[I(Xi)]&#xff0c;而通过概率论的知识我们知道数学期望是一个常数&#xff0c;故熵也是一个常数。 2、八元编码系统&…

9.24工作笔记

filter_list的用法 在before_filter函数中用到&#xff0c;过滤了filter因子排名前80%的数据 保温杯4 采用纯多和中性轮动的策略 dpo DPO&#xff08;区间震荡线&#xff09;计算公式 公式&#xff1a; [ \text{DPO} \text{CLOSE} - \text{REF}(\text{MA}(\text{CLOSE},…

基于大数据爬虫+数据可视化大屏+Python的广东省人口流动数据分析设计和实现(源码+论文+部署文档等)

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

LCD1602

LCD1602 是一种工业字符型液晶显示屏&#xff0c;能够同时显示 16x2 即 32 个字符。 LCD的显示控制 通过向 LCD1602 发送指令和数据来控制其显示内容。指令包括清屏、设置光标位置、显示模式等&#xff1b;数据则是要显示的字符的 ASCII 码。LCD1602 内部有一个控制器&#x…

中兴数通产品厉害了,获得CC EAL3+认证!

不知道朋友们最近听说没有&#xff0c;中兴的数通产品是真争气&#xff0c;有25款成功通过了国际信息技术安全评估通用准则CC的EAL 3级别认证。中兴一直是通讯行业的领先企业&#xff0c;这次CC EAL 3级别认证覆盖了多款主流设备型号&#xff0c;证明了它在网络安全领域的实力确…

使用 Loki、Loki4j、Grafana 和 Spring Boot 搭建一个轻量级、简单、易用的 Java 日志系统

要使用 Loki、Loki4j、Grafana 和 Spring Boot 搭建一个轻量级、简单、易用的 Java 日志系统&#xff0c;您可以按以下步骤进行。这个系统将利用 Loki 作为日志存储和聚合系统&#xff0c;Loki4j 作为 Java 的日志插件&#xff0c;Grafana 用于日志的可视化。 1.工具介绍&…

CF1994 F. Stardew Valley [欧拉回路+树上差分]

传送门 [前题提要]:自模板题以后,很少遇到欧拉回路的题目,正好这道题结合了多种经典算法,故写一篇题解记录一下 读完题面,因为需要经过所有1边,所以很显然会想到应该将所有的1边拿出来建一个新图,然后在新图上添加0边,使得新图是一个欧拉图. 让我们来回忆一下什么是欧拉图.对…

【秋招笔试题】多多的平均值

解法&#xff1a;抽掉的两个数字之和为2倍的平均数&#xff0c;那么判断一下2倍的平均数是不是整数。然后在搞一个哈希表存取过的值即可。 package com.sky;import java.util.*;public class Test1 {public static void main(String[] args) {Scanner scanner new Scanner(Sy…

计算机研一规划2024/9/22

系列文章目录 文章目录 系列文章目录前言一、两条腿走路二、编程语言能力提升1.廖雪峰的python课2.Leetcode&#xff08;数据结构题&#xff09; 三、机器学习能力提升1.统计学习方法 李航2.kaggle竞赛 四、神经网络能力提升1.神经网络与深度学习 邱锡鹏2.一套自己的万金油模板…