-
day45-JDBC和连接池01
1.JDBC概述
- 基本介绍
- JDBC为访问不同的数据库提供了同一的接口,为使用者屏蔽了细节问题
- 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{ |
|
|
|
|
|
public Object getConnection() { |
|
System.out.println("得到 mysql 的连接"); |
|
return null; |
|
} |
|
|
|
|
|
public void crud() { |
|
System.out.println("完成 mysql 的增删改查"); |
|
|
|
} |
|
|
|
|
|
public void close() { |
|
System.out.println("关闭 mysql 的连接"); |
|
} |
|
} |
模拟Oracle驱动:
|
package jdbc.myjdbc; |
|
|
|
/** |
|
* 模拟实现oracle的连接驱动-即实现规范接口 |
|
*/ |
|
public class OracleJdbcImpl implements JdbcInterface{ |
|
|
|
public Object getConnection() { |
|
System.out.println("得到 oracle 的连接"); |
|
return null; |
|
} |
|
|
|
|
|
public void crud() { |
|
System.out.println("完成 oracle 的增删改查"); |
|
} |
|
|
|
|
|
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程序编写步骤
-
注册驱动 -- 加载Driver类
-
获取连接 -- 得到Connection
-
执行增删改查 -- 发送SQL命令给mysql执行
-
释放资源 -- 关闭相关连接
例子--通过jdbc对表actor进行添加,删除和修改操作
- 首先在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; |
-
下载mysql连接驱动
-
在项目中创建libs文件夹,将驱动复制进文件夹中,右键点击驱动,选择ad as library
-
在弹出的窗口中点击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 |
|
|
|
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进行统一管理 |
|
|
|
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自动完成注册驱动,简化代码 |
|
// 这种方式获取连接是使用得最多的,推荐使用 |
|
|
|
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类时,完成了注册。因此,可以在程序中省略注册的步骤。
注意:
-
mysql驱动5.1.6之后连
Class.forName("com.mysql.jdbc.Driver");
也不需要写了 -
从jdk1.5以后使用了jdbc4,不再需要显式调用Class.forName()注册驱动,而是自动调用驱动jar包下的
META-INF\services\java.sql.Driver
文本中的类名称去注册 -
但是还是建议写上
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的基础上使用配置文件,连接数据库更加灵活 |
|
|
|
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); |
|
|
|
} |
2.3练习
参考上面代码,使用方式5完成
- 创建actor表
- 使用jdbc添加5条数据
- 修改id=1的记录,将content改成一个新的信息
- 删除id=3的记录