JDBC和连接池01

1.JDBC概述

  • 基本介绍
  1. JDBC为访问不同的数据库提供了同一的接口,为使用者屏蔽了细节问题
  2. Java程序员使用JDBC,可以连接任何提供了jdbc驱动程序的数据库系统,从而完成对数据库的各种操作
  • jdbc原理图

    JDBC是java提供的一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可。不同的数据库厂商需要针对这套接口,提供不同的实现。

jdbc模拟实现

模拟JDBC驱动:

package jdbc.myjdbc;

/**
* 我们规定的jdbc接口(方法)规范
*/
public interface JdbcInterface {
//连接
public Object getConnection();
//crud
public void crud();
//关闭连接
public void close();
}

模拟Mysql驱动:

package jdbc.myjdbc;

/**
* 模拟 mysql数据库实现jdbc接口[由mysql厂商开发]
*/ public class MysqlJdbcImpl implements JdbcInterface{ @Override
public Object getConnection() {
System.out.println("得到 mysql 的连接");
return null;
} @Override
public void crud() {
System.out.println("完成 mysql 的增删改查"); } @Override
public void close() {
System.out.println("关闭 mysql 的连接");
}
}

模拟Oracle驱动:

package jdbc.myjdbc;

/**
* 模拟实现oracle的连接驱动-即实现规范接口
*/
public class OracleJdbcImpl implements JdbcInterface{
@Override
public Object getConnection() {
System.out.println("得到 oracle 的连接");
return null;
} @Override
public void crud() {
System.out.println("完成 oracle 的增删改查");
} @Override
public void close() {
System.out.println("关闭 oracle 的连接");
}
}

模拟java程序使用各种数据库驱动连接数据库:

package jdbc.myjdbc;

public class TestJdbc {
public static void main(String[] args) {
//完成mysql的操作
JdbcInterface jdbcInterface = new MysqlJdbcImpl();
jdbcInterface.getConnection();// 通过接口来调用实现类[动态绑定]
jdbcInterface.crud();
jdbcInterface.close();
System.out.println("==============");
//完成oracle的操作
jdbcInterface = new OracleJdbcImpl();
jdbcInterface.getConnection();// 通过接口来调用实现类[动态绑定]
jdbcInterface.crud();
jdbcInterface.close();
}
}

  • JDBC API

jdbc api是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql与javax.sql包中。

2.JDBC快速入门

2.1JDBC程序编写步骤

  1. 注册驱动 -- 加载Driver类

  2. 获取连接 -- 得到Connection

  3. 执行增删改查 -- 发送SQL命令给mysql执行

  4. 释放资源 -- 关闭相关连接

例子--通过jdbc对表actor进行添加,删除和修改操作

  1. 首先在SQL yog使用mysql数据库创建一个演员actor表
-- 创建测试表 演员表
CREATE TABLE actor(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL DEFAULT '',
sex CHAR(1) NOT NULL DEFAULT '女',
borndate DATETIME,
phone VARCHAR(12)
); SELECT * FROM actor;
  1. 下载mysql连接驱动

  1. 在项目中创建libs文件夹,将驱动复制进文件夹中,右键点击驱动,选择ad as library

  2. 在弹出的窗口中点击OK,即可

package li.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; /**
* 这是第一个jdbc程序,完成简单的操作
*/
public class jdbc01 {
public static void main(String[] args) throws SQLException {
//前置工作:在项目下创建一个文件夹如 libs
//将mysql.jar拷贝到该目录下,点击add to project.. 加入到项目中 //1.注册驱动
Driver driver = new Driver();//创建一个driver对象 //2.得到连接
/**
* jdbc:mysql:// 是规定好的协议,表示通过jdbc的方式来连接mysql
* localhost 表示要连接到的主机ip地址
* 3306 表示mysql监听的端口
* hsp_db02 表示连接到 mysql DBMS的哪个数据库
*/
// mysql的连接本质就是socket的连接
String url = "jdbc:mysql://localhost:3306/hsp_db02"; //将用户名和密码放入到一个Properties对象中
Properties properties = new Properties();
// user 和 password 是规定好的,后面的值根据实际情况写
properties.setProperty("user", "root");//用户
properties.setProperty("password", "123456");//密码 Connection connect = driver.connect(url, properties); //3.执行sql
String sql = "insert into actor values(null,'刘德华','男','1970-11-11','110')";
//String sql = "update actor set name ='周星驰' where id = 1 ";
//String sql = "delete from actor where id = 1 ";
//Statement 用于执行静态SQL语句并返回其生成的结果的对象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql);//如果是dml语句,返回的就是影响的行数
System.out.println(rows > 0 ? "成功" : "失败"); //4.关闭连接资源
statement.close();
connect.close();
}
}

在SQL yog中执行语句查询,发现actor表中成功插入一条数据

2.2数据库连接的5种方式

2.2.1方式1

//获取Driver实现类对象
Driver driver = new com.mysql.jdbc.Driver(); String url = "jdbc:mysql://localhost:3306/jdbc_db"; Properties info = new Properties();
info.setProperty("user", "root");//用户
info.setProperty("password", "123456");//密码
Connection conn = driver.connect(url,info);
System.out.println(conn);

2.2.2方式2

方式1会直接使用com.mysql.jdbc.Driver(),属于静态加载,灵活性差,依赖性强

方式2使用反射机制进行动态加载,而且信息可以放入配置文件中保存,更利于项目的控制

例子

package li.jdbc;

//分析java连接mysql的5种方式

import com.mysql.jdbc.Driver;
import org.junit.Test; import java.sql.Connection;
import java.util.Properties; public class jdbcConn {
//方式2
@Test
public void connect02() throws Exception {
//使用反射加载Driver类,动态加载,更加地灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)aClass.newInstance(); String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码 放入到 Properties对象中
Properties properties = new Properties();
// user 和 password 是规定好的,后面的值根据实际情况写
properties.setProperty("user", "root");//用户
properties.setProperty("password", "123456");//密码
Connection connect = driver.connect(url, properties);
System.out.println("方式2="+connect);
}
}

2.2.3方式3

在方式2的基础上使用DriverManager替换Driver




例子

package li.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.Test; import java.sql.Connection;
import java.sql.DriverManager; public class jdbcConn { //方式3 使用DriverManager替换Driver进行统一管理
@Test
public void connect03() throws Exception {
//使用反射加载Driver类
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)aClass.newInstance();
//创建 url和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "123456"; DriverManager.registerDriver(driver);//注册Driver驱动
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式3="+connection);
}
}

2.2.4方式4

使用Class.forName自动完成注册驱动,简化代码

例子

//方式4 使用Class.forName自动完成注册驱动,简化代码
// 这种方式获取连接是使用得最多的,推荐使用
@Test
public void connect04() throws Exception {
//使用反射加载Driver类
//在加载Driver类时,完成了注册
/**
* 在 Driver类的源码中:
* 1.静态代码块在类加载时会执行一次
* 2.DriverManager.registerDriver(new Driver());
* 3.因此 注册Driver的工作已经在底层完成了
* static {
* try {
* DriverManager.registerDriver(new Driver());
* } catch (SQLException var1) {
* throw new RuntimeException("Can't register driver!");
* }
* }
*/
Class.forName("com.mysql.jdbc.Driver"); //创建 url和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "123456"; Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式4="+connection);
}

方法4相比于方法3,减少了注册驱动的操作,但是连接数据库的步骤不是需要注册驱动吗?为什么可以这样呢?

在Driver类的源码中,我们可以看到有这样的一个静态代码块:

而静态代码块在类加载时会执行一次,在使用反射加载Driver类时,就执行了DriverManager.registerDriver(new Driver());语句。

即在加载Driver类时,完成了注册。因此,可以在程序中省略注册的步骤。

注意:

  1. mysql驱动5.1.6之后连Class.forName("com.mysql.jdbc.Driver");也不需要写了

  2. 从jdk1.5以后使用了jdbc4,不再需要显式调用Class.forName()注册驱动,而是自动调用驱动jar包下的META-INF\services\java.sql.Driver文本中的类名称去注册

  3. 但是还是建议写上Class.forName("com.mysql.jdbc.Driver");,更加明确

2.2.5方式5

在方式4的基础上使用配置文件,连接数据库更加灵活


例子

首先在src文件夹下面创建一个Properties文件

user=root
password=123456
url=jdbc:mysql://localhost:3306/hsp_db02
driver=com.mysql.jdbc.Driver

方式5:推荐使用

  //方式5 在方式4的基础上使用配置文件,连接数据库更加灵活
@Test
public void connect05() throws Exception {
//通过Properties对象拿到配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver"); Class.forName(driver);//建议写上
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式5="+connection); }

day45-JDBC和连接池01的更多相关文章

  1. c3p0、dbcp、tomcat jdbc pool 连接池配置简介及常用数据库的driverClass和驱动包

    [-] DBCP连接池配置 dbcp jar包 c3p0连接池配置 c3p0 jar包 jdbc-pool连接池配置 jdbc-pool jar包 常用数据库的driverClass和jdbcUrl ...

  2. jdbc数据连接池dbcp要导入的jar包

    jdbc数据连接池dbcp要导入的jar包 只用导入commons-dbcp-x.y.z.jarcommons-pool-a.b.jar

  3. 关于JDBC和连接池我学到的(转载保存)

    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...

  4. JDBC之 连接池

    JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...

  5. JDBC数据源连接池(4)---自定义数据源连接池

    [续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...

  6. JDBC数据源连接池(3)---Tomcat集成DBCP

    此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...

  7. JDBC数据源连接池(2)---C3P0

    我们接着<JDBC数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3P0的j ...

  8. DBCP,C3P0与Tomcat jdbc pool 连接池的比较

    hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...

  9. JDBC数据源连接池的配置和使用实例

    个人学习参考所用,勿喷! 使用JDBC建立数据库连接的两种方式: 1.在代码中使用DriverManager获得数据库连接.这种方式效率低,并且其性能.可靠性和稳定性随着用户访问量得增加逐渐下降. 2 ...

随机推荐

  1. 针对新手 按照使用顺序和频率整理的git常用指令

    PS:以下内容中的所有 aaaaaa 均为可替换的自定义内容 git status 查看当前版本状态,判断有没有未提交的变动 git add . 添加到暂存区(注意有个点)git commit -m ...

  2. React报错之Property 'X' does not exist on type 'HTMLElement'

    正文从这开始~ 总览 在React中,当我们试图访问类型为HTMLElement 的元素上不存在的属性时,就会发生Property 'X' does not exist on type 'HTMLEl ...

  3. 基于mpvue的框架开发微信小程序(搭建环境)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_103 美团很早就开源了mpvue这个项目,如此看来,美团可不仅仅是一家团购网站,真正的技术驱动型企业,使得我们多了一种用来开发微信 ...

  4. [b01lers2020]Welcome to Earth-1

    1.打开之后界面如下,查看源代码信息,发现chase文件,结果如下: 2.访问chase文件会一直跳转到die界面,那就只能抓包进行查看,发现leftt文件,结果如下: 3.访问leftt文件并查看源 ...

  5. 一文搞懂│XSS攻击、SQL注入、CSRF攻击、DDOS攻击、DNS劫持

    目录 XSS 攻击 SQL 注入 CSRF 攻击 DDOS 攻击 DNS 劫持 XSS 攻击 全称跨站脚本攻击 Cross Site Scripting 为了与重叠样式表 CSS 进行区分,所以换了另 ...

  6. 哈工大软件构造Lab3(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...

  7. C 语言 时间函数使用技巧(汇总)

    time.h 头文件 是 C 语言中 有关 时间的函数所储存的头文件 #include <time.h> 在介绍时间函数用法之前,我们首先要了解在 time.h 头文件中已经声明了的一个结 ...

  8. Python 工匠: 异常处理的三个好习惯

    前言 这是 "Python 工匠"系列的第 6 篇文章.(点击原文链接,可查看系列其他文章) 如果你用 Python 编程,那么你就无法避开异常,因为异常在这门语言里无处不在.打个 ...

  9. 46th ECfinal 游记

    Day0 坐高铁坐了七小时从北戴河到西安,但第一次线下赛,来的路上还是很激动的 路上看到华山,下次来西安一定去爬 刚下高铁站遇到了一个不知道干啥的xjj xjj:可以占用您一点时间吗?谢谢了. 我:不 ...

  10. 【Java】学习路径62-枚举类型

    public enum Role { TEACHER,STUDENT,CHEF } 使用: System.out.println(r1);//输出TEACHER System.out.println( ...