JDBC 和数据库连接池
1. JDBC 概述
1.1 基本介绍
- JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题
- Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
- JDBC的基本原理图[重要!]
1.2 模拟JDBC
- 先创建一个我们规定的 jdbc 接口(方法)
package com.song.jdbc.myjdbc;
/**
* 我们规定的 jdbc 接口(方法)
*/
public interface JdbcInterface {
//连接
public Object getConnection();
//crud
public void crud();
//关闭连接
public void close();
}
- 然后mysql数据库实现jdbc接口(这里我们简单的模拟一下)
package com.song.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 的连接");
}
}
- 完成对mysql的操作
package com.song.jdbc.myjdbc;
public class TestJDBC {
public static void main(String[] args) {
//完成对mysql的操作
JdbcInterface jdbcInterface = new MysqlJdbcImpl();
//通过接口来调用实现类[动态绑定]
jdbcInterface.getConnection();
jdbcInterface.crud();
jdbcInterface.close();
}
}
- 同样换成Oracle实现jdbc接口(这里我们简单的模拟一下)
package com.song.jdbc.myjdbc;
/**
* 模拟 oracle 数据库实现 jdbc
*/
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 的连接");
}
}
- 这里完成对Oracle的操作跟mysql的一样,只是修改了一下对象
package com.song.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();
}
}
1.3 JDBC 带来的好处
- 如果Java直接访问数据库(示意图)
- JDBC带来的好处(示意图)
- 说明:JDBC是Java提供一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。
1.4 JDBC API
JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQI语句,并到得到返回结果等各类操作, 相关类和接口在 java.sql与javax.sql包中
2.JDBC 快速入门
2.1 JDBC 程序编写步骤
- 注册驱动 - 加载Driver 类
- 获取连接 - 得到Connection
- 执行增删改查 - 发送SQL 给mysql执行
- 释放资源 - 关闭相关连接
2.2 JDBC 第一个程序
通过jidbc 对 表 actor 进行 添加,删除和修改操作
先在SQLyog中创建一个演员表
use sys_db02;
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));
2.3 JDBC 第一个程序代码演示
- 打开idea,先进行前置工作
//前置工作: 1.在项目下创建一个文件夹(Directory)比如 libs
// 2.将 mysql.jar 拷贝到该目录下,
// 3.右击mysql.jar文件,点击 add to project ..加入到项目中
- 注册驱动,创建一个driver对象
//1.注册驱动
Driver driver = new Driver();//创建一个Driver对象
- 连接mysql
//2.得到连接
//解读
//1.jdbc:mysql:// 这段是规定好的,通过jdbc的连接方式是mysql
//2.localhost的位置可以是ip地址,我这边正好在主机上操作
//3.3306表示我们mysql监听的端口
//4.sys_db02 表示连接到mysql的哪个数据库
//mysql的连接本质就是前面学过的socket连接
String url = "jdbc:mysql://localhost:3306/sys_db02";
//将用户名和密码放入到 Properties 对象
Properties properties = new Properties();
//说明
//这里的 user 和 password 是规定好的,
//后面的值根据实际情况填写,比如 root 和 sys
properties.setProperty("user","root");//用户
properties.setProperty("password","sys");//密码
//尝试给数据库连接到指定的 url
Connection connect = driver.connect(url, properties);
- 执行sql
//3.执行 sql
//String sql = "insert into actor values(null,'周杰伦','男','1979-01-18','110')";
//String sql = "insert into actor values(null,'林俊杰','男','1981-03-27','120')";
String sql = "update actor set phone = '119' where name = '林俊杰'";
//statement 用于执行静态SQL语句并返回其生成的结果的对象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql);//如果是 dml语句,返回的就是影响行数
//提示
System.out.println(rows>0?"成功":"失败");
- 关闭连接
//4.关闭连接
statement.close();
connect.close();
- 运行idea,然后打开SQLyog,发现数据已经插入表格中
3. 获取数据库连接 5 种方式
3.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","sys");
Connection conn = driver.connect(url, info);
System.out.println(conn);
- 案例演示:
package com.song.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 分析java连接mysql的5种方式
*/
public class JdbcConn {
//方式一
@Test
public void connect01() throws SQLException {
Driver driver = new Driver();
String url = "jdbc:mysql://localhost:3306/sys_db02";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "sys");
Connection connect = driver.connect(url, properties);
System.out.println(connect);
}
}
3.2 方式二
- 基本语法
//方式1 会直接使用 com.mysql.jdbc.Driver(),属于静态加载,灵活性差,依赖强
//---于是我们推出---> 方式2
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
String url = "jdbc:mysql://localhost:3306/jdbc_db";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password", "abc123");
Connection conn = driver.connect(url, info);
System.out.println(conn);
- 案例演示:
package com.song.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 分析java连接mysql的5种方式
*/
public class JdbcConn {
//方式二
@Test
public void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
//使用反射加载类
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/sys_db02";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "sys");
Connection connect = driver.connect(url, properties);
System.out.println(connect);
}
}
3.3 方式三
- 基本语法
// 使用DriverManager替换Driver
Class clazz = Class.forName("com.mysqljdbc.Driver")
Driver driver = (Driver) clazz.newlnstance();
String url = "jdbc:mysql://localhost:3306/jdbc_db";
String user = "root";
String password = "sys";
DriverManager.registerDriver(driver);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
- 案例演示:
package com.song.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 分析java连接mysql的5种方式
*/
public class JdbcConn {
//方式三
@Test
public void connect03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/sys_db02";
String user = "root";
String password = "sys";
DriverManager.registerDriver(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第三种方式:" + connection);
}
}
3.4 方式四
- 基本语法
// 使用 Class.forName 自动完成注册驱动,简化代码 => 分析源码
Class.forName("com.mysal.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_db";
String user = "root";
String password = "hsp"
Connection conn = DriverManager.getConnection(url, user, password);.
System.out.println(conn);
- 案例演示:
package com.song.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 分析java连接mysql的5种方式
*/
public class JdbcConn {
//方式四:使用Class.forName自动完成注册驱动,简化代码
@Test
public void connect04() throws ClassNotFoundException, SQLException {
//使用反射加载Driver类
//在加载Driver类时,完成注册
/*
源码:com.mysql.jdbc.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<?> aClass = Class.forName("com.mysql.jdbc.Driver");不写也可以
//原因:
// 1.mysqL驱动5.1.6可以无需CLass,forName(“com.mysql.jdbc.Driver”);
// 2.从idk1.5以后使用了jdbc4,不再需要显示调用class.forName()注册驱动而是
// 自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册
// 3.不过建议还是写上 CLassforName(“com.mysql.jdbc.Driver”),更加明确
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/sys_db02";
String user = "root";
String password = "sys";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第四种方式:" + connection);
}
}
3.5 方式五
//使用配置文件,连接数据库更灵活
1.Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","root""root”);
//中的字符串 各个值,比如端口,数据库,用户名,密码为了方便,我们可以将信息写入到.properties 文件中,方便操作
2.jdbc.properties
user=root
password=sys
url=jdbc:mysql://localhost:3306/girls
driver=com.mysql.jdbc.Driver
-
案例演示:
- 先创建一个properties文件,把相应的数据放入
user=root password=sys url=jdbc:mysql://localhost:3306/sys_db02 driver=com.mysql.jdbc.Driver
- 然后进行操作:
package com.song.jdbc; import com.mysql.jdbc.Driver; import org.junit.jupiter.api.Test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * 分析java连接mysql的5种方式 */ public class JdbcConn { //第五种方式 @Test public void connect05() throws IOException, ClassNotFoundException, SQLException { //通过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<?> aClass = Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, user, password); System.out.println("第五种方式:"+connection); } }
3.6 数据库连接小练习
使用方式5完成下面数据库的连接
- 创建 news 表
- 使用 jdbc 添加 5条数据
- 修改 id = 1的记录,将content 改成 一个新的消息
- 删除id = 3 的记录
思路分析:
- 先在MySQL中创建一个news表
-- 1. 创建 news 表
CREATE TABLE news(
id INT PRIMARY KEY AUTO_INCREMENT,-- 主键自增长
content VARCHAR(64)NOT NULL DEFAULT'')
-- 查询
SELECT * FROM news;
- 然后在src下创建一个mysql.properties 存入mysql的相关信息
user=root
password=sys
url=jdbc:mysql://localhost:3306/sys_db02
driver=com.mysql.jdbc.Driver
- 接下来idea连接mysql并对news表格进行相应的操作
package com.song.jdbc;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcExercise {
public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
//使用方式5完成下面数据库的连接
//1. 创建 news 表
//在MySQL中创建一张news表
/**
* CREATE TABLE news(
* id INT,
* content VARCHAR(64)NOT NULL DEFAULT'')
*/
//通过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);
//尝试给数据库连接到指定的 url
Connection connection = DriverManager.getConnection(url, user, password);
//2. 使用 jdbc 添加 5条数据
//添加 sql 数据
String sql1 = "insert into news values(null,'上海新闻')";
String sql2 = "insert into news values(null,'北京新闻')";
String sql3 = "insert into news values(null,'深圳新闻')";
String sql4 = "insert into news values(null,'广州新闻')";
String sql5 = "insert into news values(null,'江苏新闻')";
//statement 用于执行静态SQL语句并返回其生成的结果的对象
Statement statement = connection.createStatement();
int i1 = statement.executeUpdate(sql1);
int i2 = statement.executeUpdate(sql2);
int i3 = statement.executeUpdate