当前位置: 首页 > 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;也在代码效率、可维护性以及软件…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...