详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

1.1.1什么是JDBC

1.1.2什么是数据库驱动

驱动:两个设备(应用)之间通信的桥梁。

1.1.3为什么学习JDBC

没有JDBC的时候,如果现在要开发一套系统,使用Java连接MySQL数据库,那么这时候Java程序员需要了解MySQL驱动API,如果使用Java连接Oracle数据库,那么这个时候Java程序员需要了解Oracle数据库驱动API。
SUN公司提供一套统一的规范(接口)。然后各个数据库生产商提供这套接口的实现。这套接口规范就是JDBC的规范。

2.1JDBC的入门

2.1.1JDBC的环境准备

2.1.1.1创建数据库和表

create database web_test3;
use web_test3;
create table user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20),
	nickname varchar(20),
	age int
);
insert into user values (null,'aaa','123','小丽',34);
insert into user values (null,'bbb','123','大王',32);
insert into user values (null,'ccc','123','小明',28);
insert into user values (null,'ddd','123','大黄',21);

2.1.1.2创建项目,引入jar包

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

2.1.2JDBC的代码实现

1.1.2.1JDBC的开发步骤

第一步:加载驱动
第二步:获得连接
第三步:基本操作
第四步:释放资源

2.1.2.2JDBC的代码实现

import org.junit.Test;

/**
 * JDBC的入门程序
 * @author jt
 *
 */
public class JDBCDemo1 {

	@Test
	/**
	 * JDBC的入门
	 */
	public void demo1() throws Exception{
		// 1.加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2.获得连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web_test3", "root", "abc");
		// 3.基本操作:执行SQL
		// 3.1获得执行SQL语句的对象
		Statement statement = conn.createStatement();
		// 3.2编写SQL语句:
		String sql = "select * from user";
		// 3.3执行SQL:
		ResultSet rs = statement.executeQuery(sql);
		// 3.4遍历结果集:
		while(rs.next()){
			System.out.print(rs.getInt("id")+" ");
			System.out.print(rs.getString("username")+" ");
			System.out.print(rs.getString("password")+" ");
			System.out.print(rs.getString("nickname")+" ");
			System.out.print(rs.getInt("age"));
			System.out.println();
		}
		// 4.释放资源
		rs.close();
		statement.close();
		conn.close();
	}
}

3.1JDBC的API详解之DriverManager

3.1.1DriverManager:驱动管理类

3.1.1.1作用一:注册驱动

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)这个方法可以完成驱动的注册,但是实际开发中一般不会使用这个方法完成驱动的注册!!!
原因:
如果需要注册驱动,就会使用DriverManager.registerDriver(new Driver());,但是查看源代码发现,在代码中有一段静态代码块,静态代码块已经调用了注册驱动的方法。
详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

3.1.1.2作用二:获得连接

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)这个方法就是用来获得与数据库连接的方法:这个方法中有三个参数:

url				:与数据库连接的路径
user			:与数据库连接的用户名
password		:与数据库连接的密码
主要关注的是url的写法:
jdbc:mysql://localhost:3306/web_test3
jdbc			:连接数据库的协议
mysql			:是jdbc的子协议
localhost		:连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址。
3306			:MySQL数据库服务器的端口号
web_test3		:数据库名称

url如果连接的是本机的路径,可以简化为如下格式:
jdbc:mysql:///web_test3

4.1JDBC的API详解之Connection

4.1.1Connection:与数据库连接对象

4.1.1.1作用一:创建执行SQL语句的对象

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)
详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)
详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)
执行SQL语句对象:
Statement :执行SQL
CallableStatement :执行数据库中存储过程
PreparedStatement :执行SQL.对SQL进行预处理。解决SQL注入漏洞。

4.1.1.2作用二:管理事务

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

5.1.1Statement:执行SQL

5.1.1.1作用一:执行SQL

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

执行SQL的方法
boolean execute(String sql);
执行查询,修改,添加,删除的SQL语句。
ResultSet executeQuery(String sql);
执行查询(执行select语句)。
int executeUpate(String sql);
执行修改,添加,删除的SQL语句。

5.1.1.2作用二:执行批处理

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

6.1JDBC的API详解之ResultSet

6.1.1ResultSet:结果集。

通过select语句的查询结果。

6.1.1.1结果集的遍历

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)
结果集遍历原理

详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

  • 代码实现
    详解JDBC(DriverManager,Connection,Statement,ResultSet的作用)

7.1JDBC的资源释放

7.1.1JDBC资源释放

JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。
将资源释放的代码写入到finally的代码块中。
资源释放的代码应该写的标准:

if(rs !=null){
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				
				rs = null;
			}
			
			if(statement !=null){
				try {
					statement.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				
				statement = null;
			}
			
			
			if(conn !=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				
				conn = null;
			}

8.1JDBC的CRUD操作之保存操作

8.1.1保存操作代码实现

@Test
	/**
	 * 保存操作的代码实现
	 */
	public void demo1(){
		Connection conn = null;
		Statement stmt = null;
		try{
			// 注册驱动:
			Class.forName("com.mysql.jdbc.Driver");
			// 获得连接:
			conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
			// 执行操作:
			// 创建执行SQL语句对象:
			stmt = conn.createStatement();
			// 编写SQL语句:
			String sql = "insert into user values (null,'eee','123','阿黄',21)";
			// 执行SQL语句:
			int num = stmt.executeUpdate(sql);
			if(num > 0){
				System.out.println("保存用户成功!!!");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			// 资源释放:
			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;
			}
		}
	}

9.1JDBC的CURD操作之修改操作

9.1.1修改操作代码实现

	@Test
	/**
	 * 修改操作的代码实现
	 */
	public void demo2(){
		Connection conn = null;
		Statement stmt  = null;
		try{
			// 注册驱动:
			Class.forName("com.mysql.jdbc.Driver");
			// 获得连接
			conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
			// 执行操作:
			// 创建执行SQL语句的对象:
			stmt = conn.createStatement();
			// 编写SQL语句:
			String sql = "update user set password='abc',nickname='旺财' where id = 5";
			// 执行SQL语句:
			int num = stmt.executeUpdate(sql);
			if(num > 0){
				System.out.println("修改用户成功!!!");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			// 资源释放:
			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;
			}
		}
	}

10.1JDBC的CRUD操作之删除操作

10.1.1删除操作的代码实现

@Test
	/**
	 * 删除操作的代码实现
	 */
	public void demo3(){
		Connection conn = null;
		Statement stmt = null;
		try{
			// 注册驱动:
			Class.forName("com.mysql.jdbc.Driver");
			// 获得连接:
			conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
			// 创建执行SQL语句对象:
			stmt = conn.createStatement();
			// 编写SQL:
			String sql = "delete from user where id = 5";
			// 执行SQL:
			int num = stmt.executeUpdate(sql);
			if(num > 0){
				System.out.println("删除用户成功!!!");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			// 资源释放:
			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;
			}
		}
	}

11.1JDBC的CRUD操作之查询操作

11.1.1查询多条记录

@Test
	/**
	 * 查询多条记录
	 */
	public void demo4(){
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try{
			// 注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 获得连接
			conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
			// 执行操作
			// 创建执行SQL语句的对象:
			stmt = conn.createStatement();
			// 编写SQL:
			String sql = "select * from user";
			// 执行SQL:
			rs = stmt.executeQuery(sql);
			// 遍历结果集:
			while(rs.next()){
				System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			// 资源释放:
			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;
			}
		}
	}

11.1.2查询一条记录

@Test
	/**
	 * 查询一条记录
	 */
	public void demo5(){
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try{
			// 注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 获得连接
			conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
			// 执行SQL
			// 创建执行SQL语句对象:
			stmt = conn.createStatement();
			// 编写SQL:
			String sql = "select * from user where id = 4";
			rs = stmt.executeQuery(sql);
			// 判断就可以:
			if(rs.next()){
				System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			// 资源释放:
			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;
			}
		}
	}