数据库设计、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.mzph.cn/news/688224.shtml

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

相关文章

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(深入)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…

Java+Swing+Txt实现通讯录管理系统

目录 一、系统介绍 1.开发环境 2.技术选型 3.功能模块 4.系统功能 1.系统登录 2.查看联系人 3.新增联系人 4.修改联系人 5.删除联系人 5.工程结构 二、系统展示 1.登录页面 2.主页面 3.查看联系人 4.新增联系人 5.修改联系人 三、部分代码 Login FileUtils …

2.18 day5/6 作业

作业&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园…

Kotlin基本语法 3 类

1.定义类 package classStudyclass Player {var name:String "jack"get() field.capitalize()set(value) {field value.trim()} }fun main() {val player Player()println(player.name)player.name " asdas "println(player.name)} 2.计算属性与防范…

Java 学习和实践笔记(12)

这个就比较有意思了&#xff01;所有的事情&#xff0c;拆分完之后&#xff0c;都有且只有这三种状态流程&#xff01; //TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or // click the <icon src"AllIcons.Actions.Execute&…

正大国际期货:日内交易

日内交易是一种交易模式&#xff0c;英文名字是daytrade,主要是指持仓时间短&#xff0c;不留过夜持仓的交易方式。日内交易捕捉入市后能够马上脱离入市成本的交易机会&#xff0c;入市之后如果不能马上获利&#xff0c;就准备迅速离场

程序员可以做一辈子吗?大龄程序员出路在哪?

前言 随着2023年AI的出现&#xff0c;大家对待程序员工作有了一丝丝危机感&#xff0c;特别是今年整个IT行业进入了前所未有的寒冬期&#xff0c;让程序员不得不思考未来的职业发展。 甚至很多程序员一想到自己接近35岁&#xff0c;焦虑感油然而生&#xff0c;这也是大部分程…

基于YOLOv7算法的高精度实时雾天车辆行人目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时雾天车辆行人目标检测系统可用于日常生活中检测与定位bicycle、bus、car、motorbike和person&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。…

数据采集新纪元:Linux边缘计算技术在智慧工厂的应用解析

在当今全球智能制造的大潮下&#xff0c;Linux边缘计算网关正扮演着愈发重要的角色。它位于数据产生源头与云计算中心之间&#xff0c;为智慧工厂提供了关键的实时决策能力和高效的预测性维护解决方案。 以一家领先汽车零部件生产商为例&#xff0c;其高度自动化的生产线上的每…

C/C++数据结构——剖析排序算法

1. 排序的概念及其运用 1.1 排序的概念 https://en.wikipedia.org/wiki/Insertion_sorthttps://en.wikipedia.org/wiki/Insertion_sort 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…

力扣hot2--哈希

推荐博客&#xff1a; for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 字母异位词都有一个特点&#xff1a;也就是对这个词排序之后结果会相同。所以将排序之后的string作为key&#xff0c;将排序之后能变成key的单词组vector<string>作为value。 class Solution …

探索未来科技前沿:深度学习的进展与应用

深度学习的进展 摘要&#xff1a;深度学习作为人工智能领域的重要分支&#xff0c;近年来取得了巨大的进展&#xff0c;并在各个领域展现出惊人的应用潜力。本文将介绍深度学习的发展历程、技术原理以及在图像识别、自然语言处理等领域的应用&#xff0c;展望深度学习在未来的…

SQL29 计算用户的平均次日留存率(lead函数的用法)

代码 with t1 as(select distinct device_id,date --去重防止单日多次答题的情况from question_practice_detail ) select avg(if(datediff(date2,date1)1,1,0)) as avg_ret from (selectdistinct device_id,date as date1,lead(date) over(partition by device_id order by d…

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

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

什么是软件测试?软件测试的目的与原则是什么?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

原创详解OpenAI Sora是什么?技术先进在哪里?能够带来什么影响?附中英文技术文档

一&#xff1a;Sora是什么 Sora是一个文本到视频的模型&#xff0c;由美国的人工智能研究机构OpenAI开发。Sora可以根据描述性的文本提示&#xff0c;生成高质量的视频&#xff0c;也可以根据已有的视频&#xff0c;向前或向后延伸&#xff0c;生成更长的视频。 Sora的主要功…

反射的作用

获取一个类里面所有的信息&#xff0c;获取到了之后&#xff0c;再执行其他的业务逻辑结合配置文件&#xff0c;动态的创建对象并调用方法 练习1&#xff1a; public class MyTest {public static void main(String[] args) throws IllegalAccessException, IOException {Stude…

Swift 5.9 新 @Observable 对象在 SwiftUI 使用中的陷阱与解决

概览 在 Swift 5.9 中&#xff0c;苹果为我们带来了全新的可观察框架 Observation&#xff0c;它是观察者开发模式在 Swift 中的一个全新实现。 除了自身本领过硬以外&#xff0c;Observation 框架和 SwiftUI 搭配起来也能相得益彰&#xff0c;事倍功半。不过 Observable 对象…

C++学习Day06之继承方式

目录 一、程序及输出1.1 公共继承1.1.1 父类中公共成员&#xff0c;子类可以正常访问1.1.2 父类中保护成员&#xff0c;子类类外不可以访问1.1.3 父类中私有成员&#xff0c;子类无法访问 1.2 保护继承1.2.1 父类中公共权限 子类中变为 保护权限1.2.2 父类中保护权限 子类中变为…

自定义Linux登录自动提示语

设置提示语的方式 在Linux系统中&#xff0c;可以通过修改几个特定的文件来实现在用户登录时自动弹出提示语。以下是几个常用的方法&#xff1a; 1. 修改/etc/issue文件&#xff1a; 这个文件用于显示本地登录前的提示信息 sudo vi /etc/issue在项目合作的时候&#xff0c;…