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); }

最新文章

  1. QQ,微信第三方登陆
  2. 数据结构:单链表结构字符串(python版)添加了三个新功能
  3. android 屏幕分辨率 更改
  4. 稳定灵活的 HTML 列式布局
  5. Flex布局语法与实践
  6. 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输
  7. XShell 安装与虚拟机连接
  8. jQuery学习-----(二)JQuery对象与DOM对象的区别与转换
  9. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS
  10. 为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)
  11. 2017 清北济南考前刷题Day 4 afternoon
  12. KendoUi 学习笔记(二) Grid
  13. py3,休息时间玩点小把戏
  14. React Native常用组件之ScrollView
  15. oracle 替换字符 replace
  16. mac 苹果鼠标 magic mouse2 当触摸代替点击当触摸板教程
  17. Java之IO(六)FileInputStream和FileOutputStream
  18. 最近github上的一些有用链接资料备份
  19. DHCP, NAT
  20. android滚条简单说明

热门文章

  1. 排查jar包使用的第三方包并导出清单
  2. Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像
  3. 兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
  4. Kubernetes的整体架构
  5. 先导,对IOC容器的理解
  6. HCIA-Datacom 3.2 实验二:生成树基础实验
  7. 基于 Sequelize.js + Express.js 开发一套 Web 后端服务器
  8. Vue 内联样式
  9. python压缩pdf(指定缩放比例)
  10. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者,再识AutoResponder标签-上篇