快速入门Jdbc原理+Jdbc实战-程序员宅基地

技术标签: java  JDBC  jar  数据库  

一、JDBC简介

JDBC概念:

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

JDBC本质:

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

JDBC好处

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

二、JDBC快速入门

  1. 创建工程,导入驱动jar包
    在这里插入图片描述
  2. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
  1. 获取连接
Connection conn = DriverManager.getConnection(url,username,password);
  1. 定义SQL语句
String sql = "update..";
  1. 获取执行SQL对象
Statement stmt = conn.createStatement();
  1. 执行SQL
stmt.executeUpdate(sql);
  1. 处理返回结果
  2. 释放资源
stmt.close();
conn.close();

在这里插入图片描述

三、JDBC API详解

1.DriverManager

DriverManger(驱动管理类)作用:

1.注册驱动

Class.forName("com.mysql.jdbc.Driver");

查看源码

    static {
    
        try {
    
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
    
            throw new RuntimeException("Can't register driver!");
        }
    }

提示:
MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

2.获取连接

Connection conn = DriverManager.getConnection(url, username, password);

参数

  1. url:连接路径
    在这里插入图片描述
    2.user:用户名
    3.password:密码

2.Connection

conncetion(数据库连接对象)作用:

1.获取执行SQL对象

  • 普通执行SQL对象
Statement stmt = conn.createStatement();
  • 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement stmt = conn.prepareStatement(sql);
  • 执行存储过程的对象
CallableStatemnet stmt = prepareCall(sql);

2.管理事务

  • MySQL事务管理
    在这里插入图片描述

  • JDBC事务管理:Connection接口中定义了3个对应的方法
    在这里插入图片描述

3.Statement

Statement作用:执行SQL语句

执行SQL语句
在这里插入图片描述

4.ResultSet

ResultSet(结果集对象)作用:

  • 封装了DQL查询语句的结果
ResultSet   stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
  • 获取查询结果
    在这里插入图片描述

  • 使用步骤:
    1.游标向下移动一行,并判断该行否有数据:next()
    2.获取数据:getXxx(参数)
    在这里插入图片描述
    需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
    在这里插入图片描述

package com.itheima.jdbc;

import com.itheima.pojo.Account;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * JDBC API 详解:ResultSet
 */
public class JDBCDemo_resultSet {
    
    public static void main(String[] args) throws Exception {
    
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接:如果连接是本机的mysql并且端口是默认的3306可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3.定义sql
        String sql = "select * from account";

        //4.获取Statememt对象
        Statement stmt = conn.createStatement();

        //5.执行
        ResultSet rs = stmt.executeQuery(sql);
        List<Account> list = new ArrayList<>();
        //6.处理结果,遍历rs中所有数据
        //6.1光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()) {
    
            Account account = new Account();


            //6.2获取数据
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);
            account.setId(id);
            account.setName(name);
            account.setMoney(money);


            //存入集合
            list.add(account);
            System.out.println(list);
        }
        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

5.PreparedStatement

1.PreparedStatement作用:

预编译SQL语句并执行:预防SQL注入问题
①获取PreparedStatement对象

//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";

//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

②设置参数值

在这里插入图片描述
③执行SQL

executeUpdate();	/executeUpdate(); :不需要再传递sql
  • SQL注入
    • SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

2.PreparedStatement原理

  • PreparedStatement好处
    1. 预编译SQL,性能更高
    2. 防止SQL注入:将敏感字符进行转义

①PreparedStatement预编译功能开启:useServerPrepStmts=true
②配置MySQL执行日志(重启mysql服务后生效)

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
  • PreparedStatement原理
    1. 在获取PreparedStatement对象时,将SQL语句发送给mysql服务器进行检查,编译(这步骤很耗时)
    2. 执行时就不用再进行这些步骤了,速度更快
    3. 如果sql模板一样,则只需要进行一次检查、编译

在这里插入图片描述

四、数据库连接池

1.数据库连接池简介

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)

  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

  • 好处:

    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏

    在这里插入图片描述

2.Druid数据库连接池

  • 标准接口:DataSource
    • 官方sun提供的数据库连接池标准接口,由第三方组织实现此接口。
    • 功能:获取连接
Connection getConnection();
  • 常见的数据库连接池:

    • DBCP
    • C3P0
    • Druid
  • Druid(德鲁伊)

    • Druid连接池是阿里巴巴开源的数据库连接池项目
    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

3.Druid使用步骤

1.导入jar包druid-1.1.12.jar

在这里插入图片描述

2.定义配置文件 druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数量
maxActive=10
# 最大等待时间
maxWait=3000

3.加载配置文件

        Properties prop = new Properties();
        prop.load(new FileInputStream("out/production/jdbc-demo/druid.properties"));
		//查看当前路径
		System.out.println(System.getProperty("user.dir"));

4.获取数据库连接池对象

        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

5.获取连接

        Connection conn = dataSource.getConnection();
        System.out.println(conn);

4.druid配置详解

属性 说明 建议值
url 数据库的jdbc连接地址。一般为连接oracle/mysql。示例如下:
mysql : jdbc:mysql://ip:port/dbname?option1&option2&…
oracle : jdbc:oracle:thin:@ip:port:oracle_sid
username 登录数据库的用户名
password 登录数据库的用户密码
initialSize 启动程序时,在连接池中初始化多少个连接 10-50已足够
maxActive 连接池中最多支持多少个活动会话
maxWait 程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池 100
没有可用连接,单位毫秒,设置-1时表示无限等待
minEvictableIdleTimeMillis 池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将 见说明部分
回收该连接,要小于防火墙超时设置
net.netfilter.nf_conntrack_tcp_timeout_established的设置
timeBetweenEvictionRunsMillis 检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查
keepAlive 程序没有close连接且空闲时长超过 minEvictableIdleTimeMillis,则会执 true
行validationQuery指定的SQL,以保证该程序连接不会池kill掉,其范围不超
过minIdle指定的连接个数。
minIdle 回收空闲连接时,将保证至少有minIdle个连接. 与initialSize相同
removeAbandoned 要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该 false,当发现程序有未
连接,不管该连接中是活动还是空闲, 以防止进程不会进行close而霸占连接。 正常close连接时设置为true
removeAbandonedTimeout 设置druid 强制回收连接的时限,当程序从池中get到连接开始算起,超过此 应大于业务运行最长时间
值后,druid将强制回收该连接,单位秒。
logAbandoned 当druid强制回收连接后,是否将stack trace 记录到日志中 true
testWhileIdle 当程序请求连接,池在分配连接时,是否先检查该连接是否有效。(高效) true
validationQuery 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果
正常返回,则表示连接可用,否则表示连接不可用
testOnBorrow 程序 申请 连接时,进行连接有效性检查(低效,影响性能) false
testOnReturn 程序 返还 连接时,进行连接有效性检查(低效,影响性能) false
poolPreparedStatements 缓存通过以下两个方法发起的SQL: true
public PreparedStatement prepareStatement(String sql)
public PreparedStatement prepareStatement(String sql,
int resultSetType, int resultSetConcurrency)
maxPoolPrepareStatementPerConnectionSize 每个连接最多缓存多少个SQL 20
filters 这里配置的是插件,常用的插件有: stat,wall,slf4j
监控统计: filter:stat
日志监控: filter:log4j 或者 slf4j
防御SQL注入: filter:wall
connectProperties 连接属性。比如设置一些连接池统计方面的配置。
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
比如设置一些数据库连接属性:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40492693/article/details/125251301

智能推荐

linux嵌入式串口与zigbee,zigbee的串口与STM32通信-程序员宅基地

文章浏览阅读1.2k次。在TI 的CC2530中,使用的是协议栈Z-Stack2007,现在想通过串口与STM32通信,当STM32给zigbee发送数据时,zigbee接收,只是接收的这部分代码TI给封装起来了,只知道在配置里头是这样的:/* @ZL 串口初始化 */halUARTCfg_t uartConfig;/* UART Configuration */uartConfig.configured ..._linux zigbee stack

jieba 计算2个句子的文本相似度(Python实现)_jieba判断语义重复-程序员宅基地

文章浏览阅读6.1k次,点赞7次,收藏33次。余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。github 参考链接:https://github.com/ZhanPwBibiBibi/CHlikelihood# -*- coding: utf-8 -*-import jiebaimport numpy as npimport redef get_word_vector(s1,s2): """ :pa.._jieba判断语义重复

Openmesh函数库设计及与CGAL的对比_openmesh和cgal-程序员宅基地

文章浏览阅读4.7k次。Openmesh函数库设计及与CGAL的对比在前面写了CGAL模板类设计的一些思路,这里尝试写一点openmesh库的设计思路以及和CGAL的对比.虽然OPENMESH代码量小,不过还是只看懂皮毛,很大部分算是翻译帮助文档吧,主要用作笔记,方便以后继续分析。相对CGAL的功能强大和庞大(包含大量计算几何算法的实现),Openmesh显得更加小巧轻量化,它更专_openmesh和cgal

常用验证函数-程序员宅基地

文章浏览阅读1.1k次。//函数名:chksafe//功能介绍:检查是否含有"",//,"/"//参数说明:要检查的字符串//返回值:0:是 1:不是function chksafe(a){ return 1;/* fibdn = new Array ("" ,"//", "、", ",", ";", "/"); i=fibdn.length; j=a.length; for (ii=0;ii { for (

关于C语言编译的可执行文件 exe 发给好友解决办法 Visual Studio 2013 版本_将c语言可执行程序发给别人-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏14次。下面展示一些 内联代码片。前提是用的 Visual Studio 工具你是不是把 exe 可执行文件发给好友之后,好友打开是这种情况?下面展示一些 内联代码片。就解决办法:然后_将c语言可执行程序发给别人

mysql运行报错64bit_关于MySQL5.6.25在Win7 64bit下重装后无法启动的解决方法-程序员宅基地

文章浏览阅读340次。在重装MySQL5.6.25安装到进行配置的时候,一直在等待服务的启动。如果手动在系统服务启动会提示1067错误,这个错误在网上很常见,然而我试过了很多方法均无法解决。于是看ProgramData\MySQL Server 5.6\data下的 ***.err 错误日志,看出错的部分:2015-06-04 13:08:19 5200 [Warning] InnoDB: Doublewrite do..._windows [error] innodb: header page consists of zero bytes in datafile: .\ib

随便推点

IDEA连接Mysql失败:下载驱动失败,Failed todownload Cannot download Read timed out_idea com.mysql:mysql-connector下载卡住-程序员宅基地

文章浏览阅读482次,点赞7次,收藏8次。解决:1. 手动加入jar包2.选择自己maven仓库中存在mysql-connector3. 选择完毕后,确定使用:4. 进行测试连接_idea com.mysql:mysql-connector下载卡住

Java连接Redis存取数据(详细)_redis导入导出数据java-程序员宅基地

文章浏览阅读6.5k次,点赞4次,收藏30次。Java连接Redis存取数据一.相关工具二.准备工作1.启动redis2.外部连接测试3.新建连接。4.连接成功三.新建jedis项目1.新建项目2.命名项目3.引入相关jar包4.引入 junit5.新建包com.redis.test四.编写代码1.redis.properties : redis连接配置文件2.RedisPoolUtil : 连接池配置工具3.SerializeUtil : ..._redis导入导出数据java

android dialog自定义布局 圆角背景 点击空白处不关闭 设置dialog大小-程序员宅基地

文章浏览阅读748次。1.首先上布局文件&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;LinearLayout ="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="300d

【算法】从记忆化搜索到递推——动态规划入门_记忆化搜索和递推-程序员宅基地

文章浏览阅读311次。本文的题目其实都比较简单,但是为了学习记忆化搜索,还是要用记忆化搜索再做一遍,不要眼高手低。由于 dp 数组的无后效性,因此还可以将 dp 数组优化成两个变量。将大问题分解成子问题,即 dfs (i) 可以分解成 dfs (i - 1)对于简单的 dp 题,直接写 dp 还更简单一些,硬写记忆化搜索还有点难。因为——有些动态规划直接去想递推公式太难了,所以可以先写成记忆化搜索。由于记忆化搜索是从将大问题分解成子问题的角度去考虑的,所以会简单一些。如果读者觉得本文的题目太简单了,可以去尝试一下。_记忆化搜索和递推

2021-07-12嵌入式学习---交叉编译_交叉编译 prefix-程序员宅基地

文章浏览阅读336次。1、交叉编译交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例:我们在Ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行的,不是在Ubuntu Linux上面运行。2、为什么要交叉编译1.有时是因为目的平台(C51)上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;2.有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;3.有时又是因为目的_交叉编译 prefix

使用java Future模式异步调用详细实例展示-程序员宅基地

文章浏览阅读821次。java Future模式想必大家都比较熟悉,大体实现起来也比较简单,因为模式单一,我先介绍一下一般步骤,再讲一下,目前项目中遇到具体问题的解决方式 一般来说,使用java Future模式实现多线程,具体步骤如下, 1.新建一个异步任务类,如 xxxTask 实现 Callable&lt;xxxTask.Result&gt;(或者Runnable&lt;xxx&gt;...

推荐文章

热门文章

相关标签