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

数据库设计

数据库设计概念

  • 数据库设计就是根据业务 系统的具体需求,结合我们所选用的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.hqwc.cn/news/474133.html

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

相关文章

WordPress站点成功升级后的介绍页地址是什么?

我们一般在WordPress站点后台 >> 仪表盘 >> 更新中成功升级WordPress的话&#xff0c;最后打开的就是升级之后的版本介绍页。比如boke112百科前两天升级到WordPress 6.4.2后显示的介绍页如下图所示&#xff1a; 该介绍除了介绍当前版本修复了多少个问题及修补了多少…

图数据库、知识图谱、装配模型

一、图数据库 图数据库简介 ​ 图数据库&#xff08;Graph Database&#xff09;是基于图论实现的一种新型NoSQL数据库。它的数据存储结构和数据的查询方式都是以图论为基础的。图论中图的基本元素为节点和边&#xff0c;在图数据库中对应的就是节点和关系。 图数据库是基于图…

Transformer——Attention 注意力机制

注意力机制 Transformer的注意力机制借鉴了人类的注意力机制。人类通过眼睛的视觉单元去扫描图像&#xff0c;其中的重点区域会被大脑的神经元处理从而获得更多的信息&#xff0c;这是人类长期精华所获得的一种能力。 以论文中的例子来看&#xff0c;红色区域表示我们人脑视觉…

C++并发编程 -3.同步并发操作

本文介绍如何使用条件变量控制并发的同步操作、C 并发三剑客&#xff0c;函数式编程 一.条件变量 1.概念 C条件变量&#xff08;condition variable&#xff09;是一种多线程编程中常用的同步机制&#xff0c;用于线程间的通信和协调。它允许一个或多个线程等待某个条件的发生…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲&#xff1a; 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具&#xff0c;泛指业务软件开发&#xff0c;所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

python in Vscode

背景 对于后端的语言选择&#xff1a; python&#xff0c;java&#xff0c;JavaScript备选。 选择Python 原因&#xff1a;可能是非IT专业的人中&#xff0c;会Python的人比较多。 目的 之前使用的IDE是VSCODE&#xff0c;在WSL的环境下使用。现在需要在在WSL的VSCODE下使…

数据集合

目录 并集 union union all 区别 交集 intersect 差集 minus 错误操作 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 常用的数学集合有&#xff1a;交集、并集、差集、补集 每一次查询实际上都会返回数据集合&#xff0c;…

51单片机编程应用(C语言):DS1302实时时钟

单片机计时的缺陷&#xff1a; 1.他的精度不高&#xff0c;没有时钟芯片精度高&#xff0c; 2.会占用单片机CPU的时间&#xff0c; 3.单片机的时钟无法掉电继续运行&#xff0c;&#xff08;最大的缺点&#xff09; DS1302芯片内部有备用电池&#xff0c;可以掉电继续计时…

算法刷题:长度最小的子数组

长度最小的子数组 .题目链接题目详情算法原理滑动窗口定义指针进窗口判断出窗口 我的答案 . 题目链接 长度最小的子数组 题目详情 算法原理 滑动窗口 这道题,我们采用滑动窗口的思想来解决,具体步骤如图所示 定义指针 如图所示,两个指针都需要从左往右进行遍历,因此初始值…

为何重复造轮子

重复造轮子&#xff0c;意思是说&#xff0c;一个项目本身存在开源组件&#xff0c;但开发团队还是选择重新手写一套组件库或框架的情况&#xff0c;这在软件业界比比皆是。 下面说下游戏项目里重复造轮子的几点原因。 一&#xff0c;精简化 一般开源项目为了适应多场景多业…

永久禁止windows自动更新方法

文章目录 前言一、打开本地组策略编辑器二、禁用windows更新总结 前言 每次打开电脑&#xff0c;右下角就会弹出设备更新提示&#xff0c;看着令人烦恼&#xff0c;并且更新可能导致电脑设置发生改变甚至是卡顿&#xff0c;所以为了自己方便于是出了禁用电脑更新的办法&#x…