快速入门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

智能推荐

java常见面试题(160道)_java面试题-程序员宅基地

文章浏览阅读5.4w次,点赞89次,收藏746次。java常见面试题_java面试题

LeetCode刷题总结(C语言版)_leetcode c语言-程序员宅基地

文章浏览阅读5.4k次,点赞6次,收藏73次。编程总结每每刷完一道题后,其思想和精妙之处没有地方记录,本篇博客用以记录刷题过程中的遇到的算法和技巧001)两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] ..._leetcode c语言

小程序开发者工具正常显示,但是真机调试和真机中安卓加载正常ios加载首页失败,首页的请求返回204_苹果 sec-fetch-dest-程序员宅基地

文章浏览阅读125次。检查请求头中的’sec-fetch-dest’: ‘document’ ,是否进行了特殊处理(node层)_苹果 sec-fetch-dest

ansible 批量安装zabbix-agent-程序员宅基地

文章浏览阅读321次。服务器初始化(这是在建立在新的服务器基础上做的初始化)关闭防火墙、selinux,添加epel常用源,安装常用工具、添加普通用户并禁止root1、服务器批量初始化[root@fwd ansible]# cat init.yml 系统初始化脚本---- hosts: all tasks: - name: disable selinux、firew..._ansible批量安装zabbix-agent

java日志系统--log4j配置解析过程,源码分析_log4j 源码分析 读取配置-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏2次。Logger.getLogger(Test.class);从getLogger开始,就启动了log4j的整个工作流程,通过调用LogManager获取logger实例return LogManager.getLogger(clazz.getName());LogManager类里面有个静态块static{},【初始化重要信息】【root logger】,做一些配置,其中url = Loader.ge_log4j 源码分析 读取配置

心灵震撼《一个8岁女孩的遗书》看完能有几人不哭…-程序员宅基地

文章浏览阅读533次。无奈的父亲­有一个美丽的小女孩,她的名字叫余艳,她有一双亮晶晶的大眼睛她有一颗透明的童心.她是一个孤儿,她在这个世界上只活了8年,她留在这个世界上最后的一句话是“我来过,我很乖”她希望死在秋天,纤瘦的身体就像一朵花自然开谢的过程.在遍地黄花堆积,落叶空中旋舞的时候,她会看见横空远行的雁儿们.她自愿放弃治疗,把全世界华人捐给她的54万分成了7份,把生命当成希望的蛋糕分给了7个正徘徊在生死线上的小

随便推点

EV/HEV中的牵引逆变器驱动优化-程序员宅基地

文章浏览阅读1.6k次,点赞42次,收藏35次。什么是牵引逆变器?从本质上讲,牵引逆变器是电动汽车动力系统中的一个子系统,它从电池中获取高电压,并将其转换为交流电压——因此被称为逆变器——并基本上为电机供电。它控制电机速度和扭矩,直接影响效率和可靠性,这正成为牵引逆变器设计的设计挑战。此图片来源于网络如今的电动汽车至少有一个牵引逆变器。有些型号实际上不止一个。一个在前轴上,一个在后轴上。甚至一些高端车型实际上每个车轮都有一个牵引逆变器。因此,效率和可靠性非常重要。所以,从逆变器和电机控制的市场趋势来看——从技术趋势来看,我们看到了功率水平的提高。

Ubuntu之apt命令_ubuntu18.04 atp命令使用技巧-程序员宅基地

文章浏览阅读134次。简介apt-cache和apt-get是apt包的管理工具,他们根据/etc/apt/sources.list里的软件源地址列表搜索目标软件、并通过维护本地软件包列表来安装和卸载软件。查看本机是否安装软件:whereis package_name 或者which package_name1.搜索软件sudo apt-cache search pa..._ubuntu18.04 atp命令使用技巧

查询Dynamics 365的Audit History_dynamics 审核历史记录如何查询-程序员宅基地

文章浏览阅读150次。【代码】查询Dynamics 365的Audit History。_dynamics 审核历史记录如何查询

python yield函数的用法-程序员宅基地

文章浏览阅读1.3w次,点赞15次,收藏66次。什么是yield函数?yield函数是python里面的关键字,带有yield的函数相当于一个生成器generator.当你使用一个yield的时候,对应的函数就是一个生成器在python里面类似于return函数,他们主要的区别就是:遇到return会直接返回值,不会执行接下来的语句.但是yield并不是,在本次迭代返回之后,yield函数在下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行下面是案例分析:案例一:def gen_generator(): yiel_yield函数

【QT笔记】QFile读文件问题_qfileread后指针会移动吗-程序员宅基地

文章浏览阅读917次。如果不用seek(0)的话,默认是自己会把读取文件的指针后移的,不用手动后移;_qfileread后指针会移动吗

dw8051基本测试示例_dw8051 part1-程序员宅基地

文章浏览阅读2.5k次。整理了网上一份简单的dw8051测试示例,共享到云盘:http://pan.baidu.com/s/1bnu9lZT1.目录如下:---dut ---rtl:DW8051的core文件 ---model:ROM和RAM的model文件---testbench ---rtl.f:filelist文件 ---test_top.v:仿真的top_dw8051 part1