数据库设计、JDBC、数据库连接池

news2024/12/26 22:04:30

数据库设计

数据库设计概念

  • 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
  • 建立数据库中的表结构以及表与表之间的关联关系的过程。
  • 有哪些表?表里有哪些字段?表和表之间有什么关系?

数据库设计的步骤

  1. 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
  2. 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
  3. 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
  4. 维护设计(1. 对新的需求进行建表;2. 表优化)

JDBC

 概述

概念

  • JDBC就是使用Java语言操作关系型数据库的一套API
  • 全称:( Java DataBase Connectivity ) Java数据库连接

本质

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC) 编程,真正执行的代码是驱动jar包中的实现类

好处

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
  • 可随时替换底层数据库,访问数据库的Java代码基本不变

DriverManager

        用来获取连接

静态方法
Connectiongetconnection (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,是组合关系(并非)

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

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

相关文章

企业计算机服务器中了faust勒索病毒怎么办?Faust勒索病毒解密数据恢复

网络技术的不断发展与更新&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但也为企业的数据安全埋下隐患。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了faust勒索病毒攻击&#xff0c;给企业的生产运营带来了极大困扰&am…

使用新的 AI 工具和生产力工具提升 Windows 上的开发人员体验

随着 9 月 26 日最新的 Windows 11 更新&#xff0c;我们发布了一系列开发人员功能作为 Windows 操作系统的核心组件&#xff0c;旨在提高每个开发人员在 Windows 上的工作效率。今天&#xff0c;我们很高兴地宣布推出 Windows AI Studio&#xff0c;这是一种新的 AI 体验&…

SCI文章复现 | GEO文章套路,数据下载和批次效应处理

原文链接&#xff1a; SCI文章复现 | GEO文章套路&#xff0c;数据下载和批次效应处理https://mp.weixin.qq.com/s/KBA67EJ7cCK5NDTUzrwJ2Q 一、前言 这是2024年春节后的第一个推送教程&#xff0c;我们也给大家赠送一个福利。将前期的付费教程免费推送给大家。其实&#xff…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址&#xff1a;关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容&#xff1a; 前言 我在上一篇关于DDOS的文章种提到过这个项目&#xff0c;而且说明了由于这个项目是在2020年发布并开源的&#xff0c;并且已经有两年没有进行跟…

C++入门学习(二十八)跳转语句—continue语句

当在循环中遇到continue语句时&#xff0c;它会跳过当前迭代剩余的代码块&#xff0c;并立即开始下一次迭代。这意味着continue语句用于跳过循环中特定的执行步骤&#xff0c;而不是完全终止循环。 直接看一下下面的代码更清晰&#xff1a; 与上一节的break语句可以做一下对比…

spring boot3登录开发-2(1图形验证码接口实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 内容简介 图形验证码接口实现 导入糊涂工具依赖 接口分析 编写验证码接口 测试验证码接口 前置条件 …

【MySQL进阶之路】MySQL中到底为什么会出现幻读?

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

第六篇【传奇开心果系列】Python微项目技术点案例示例:庖丁解牛tkinter.ttk库gui界面编程

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录前言一、主窗口和子窗口创建和切换&#xff0c;以员工信息管理系统示例代码二、主窗口添加有菜单项图标的菜单栏、工具栏和右键菜单示例代码三、使用sqlite3数据库增删改查管理员工信息示例代码四、在主…

从物联网到数字孪生:智慧社区的演变

随着科技的飞速发展和数字化转型的深入推进&#xff0c;智慧社区已成为提升城市治理水平和居民生活质量的重要方向。在这一演变过程中&#xff0c;物联网和数字孪生技术起到了至关重要的作用。本文将深入探讨从物联网到数字孪生的演变过程&#xff0c;分析这一转变对智慧社区建…

FL Studio 21中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#xff0c;而且F…

基于springboot大学生租房系统源码和论文

伴随着全球信息化发展&#xff0c;行行业业都与计算机技术相衔接&#xff0c;计算机技术普遍运用于各大行业&#xff0c;大学生租房系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本&#xff0c;使整个大学生租房的发展和服务水平有显著提升。 本论文主要面…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱&#xff1a;py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型&#xff0c;所以颜色相同&#xff0c;无法相互区分歌手、歌曲还是专辑等等。 py2ne…

解决STM32MP157开发板密码登录问题

开发板密码登录问题是很多人遇到的问题&#xff0c;网上有很多帖子&#xff0c;我也参考过&#xff0c;不太适用&#xff0c;很复杂&#xff0c;甚至会被误导&#xff0c;我差点连ubuntu虚拟机都无法登录了。有的密码匹配&#xff0c;有的取消不了密码。 1、密码配置&#xff…

恒流模块与常用电容

户外电源电芯&#xff1a;DJ采用无热中心设计&#xff1a;每个电芯都有一部分裸露在外面&#xff0c;保证良好散热上 固态电容相较于普通电解电容具有更高的电气性能、更长的使用寿命和更稳定的温度特性&#xff0c;但成本也相对较高。固态电容在1块左右&#xff0c;电解电容在…

import tensorflow_hub报错

问题&#xff1a; 导入tensorflow_hub报ModuleNotFoundError: No module named ‘tensorflow.python.checkpoint’ 解决&#xff1a; tensorflow-estimator版本不对 和tensorflow&#xff08;2.6.0&#xff09;版本一致 。 pip install -U tensorflow-estimator2.6.0 验证&a…

无线充电 线圈设计

本文所讨论参数&#xff0c;均有论文&#xff0c;仿真和实测支撑&#xff0c;也欢迎感兴趣的小伙伴一起讨论。 有个笑话&#xff0c;说是18年无线充白牌热销的时段&#xff0c;单片机没赚到钱&#xff0c;壳料没赚到钱&#xff0c;pcba也没赚到钱&#xff0c;钱都被卖NP0电容和…

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java)

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java) 比赛链接&#xff1a;Codeforces Round 926 (Div. 2) B题传送门&#xff1a;B. Sasha and the Drawing 题目&#xff1a;B. Sasha and the Drawing Example input 3 4 3 3 3 10 3 9 4 7 7 11 2 3output 2 …

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

JavaWeb-JDBC-API详解

一、JDBC介绍 二、JDBC 快速入门 package com.itheima.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class JDCBDemo {public static void main(String[] args) throws Exception {//1、注册驱动Class.forName("co…

微信小程序: 获取accessToken,手机号, 小程序二维码,openId与unionId 公共配置类(核心篇)

全文目录,一步到位 1.前言简介1.1 专栏传送门 2. 微信小程序公用功能2.1 配置准备工作2.1.1 配置文件准备(单体放yml中 微服务放配置中心)2.1.2 获取配置文件中的小程序配置2.1.3 设置redis配置 2.2 创建不同功能工具类2.2.1 创建微信服务工具类WechatServiceUtils2.2.2 创建Re…