【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 * 是一个非常危险的操作,当数据量特别大的时候,还没有查询完,内存就占满了,真的真的特别危险,所以在查询时最好表明需要哪些字段

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

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

相关文章

Web3的去中心化社交网络:区块链技术如何改变互动方式

随着互联网技术的不断进步&#xff0c;社交网络正在经历一场深刻的变革。Web3&#xff0c;作为新一代互联网技术的代表&#xff0c;正通过区块链和去中心化理念改变着我们与他人互动的方式。传统的社交网络通常由大型公司控制&#xff0c;用户数据的集中化管理和隐私问题备受关…

大数据-191 Elasticsearch - ES 集群模式 配置启动 规划调优

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

短信登录的实现-redis和session的比较

目录 短信登录功能的实现一&#xff1a;基于session进行短信登录1&#xff1a;发送验证码2&#xff1a;登录3&#xff1a;登录验证拦截器4&#xff1a;隐藏用户敏感信息二&#xff1a;session的集群共享问题三&#xff1a;基于redis实现短信登录登录的刷新问题 短信登录功能的实…

中欧科学家论坛暨第六届人工智能与先进制造国际会议(AIAM 2024)在德国法兰克福成功举办,两百余名中外科学家共襄盛举

2024年10月20至21日&#xff0c;首届中欧科学家论坛在德国法兰克福的SAALBAU Titus Forum国际会议中心成功举行。中国驻法兰克福总领事馆伍鹏飞副总领事、德国兰斯巴赫-鲍姆巴赫市市长Michael Merz亲自出席并致辞。2004年诺贝尔化学奖得主Aaron Ciechanover教授和法国国家科学院…

直接删除Github上的文件

直接删除Github上的文件 说明&#xff1a;此操作只删除Github上的文件&#xff0c;本地仓库文件不受影响 1.确定要删除哪个分支文件,以删除main为例&#xff0c; 1.找到本地仓库位置以StudyNote为例&#xff0c;右键 bash here 2.打开命令窗口&#xff0c;将Github的StudyN…

SpringBoot篇(运维实用篇 - 日志)

目录 一、简介 二、代码中使用日志工具记录日志 1. 操作步骤 步骤1&#xff1a;添加日志记录操作 步骤2&#xff1a;设置日志输出级别 步骤3&#xff1a;设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …

Java多线程编程基础

目录 编写第一个多线程程序 1. 方式一 : 继承Thread类, 重写run方法 2. 方式二: 实现Runnable接口, 重写run方法 3. 方式三: 使用Lambda表达式 [匿名内部类] [Lambda表达式] 在上个文章中, 我们了解了进程和线程的相关概念. 那么, 在Java中, 我们如何进行多线程编程呢? …

postman的脚本设置接口关联

pm常用的对象 变量基础知识 postman获取响应结果的脚本的编写 下面是购物场景存在接口信息的关联 登录进入---搜索商品---进入商品详情---加入购物车 资源在附件中&#xff0c;可以私聊单独发送 postman的SHA256加密 var CryptoJS require(crypto-js);// 需要加密的字符串 …

ip地址分为几大类-IP和子网掩码对照表

一、IP地址的基本概念与分类 IP地址是用于在网络中标识每个设备的逻辑地址。互联网协议将IP地址分为A、B、C、D和E五类&#xff0c;其中A、B、C三类最常用&#xff0c;它们主要根据地址的首位位数以及用途进行划分。 A类地址&#xff1a; 范围&#xff1a;0.0.0.0 - 127.255.2…

docker占用磁盘过多问题

我在windows系统上用docker&#xff0c;安装在C盘环境下&#xff0c;我发现C盘占用了大量的空间&#xff0c;查找后发现是docker的映像文件占用的&#xff0c;于是开始清理&#xff0c;中间还踩个坑&#xff0c;记录一下&#xff0c;下次需要的时候方便找。 踩坑 我本想移动映…

Xss_less靶场攻略(1-18)

xss-lab-less1 ur特殊字符转义 存在url中 转义符为 %2B& 转义符为 %26空格 转义符为 或 %20/ 转义符为 %2F? 转义符为 %3F% 转义符为 %25#转义符为 %23 转义符为 %3Dimg 标签懒加载 在XSS攻击中&#xff0c;img标签的src属性是一个常见的攻击向量&#xff0c;因为它可以…

聊聊Web3D 发展趋势

随着 Web 技术的不断演进&#xff0c;Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来&#xff0c;由于 WebGL、WebGPU 等技术的发展&#xff0c;3D 内容已经能够直接在浏览器中渲染&#xff0c;为用户提供更加沉浸、互动的体验。以…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

uniapp开发【点击展示弹窗功能】

一、效果展示 二、代码 <template><view class="mini"><view class="block_item" @click="$refs.popup.op

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1&#xff1a;zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘&#xff08;最低&#xff09; 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

根据输入的详细地址解析经纬度

摘要&#xff1a; 今天遇到一个需求&#xff1a;就是做客户导入的时候因为导入的客户地址的时候没有经纬度的&#xff0c;但是同步的时候需要经纬度的&#xff0c;所以还是要根据客户提供的详细地址解析出来对应的经纬度&#xff01;回填到对应的经纬度的表单之中进行客户的同步…

upload-labs靶场Pass-21

upload-labs靶场Pass-21 本关上传方法众多&#xff0c;但是应该考察的是数组后缀绕过&#xff0c;所以我的上传围绕此展开 1.分析源码 $is_upload false; // 初始化上传状态为false $msg null; // 初始化消息变量为null// 检查是否有文件上传 if(!empty($_FILES[upload_fi…

Flutter实战短视频课程

1、课程导学 一套代研运行多蜡 体州一致&#xff0c;目胜能优昇 未来大趋势 不改交原生项目的基础上&#xff0c;扩展Flutter能力 Flutter原生灵话切涣 0入侵 最简单、最通用 最新Flutter 3,x新特性讲解 大量flutter官方组件和api学习 最常用的第三方库使用及原理解析 自研组…

Python中的数据可视化:Matplotlib基础与高级技巧

Python中的数据可视化&#xff1a;Matplotlib基础与高级技巧 数据可视化是数据分析和数据科学中不可或缺的一部分。通过图表&#xff0c;我们可以更直观地观察数据的分布和趋势。Matplotlib作为Python最基础、也是最广泛使用的绘图库之一&#xff0c;不仅支持多种常用图表&…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM&#xff0c;而后将该 PGM 地图充分运用到无人系统路径规划之中&#xff0c;使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。&#xff08;解决如何使用PGM的问题&#xff09; Hybrid A*算法 参考博客…