当前位置: 首页 > news >正文

【Mybatis】动态SQL+配置文件+数据库连接池+企业规范(10)

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

目录

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

1、重要标签

1.1动态SQL

1.2 其他

2、#{}与${}的区别

2.1 #{}与${}的使用

2.2 #{}与${}的区别

3、配置文件

3.1 配置日志

3.2 配置大驼峰

3.3配置映射文件路径

4、数据库连接池

4.1 什么是数据库连接池

4.2 使用

5、MySQL数据库开发企业规范

5.1 表名规范

5.2 表的设计规范

5.3 表的查询


1、重要标签

1.1动态SQL

(1)动态SQL是MyBatis的强大特性之一,能够完成不同条件下不同的sql拼接

(2)<if>标签

①当某个字段是必填字段或非必填字段时,如果有不确定的字段传入,那么程序应该如何实现?——使用<if>标签,对字段做出判断

②例子:

a、接口定义

Integer insertUserByCondition(UserInfo userInfo);

b、Mapper.xml实现

【对gender字段进行非空校验】

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

c、注解方式

直接把上面的内容,使用<script></script>标签括起来就可以了,非常不推荐!!!

(3)<trim>标签

①上述的插入用户的功能,只是有一个gender字段可能是选填项,如果有多个字段,一般考虑使用标签结合标签,对多个字段都采取动态生成的方式

②标签中由如下属性:

prefix:表示整个语句块,以prefix的值作为前缀

suffix:表示整个语句块,以suffix的值作为后缀

prefixOverrides:表示整个语句块要去除掉的前缀

suffixOverrides:表示整个语句块要去除掉的后缀

③调整上述的Mapper.xml

<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=",">(#{username},#{password},#{age},<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>

(4)<where>标签

①根据属性做where条件查询时,可以使用<where>标签

②例子:

a、接口定义

List<UserInfo> queryByCondition();

b、Mapper.xml实现

<select id="queryByCondition" resultType="UserInfo">select id,username,age,gender,phone,delete_flagfrom userinfo<where><if test="username != null"> and name = #{username},</if><if test="age != null">and  age = #{age},</if><if test="delete_flag != null">and delete_flag = #{deleteFlag},</if></where>
</select>

(5)<set>标签

①根据传入的属性来更新数据,可以使用标签来指定动态内容

②例子:

a、接口定义

Integer  updateUserByCondition(UserInfo userInfo)

b、Mapper.xml实现:

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

③<set>:动态的在SQL语句中插入set关键字,并会删除额外的逗号(用于更新语句中),这个标签也可以使用<trim prefix="set" suffixOverrides=",">替换

(6)<foreach>标签

①对集合进行遍历可以使用该标签。标签有如下属性:

collection:绑定方法参数中集合,如List,Set,Map或数组对象

item:遍历时的每一个对象

open:语句块开头的字符串

close:语句块结束的字符串

separator:每次遍历之间间隔的字符串

②例子:

a、接口定义

void deleteById(List<Integer> ids);

b、Mapper.xml实现

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

(7)<include>标签

①在xml映射文件中配置的SQL,有时会存在很多重复的片段,此时就会有很多冗余的代码,我们可以将重复的代码进行抽取,通过<sql>标签封装SQL片段,然后在通过<include>标签进行引

②<sql>:定义可重用的的SQL片段

<include>:通过属性refid,指定包含的SQL片段

③例子

<sql id="commonSelect">select id,name,gender,birthday from student
</sql><!--根据id查询学生--><select id="getById" resultType="org.fanhuiling.pojo.Student"><include refid="commonSelect"></include>where id=#{id}</select>

1.2 其他



2、#{}与${}的区别

2.1 #{}与${}的使用

(1)使用Integer作为参数

① #{ }为参数赋值

@Select("select username,password,age,gender,phone from userinfo where id=#{ }")

UserInfo queryById(Integer id);

打印SQL语句日志如下:

select username,password,age,gender,phone from userinfo where id=?

我们输入的参数id 并没有在后面拼接,而是使用?进行占位,这种就称为预编译SQL

② ${ }为参数赋值

@Select("select username,password,age,gender,phone from userinfo where id=${ }")

UserInfo queryById(Integer id);

打印SQL语句日志如下:

select username,password,age,gender,phone from userinfo where id=1

我们输入的参数1就直接与SQL语句进行了拼接 

(2)使用String作为参数

① #{ }为参数赋值

@Select("select username,password,age,gender,phone from userinfo where username=#{ }")

UserInfo queryByName(String name);

打印SQL语句日志如下:

select username,password,age,gender,phone from userinfo where username=?

② ${ }为参数赋值

@Select("select username,password,age,gender,phone from userinfo where username=${ }")

UserInfo queryByName(String name);

打印SQL语句日志如下:

select username,password,age,gender,phone from userinfo whereusername=zhansan

我们输入的参数zahnsan拼接在SQL 语句后了,但是这样操作会报错,因为zhangsan是字符串,在SQL语句中应该用引号包裹,然而使用${ }不会拼接单引号'  ',所以程序会报错。不过可手动添加引号,不推荐!!

2.2 #{}与${}的区别

(1)#{ }使用的是预编译SQL,通过?占位的方式,提前对SQL进行编译,然后把参数填充到SQL语句中,#{ }会根据出纳书类型,自动拼接单引号

(2) ${ }会直接进行字符串替换,一起对SQL进行编译。如果参数为字符串类型,需要手动添加上引号

(3)#{ }是预编译SQL,而${ }是即时SQL

(4)更推荐使用预编译SQL,一是性能更高【预编译SQL,编译一次后就会把SQL语句给缓存起来,后面需要再次使用该SQL语句时,不会再次编译,只是输入的参数不同罢了,省去了解析优化的过程,以此来提高效率】,二是更安全【防止SQL注入,正常情况下where name="admin"是可以正常登录的,但是将"admin"改成" ' or 1='1'  "=》where name =' ' or 1='1'始终为真,也可以登录,这就是SQL注入的典型例子】




3、配置文件

3.1 配置日志

# 配置 mybatis 的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3.2 配置大驼峰

# 开启 mybatis 的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

3.3配置映射文件路径

# 配置 mybatis 的映射文件路径(需要修改成对应值)
mybatis.mapper-locations=classpath*:mapper/*.xml




4、数据库连接池

4.1 什么是数据库连接池

(1)数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接池,而不是重新创建一个新的

①无连接池:每次执行SQL语句,要先创还能一个新的连接对象,然后执行SQL语句,SQL语句执行完,再关闭连接对象释放资源,这种重复的创建连接、销毁连接比较消耗资源

有连接池:程序启动时,会在数据库连接池中创建一定数量的Connection对象,当客户请求数据库连接池,会从数据库连接池中获取Connection对象,然后执行SQL、SQL语句执行完毕后,再把Connection归还给连接池

(2)作用:使用数据库连接池,避免频繁的创建连接,销毁连接

(3)优点:减少了网络开销;资源重用;提升了系统的性能

4.2 使用

(1)常见的数据库连接池:C3P0、DBCP、Druid、Hikari

(2)目前比较流行的是Druid、Hikari,SpringBoot默认是Hikari(日本研发的, 大NO特NO),咱们还是使用优秀的阿里巴巴开发的Druid连接池吧!直接在pom.xml文件里面添加相应依赖即可使用

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



5、MySQL数据库开发企业规范

5.1 表名规范

(1)表名,字段名使用小写字母或数字,单词之间用下划线分割。尽量避免出现数字开头或者两个下划线中间只出现数字。数据库字段名的修改代价很大,所以字段名是需要慎重考虑的

(2)MySQL在Windows下不区分大小写,但是在Linux下默认是区分大小写的,所以,最好数据库名,表名,字段名都是小写

5.2 表的设计规范

(1)在表的设计中,除了实体需要的字段名之外,还需要必备的三字段:id、create_time、update_time【id为自增主键,步长为1;create_time、update_time的类型均为datetime,create_time为创建时间,update_time为更新时间】

(2)有同等含义的字段即可,字段名不做强制要求

5.3 表的查询

在表的查询中,避免使用*作为查询的字段列表,select * 是一个非常危险的操作,当数据量特别大的时候,还没有查询完,内存就占满了,真的真的特别危险,所以在查询时最好表明需要哪些字段

相关文章:

【Mybatis】动态SQL+配置文件+数据库连接池+企业规范(10)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 目录 本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 …...

layui扩展组件之----右键菜单

源码&#xff1a;rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…...

ue5实现数字滚动增长

方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里...

Flink(一)

目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用&#xff1f; 典型的事件驱动示例 数据分析应用流式分析应用的优势&#xff1f;Flink 如…...

kaggle 数据集下载

文章目录 kaggle 数据集下载&#xff08;1&#xff09; 数据集下载&#xff08;2&#xff09; 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍&#xff0c;快忘得差不多了&#xff0c;惭愧。 参考了好多帖子&#xff0c;使用命令行…...

Linux shell编程学习笔记87:blkid命令——获取块设备信息

0 引言 在进行系统安全检测时&#xff0c;我们需要收集块设备的信息&#xff0c;这些可以通过blkid命令来获取。 1 blkid命令的安装 blkid命令是基于libblkid库的命令行工具&#xff0c;可以在大多数Linux发行版中使用。 如果你的Linux系统中没有安装blkid命令&#xff0c;…...

wireshark筛选条件整理

Wireshark筛选条件整理 一、MAC地址过滤二、IP地址过滤三、端口过滤四、协议筛选五、数据分析1、整体2、frame数据帧分析3、 Ethernet II 以太网4、IP协议5、TCP6、HTTP7、ARP8、DLEP动态链接交换协议 六、统计-协议分级&#xff08;统计包占比&#xff09; and && 、 …...

基于现代 C++17 的模块化视频质量诊断处理流程设计

文章目录 0. 引言1. 原始设计分析2. 新的设计思路2.1 定义通用的检测接口2.2 使用 std::function 和 std::any 管理检测模块2.3 构建可动态配置的检测管道 3. 示例实现3.1 定义检测接口和模块3.1.1 检测接口3.1.2 信号检测模块3.1.3 冻结检测模块3.1.4 其他检测模块 3.2 构建检…...

高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?

如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收算法? 我回答: 在 Java 虚拟机 (JVM) 中&#xff0c;垃圾回收 (Garbage Collection, GC) 是一项非常重要的功能&#xff0c;用于自动管理应用程序的内存。JVM 采用多种垃圾回收算法来决定何时以及如何回收…...

高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

w005基于Springboot学生心理咨询评估系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

实战-任意文件下载

实战-任意文件下载 1、开局 开局一个弱口令&#xff0c;正常来讲我们一般是弱口令或者sql&#xff0c;或者未授权 那么这次运气比较好&#xff0c;直接弱口令进去了 直接访问看看有没有功能点&#xff0c;正常做测试我们一定要先找功能点 发现一个文件上传点&#xff0c;不…...

PG数据库之视图详解

1. 视图的基本定义 在PostgreSQL&#xff08;简称pg&#xff09;数据库中&#xff0c;视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;其内容由SQL查询定义。视图并不实际存储数据&#xff0c;而是在每次查询时根据定义的查询语句动态生成结果。视图可以简化复杂的…...

时间序列预测(十五)——有关Python项目框架的实例分析

#1024程序员节&#xff5c;征文# 在之前的学习中&#xff0c;已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解&#xff0c;并能够将所学知识应用于实际中&#xff0c;我决定找一个完整的Python框架来进行深入学习。经过寻找&#xff0c;我终于找到了一篇非常具…...

ETL、ELT和反向ETL都有什么不同?怎么选择?

数据处理是现代企业中不可或缺的一部分。随着数据量的不断增长&#xff0c;如何高效地处理、转换和加载数据变得尤为重要。本文将介绍三种常见的数据处理方式&#xff1a;ETL、ELT和反向ETL&#xff0c;帮助读者更好地理解和选择适合自己业务需求的方式。 一、ETL 定义&#…...

linux 中文实用型手册 基于RHEL(红帽系)

硬件系统 Updated by wangjing on 2024-10-28 at 02:36:57 in Tongzhou District, Beijing. 硬件信息 机器型号 dmidecode | grep "Product Name"CPU型号 cat /proc/cpuinfo |grep "model name" | uniqWWWCPU详情 lscpuCPU个数 cat /proc/cpuinfo |grep &q…...

Hash表算法

哈希表 理论知识&#xff08;本文来自于代码随想录摘抄&#xff09;什么是哈希常见的三种哈希结数组&#xff1a;set:map:其他常用方法或者技巧&#xff08;自己总结的&#xff09; 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…...

MySQL企业常见架构与调优经验分享

文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记&#xff0c;分享于此~ 课程&#xff1a;MySQL企业常见架构与调优经验分享 mysql官方优化文档 调优MySQL参数 一、选择 …...

C++引用类型变量

引用变量的主要用途是用作函数的形参。这样函数将使用原始数据&#xff0c;而不是副本。除指针之外&#xff0c;引用也为处理大型结构提供了一种非常方便的途径。 再C中使用&符号标识引用。也就是说C给&符号赋予了另一个含义&#xff0c;将其用来声明引用。 引用的声…...

《C++23 新特性:现代软件开发的变革力量》

在软件开发的快速演进中&#xff0c;C作为一种强大且广泛应用的编程语言&#xff0c;不断推陈出新以适应日益复杂的开发需求。C23 的到来&#xff0c;为现代软件开发带来了诸多新的机遇和挑战。它的新特性不仅影响着开发者的编程习惯&#xff0c;也在代码效率、可维护性以及软件…...

Educational Codeforces Round 88 E. Modular Stability

题目链接 Educational Codeforces Round 88 E. Modular Stability 思路 对于任意的非负整数 x x x&#xff0c;我们要满足 x % a % b x % b % a x \% a \% b x \% b \% a x%a%bx%b%a。因为 a < b a < b a<b&#xff0c;所以只有 b b b为 a a a的倍数时才满足条件…...

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中&#xff0c;SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式&#xff0c;适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…...

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…...

【工具】Charles对360浏览器抓包抓包

Charles 和 switchy sharp 配合&#xff0c;可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例&#xff0c;介绍如何实现抓包。&#xff08;Mac中操作基本一致&#xff09; 1.安装Charles 可根据自己的电脑下载对应的版本&#xff1a;…...

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…...

Qt Designer客户端安装和插件集(pyqt5和pyside2)

GitHub - PyQt5/QtDesignerPlugins: Qt Designer PluginsQt Designer Plugins. Contribute to PyQt5/QtDesignerPlugins development by creating an account on GitHub.https://github.com/PyQt5/QtDesignerPlugins 一、下载客户端 https://github.com/PyQt5/QtDesigner/rel…...

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统&#xff0c;用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前&#xff0c;可以通过线上提前预约的方式将自己的个人信息…...

鸿蒙实现相机拍照及相册选择照片

前言&#xff1a; 1.如果你的应用不是存储类型或者相机拍照类型&#xff0c;你就需要用 kit.CameraKit Api 实现相机拍照和相册选择照片功能&#xff0c;如果你不用这个的话&#xff0c;你使用 picker.PhotoViewPicker &#xff0c;你就需要申请权限&#xff0c;那你提交应用审…...

「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT

在科技日新月异的今天&#xff0c;电子设计自动化&#xff08;EDA&#xff09;行业正以前所未有的速度推动着半导体产业的革新与发展&#xff0c;引领着全球电子产业迈向更加智能化、高效化的未来。作为EDA领域的佼佼者&#xff0c;冉谱公司始终站在技术创新的前沿&#xff0c;…...

本校网站建设/业务多平台怎么样

B - 最少硬币问题 Description 设有n种不同面值的硬币&#xff0c;各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。 对任意钱数0≤m≤20001&#xff0c;设计一个用最少硬币找钱m的方法。 对于给定的1≤n≤10…...

wordpress代码安装畅言/汽车seo是什么意思

概要  分析如何使用微软提供的ASP.NET来对动态产生的URL地址进行网址重写。 网址重写是实现一种截取网址请求并将其进行处理后重新指向到一个指定的网址的过程。作者本人在对各种实现网址重写的技术进行研究和探讨后得出的经验和方法&#xff0c;希望能对您有所帮助。 内容简…...

免费书画网站怎么做的/今日头条最新新闻消息

来自&#xff1a;美林大数据摘要: 数据挖掘分类技术从分类问题的提出至今&#xff0c;已经衍生出了很多具体的分类技术。下面主要简单介绍四种最常用的分类技术&#xff0c;不过因为原理和具体的算法实现及优化不是本书的重点&#xff0c;所以我们尽量用应用人员能够理解的语言…...

设计公司企业站/扬州网络推广公司

序言Lenovo Miix720&#xff0c;也即国内型号Miix5 pro&#xff0c;笔者曾经发表过关于它的评测&#xff1a;9支手写笔的设计故事 篇四&#xff1a;Lenovo 联想 miix5 pro 平板电脑 设计师向 深度评测__什么值得买​post.smzdm.com其 bios 3SCN57WW添加了AHCI模式&#xff0c;这…...

网站建设中 很快回来/双11各大电商平台销售数据

工作中常会用到数据分析&#xff0c;可能是月数据分析&#xff0c;也可能是年&#xff0c;因为从事的岗位是运营&#xff0c;所以运营少不了都会汇总数据&#xff0c;然后通过数据分析&#xff0c;得出结论&#xff0c;再根据结论思考运营的新方向。所以几乎每日&#xff0c;每…...

兰州网站seo服务/深圳网站建设推广方案

asp.net中word转html碰到的权限异常问题&#xff08;转&#xff09; 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败&#xff0c;原因是出现以下错误: 80070005。 说明: 执行当前 Web 请求期间&#xff0c;出现未处理的异常。请检查堆栈跟踪…...