1、什么是数据连接池
数据库连接池(Database Connection Pooling)在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏。
什么是JDBC
JDBC的全称是java数据库连接(Java Database Connectivity),它是执行SQL语句的java API。可用SQL语句完成对数据库中的数据进行查询、更新、新增、删除的操作。
JDBC常见的API
1、Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,
该接口专门提供给数据库厂商使用。执行SQL语句,并且得到返回结果。
在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类
(java.sql.DriverManager)去调用这些Driver实现。
2、Driver Manager类
Driver Manager类用于加载JDBC驱动并且创建与数据库的连接,在Driver Manager类中定义了两个比较重要的静态方法
3、Connection接口
Connection接口代表java程序和数据库的连接,只有获得该连接对象后才能访问数据库,并操作数据表。
4、Statement接口
Statement接口用于执行静态SQL语句,并返回一个结果对象,改接口的对象通过Connection实例的create Statement()方法获得。
5、PrearedStatement接口
Statement接口封装了JDBC执行Sql语句的方法,可以完成java程序执行SQL语句的操作。
String sql=“INSERT INTO user(id,name,email) VALUES(?,?,?)”;
PrearedStatement preStmt=conn.PrearedStatement(sql);
preStmt.setInt(1,1);
preStmt.setString(2,"zhangsan");
preStmt.setObject(3,"zs@sina.com");
preStmt.executeUpdata();
6、ResultSet接口
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。
实现一个JDBC程序
(1)加载并注册数据库驱动
(2)通过DriverManager获取数据库连接
(3)通过Connection对象获取Statement的方法
- createStatement():创建基本的Statement对象
- prepareStatement():创建PreparedStatement对象
- prepareCall():创建CallableStatement对象
(4)使用Statement执行SQL语句
- execute():可以执行任何SQL语句
- executeQuery():通常执行查询语句,执行后返回代表结果集的ResultSet对象
- executeUpdata():用于执行DML和DDL语句。
(5)操作Result结果集
(6)关闭连接,释放资源
1、搭建数据库
2、创建项目环境,导入数据库驱动
3、编写JDBC程序
该类用于读取数据库中的users表,并将结果输出到控制台
public class Example01 {
public static void main(String[] args) throws SQLException {
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
// 1. 注册数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.通过DriverManager获取数据库连接
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "itcast";
conn = DriverManager.getConnection (url, username,
password);
// 3.通过Connection对象获取Statement对象
stmt = conn.createStatement();
// 4.使用Statement执行SQL语句。
String sql = "select * from users";
rs = stmt.executeQuery(sql);
// 5. 操作ResultSet结果集
System.out.println("id | name | password | email | birthday");
while (rs.next()) {
int id = rs.getInt("id"); // 通过列名获取指定字段的值
String name = rs.getString("name");
String psw = rs.getString("password");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " | " + name + " | " + psw + " | " + email
+ " | " + birthday);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally{
// 6.回收数据库资源
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
}
2、PreparedStatement对象
Statement对象每次执行sql时都会对其进行编译。当相同的sql语句执行多次时,Statement对象就会使数据库频繁编译相同的SQL语句,从而降低数据库的访问效率。
为了解决这个问题,Statement提供了一个子类PreparedStatement。
创建一个类,在该类中使用PreparedStatement对象对数据进行插入数据的操作。
public class Example02 {
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement preStmt = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "itcast";
// 创建应用程序与数据库连接的Connection对象
conn = DriverManager.getConnection(url, username, password);
// 执行的SQL语句
String sql = "INSERT INTO users(name,password,email,birthday)"
+ "VALUES(?,?,?,?)";
// 创建执行SQL语句的PreparedStatement 对象
preStmt = conn.prepareStatement(sql);
preStmt.setString(1, "zl");
preStmt.setString(2, "123456");
preStmt.setString(3, "zl@sina.com");
preStmt.setString(4, "1789-12-23");
preStmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally { // 释放资源
if (preStmt != null) {
try {
preStmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
preStmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
}
ResultSet对象
ResultSet主要用于存储结果集,可以通过next()方法由前向后逐个获取结果集中的数据。
ResultSet一般由数据库操作Statement的executeQuery()方法返回,遍历ResultSet一般使用While循环.利用ResultSet的next()方法。
常用方法:
创建一个Example03.java类,该类用中使用ResultSet对象取出指定数据的信息。
public class Example02 {
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement preStmt = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "itcast";
// 创建应用程序与数据库连接的Connection对象
conn = DriverManager.getConnection(url, username, password);
// 执行的SQL语句
String sql = "INSERT INTO users(name,password,email,birthday)"
+ "VALUES(?,?,?,?)";
// 创建执行SQL语句的PreparedStatement 对象
preStmt = conn.prepareStatement(sql);
preStmt.setString(1, "zl");
preStmt.setString(2, "123456");
preStmt.setString(3, "zl@sina.com");
preStmt.setString(4, "1789-12-23");
preStmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally { // 释放资源
if (preStmt != null) {
try {
preStmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
preStmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
}