数据库设计、JDBC、数据库连接池
数据库设计
数据库设计概念
- 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
- 建立数据库中的表结构以及表与表之间的关联关系的过程。
- 有哪些表?表里有哪些字段?表和表之间有什么关系?
数据库设计的步骤
- 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
- 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
- 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
- 维护设计(1. 对新的需求进行建表;2. 表优化)
JDBC
概述
概念
- JDBC就是使用Java语言操作关系型数据库的一套API
- 全称:( Java DataBase Connectivity ) Java数据库连接
本质
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC) 编程,真正执行的代码是驱动jar包中的实现类
好处
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
DriverManager
用来获取连接
| 类 | 静态方法 |
| Connection | getconnection (string url, String user, string password) |
1. url: 连接路径
语法:jdbc:mysq://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2....
- 如果连接的是本机mysq|服务器,并且mysq|服务默认端口是3306,则url可以简写为:jdbc:mysq///数据库名称?参数键值对
- 以参数键值对的方式配置useSSL=false参数,禁用安全连接方式,解决警告提示
2. user: 用户名
3. password: 密码
Connection
用来获取执行SQL的对象、管理事务
获取执行SQL的对象
| 方法 | 说明 |
| Statement createStatement() | 普通执行SQL对象 |
| PreparedStatement prepareStatement(sq|) | 预编译SQL的执行SQL对象:防止SQL注入 |
| CallableStatement prepareCall(sq|) | 执行存储过程的对象(不常用) |
事务管理
MySQL事务管理
| BEGIN; / START TRANSACTION; | 开启事务 |
| COMMIT; | 提交事务 |
| ROLL BACK; | 回滚事务 |
MySQL默认自动提交事务
JDBC事务管理:Connection接口中定义了3个对应的方法
| 方法 | 说明 |
| setAutoCommit(boolean autoCommit) | 开启事务。true为自动提交事务; false为手动提交事务,即为开启事务 |
| commit() | 提交事务 |
| rollback() | 回滚事务 |
Statement
用来执行SQL语句
| 方法 | 说明 |
| int executeUpdate(sql) | 执行DML、DDL语句。返回值:(1) DML语句影响的行数(2) DDL语句执行后,执行成功也可能返回0 |
| ResultSet executeQuery(sql) | 执行DQL语句。返回值:ResultSet 结果集对象 |
ResultSet
用来封装DQL查询语句的结果
boolean next()
判断当前行是否为有效行,并将光标从当前位置向前移动一行。
返回值:true为有效行,当前行有数据;false为无效行,当前行没有数据
XXX getXxx(参数)
获取数据
XXX: 数据类型;如: int getlnt(参数); String getString(参数)
参数:int为列的编号,从1开始;String为列的名称
PreparedStatement
可以用来预编译SQL语句并执行预防SQL注入问题。
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
防SQL注入
1.获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
2.设置参数值(给?赋值)
PreparedStatement对象: setXxx(参数1, 参数2)
Xxx:数据类型;如setInt (参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
3.执行SQL
executeUpdate(); / executeQuery(); 不需要再传递sql
预编译
PreparedStatement预编译功能开启:useServerPrepStmts = trud
配置MySQL执行日志(重启mysq|服务后生效)

PreparedStatement 原理:
1.在获取PreparedStatement对象时, 将sq|语句发送给mysq|服务器进行检查,编译(这些步骤很耗时)
2.执行时就不用再进行这些步骤了 ,速度更快
3.如果sq|模板一样,则只需要进行一次检查、编译
数据库连接池
简介
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引|起的数据库连接遗漏
好处:资源重用、提升系统响应速度、避免数据库连接遗漏。
实现
标准接口: DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection()
常见的数据库连接池: .
DBCP
C3P0
Druid
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
1、导入jar包
2、定义配置文件

3、加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
4、获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
5、获取数据库连接
Connection connection = dataSource.getConnection();
Druid 基本配置参数介绍*
- name :数据源名称
如果存在多个数据源,监控的时候可以通过名字来区分开来
如果没有配置,将会生成一个名字,格式是"DataSource-"+System.identityHashCode(this)
- jdbcUrl :连接数据库的 url,不同数据库不一样
- username :连接数据库的用户名
- password :连接数据库的密码
- driverClassName :数据库驱动类
可配可不配,如果不配置 druid 会根据 url 自动识别 dbType,然后选择相应的 driverClassName(建议配置下)
- initialSize :初始化时建立物理连接的个数,初始化发生在显示调用 init 方法,或者第一次 getConnection 时
- maxActive :最大连接池数量
- maxIdle :已经不再使用,配置了也没效果
- minIdle :最小连接池数量
- maxWait :获取连接时最大等待时间,单位毫秒
配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降(可以通过配置 useUnfairLock=true 使用非公平锁)
- poolPreparedStatements :是否缓存 preparedStatement,即 PsCache
PSCache 对支持游标的数据库性能提升巨大,比如说 oracle,而 mysql 则建议关闭
- maxOpenPreparedStatements :要启用 PSCache,必须配置大于0
当大于 0 时,poolPreparedStatements 自动触发修改为 true
在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,可以把这个数值配置大一点,比如 100
- validationQuery :用来检测连接是否有效的 sql,要求是一个查询语句
如果 validationQuery 为null,testOnBorrow、testOnReturn 、testWhileIdle 都不会起作用
- testOnBorrow :申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能
- testOnReturn :归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能
- testWhileIdle :建议配置为 true,不影响性能,并且保证安全性
申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunMills,执行 validationQuery 检测连接是否有效
-
timeBetweenEvictionRunMillis :间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- Destory 线程会检测连接的间隔时间
- testWhileIdle 的判断依据(详见 testWhileIdele 属性的说明)
- numTestsPerEvictionRun :废弃,一个 DruidDataSource 只支持一个 EvicationRun
- minEvictableIdleTimeMillis :一个连接在池中最小生存的时间,单位是毫秒
- connectionInitSqls :物理连接初始化的时候执行 sql
- exceptionSorter :当数据库抛出一些不可恢复的异常时,抛弃连接
- filters :通过别名的方式配置扩展插件,属性类型是字符串
常用的插件有:监控统计用的 filter(stat:监控统计,log:4:日志记录,wall:防御sql注入)
- proxyFilters :类型是 List<com.alibaba.druid,filter.Filter>,如果同时配置 filter 和 proxyFilters,是组合关系(并非)
相关文章:
数据库设计、JDBC、数据库连接池
数据库设计 数据库设计概念 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤…...
SpringBoot实现OneDrive文件上传
SpringBoot实现OneDrive文件上传 源码 OneDriveUpload: SpringBoot实现OneDrive文件上传 获取accessToken步骤 参考文档:针对 OneDrive API 的 Microsoft 帐户授权 - OneDrive dev center | Microsoft Learn 1.访问Azure创建应用Microsoft Azure,使…...
C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现
介绍完了list类的相关内容后:C初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: 文章目录 1.stack的初步介绍2.stack的使用3.queue的初步介绍4.queue的使用5.容器适…...
GRUB and the Boot Process on UEFI-based x86 Systems
background info : BIOS and UEFI-CSDN博客 The UEFI-based platform reads the partition table on the system storage and mounts the EFI System Partition (ESP), a VFAT partition labeled with a particular globally unique identifier (GUID). The ESP contains EFI a…...
2.C语言——输入输出
1.字符输入输出函数 1.输入:getchar() 字面意思,接收单个字符,使用方法 char a; a getchar();实际上效果等同于char a; scanf("%c",&a);2.输出:putchar() 2.格式化输入输出函数 1.输入:scanf() 格式: scanf(“格式控制…...
MySQL篇之SQL优化
一、表的设计优化 表的设计优化(参考阿里开发手册《嵩山版》): 1. 比如设置合适的数值(tinyint int bigint),要根据实际情况选择。 2. 比如设置合适的字符串类型(char和varchar)…...
QGis —— 1、Windows10下载安装QGis及插件
QGis官网 QGIS(自由开源的地理信息系统)是一个专业的GIS应用程序,它建立在免费和开源软件(FOSS)之上,并为此而自豪。QGIS 是一个方便使用的开源地理信息系统 (GIS),根据 GNU 通用公共许可授权。…...
【打工日常】使用docker部署Dashdot工具箱
一、Dashdot介绍 dashdot是一个简洁清晰的服务器数据仪表板,基于React实现 ,主要是显示操作系统、进程、存储、内存、网络这五个的数据。 二、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境 2. 本地环境规划 本次实践环境规划…...
使用client-only 解决组件不兼容SSR问题
目录 前言 一、解决方案 1.基于Nuxt 框架的SSR应用 2.基于vue2框架的应用 3.基于vue3框架的应用 二、总结 往期回顾 前言 最近在我的单页面SSR应用上开发JSON编辑器功能,在引入组件后直接客户端跳转OK,但是在直接加载服务端渲染的时候一直报这…...
基于Java SSM框架实现网上报名系统项目【项目源码+论文说明】
基于java的SSM框架实现网上报名系统演示 摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的网上报名系统,会使网上报名系统工作系统化、规范化,也会提高网…...
7.1 Qt 中输入行与按钮
目录 前言: 技能: 内容: 参考: 前言: line edit 与pushbotton的一点联动 当输入行有内容时,按钮才能使用,并能读出输入行的内容 技能: pushButton->setEnabled(false) 按钮不…...
云计算基础-网络虚拟化
虚拟交换机 什么是虚拟交换机 虚拟交换机是一种运行在虚拟化环境中的网络设备,其运行在宿主机的内存中,通过软件方式在宿主机内部实现了部分物理交换机的功能,如 VLAN 划分、流量控制、QoS 支持和安全功能等网络管理特性 虚拟交换机在云平…...
166基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪
基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪,分辨虚假imf,提取最大峭度imf图。输出去噪前后时域及其包络谱结果。程序已调通,可直接运行。 166 matlab SVD去噪 IMF筛选 包络谱 (xiaohongshu.com)...
第六十三天 服务攻防-框架安全CVE复现DjangoFlaskNode.JSJQuery
第六十三天 服务攻防-框架安全&CVE复现&Django&Flask&Node.JS&JQuery 知识点: 中间件及框架列表: IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic.JBoos,WebSphere, Jenkins,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thin…...
最大子序和+旅行问题——单调队列
一、最大子序和 输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。 注意: 子序列的长度至少是 1。 输入 第一行输入两个整数 n,m (1 ≤ n,m ≤ 300000)。 第二行输入 n 个数,代…...
Unity设备分级策略
Unity设备分级策略 前言 之前自己做的设备分级策略,在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准,预生成部分已知机型的分级信息,且保存在包内;如果设备没有被评级过,则优…...
自己在开发AI应用的过程总结的 Prompt - 持续更新
自己在开发AI应用的过程总结的 Prompt - 持续更新 0. 引言1. 让模型以"中文"进行回复2. 控制模型仅输出"hi"3. 让模型"提供简单、清晰而具体的回答"4. 让模型"在最后说谢谢" 0. 引言 我想,我们多半有着相似的经历…...
STM32——OLED菜单
文章目录 一.补充二. 二级菜单代码 简介:首先在我的51 I2C里面有OLED详细讲解,本期代码从51OLED基础上移植过来的,可以先看完那篇文章,在看这个,然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…...
Open CASCADE学习|布尔运算后消除内部拓扑
在CAD建模中,布尔运算是一种逻辑运算方法,通过这种方法,可以创建、修改或组合几何对象。布尔运算主要包括并集(UNION)、交集(INTERSECT)和差集(SUBTRACT)三种运算。 并集…...
【数据仓库】主题域和数据域
数据域与主题域区别 https://www.cnblogs.com/datadance/p/16898254.html 数据域是自下而上,以业务数据视角来划分数据,一般进行完业务系统数据调研之后就可以进行数据域的划分。针对公共明细层(DWD)进行主题划分。主题域则自上而…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
