快速入门Jdbc原理+Jdbc实战

一、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每个连接最多缓存多少个SQL20
filters这里配置的是插件,常用的插件有:stat,wall,slf4j
监控统计: filter:stat
日志监控: filter:log4j 或者 slf4j
防御SQL注入: filter:wall
connectProperties连接属性。比如设置一些连接池统计方面的配置。
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
比如设置一些数据库连接属性:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

As_theWind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值