1 JDBC是什么?
Java DataBase Connertivity(Java语言连接数据库)
2 JDBC的本质是什么?
JDBC是SUN公司制定的一套接口(Interface)
java.sql.*;(这个软件包下有很多接口)
接口都有调用者和实现者。
面相接口调用、面相接口写实现类,这都属于面相接口编程。
为什么要面相接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力。
多态机制就是非常典型的:面相抽象编程。(不想面向具体编程)
建议:
Animal a = new Cat();
Animal a = new Dog();
//喂养的方法
public void feed(Animal a){ // 面相父类编程
}
不建议:
Dog d = new Dog();
Cat c = new Cat();
思考:为什么SUN指定一套JDBC接口呢?
因为每一个数据库的底层实现原理都不一样。
Orcale数据库有自己的原理。
MySQL数据库也有自己的原理。
MS SqlServer数据库也有自己的原理。
...
每一个数据库产品都有自己独特的实现原理。
3 JDBC开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。
classpath=.;C:UsersxlWuDesktop学习JDBC 2-JDBC相关学习资源MySql Connector Java 5.1.23mysql-connector-java-5.1.23-bin.jar
以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
IDEA有自己的配置方式。
4 JDBC变成六步(需要背会)
第一步:注册驱动(告诉java程序,即将要连接的哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,使用完之后一定要关闭)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行sql语句(DQL、DML...)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集)
第六步:释放资源(使用完资源之后一定要关闭资源,java数据库属于进程间通信,开启之后一定要关闭)
JDBC本质内存图

案例1:JDBC的六步操作之插入:
package com.java.JDBC; import java.sql.*; public class JDBCTest01 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // 1 注册驱动 Driver driver = new com.mysql.jdbc.Driver(); // 多态,父类型引用执行子类型对象。 // Driver driver = new oracle.jdbc.driver.OracleDriver(); // oracle驱动 DriverManager.registerDriver(driver); // 2 获取连接 /* url:统一资源定位符(网络中某个资源的绝对路径) https://www.baidu.com/ 这就是URL URL包括哪几部分? 协议 IP PORT 资源名 http://14.215.177.39/index.html http:// 通信协议 14.215.177.39 服务器IP地址 80 服务器上软件的端口 index.html 是服务上某个资源名 jdbc:mysql://127.0.0.1:3306/mydatabase jdbc:mysql:// 协议 127.0.0.1 IP地址 3306 mysql的数据库端口号 mydatabase 具体的数据库实例名 说明:localhost和127.0.0.1都是本机IP地址。 什么是通信协议,有什么用? 通信协议是通信之前提前定好的数据传送格式。 数据包具体怎么传数据,格式提前定好的。 oracle的URL: jdbc:oracle:thin:@localhost:1521:orcl */ String url = "jdbc:mysql://127.0.0.1:3306/mydatabase"; String user = "root"; String password = "333"; conn = DriverManager.getConnection(url,user,password); // 数据库连接对象 = com.mysql.jdbc.JDBC4Connection@7bb11784 System.out.println("数据库连接对象 = " + conn); // 3 获取数据库操作对象(Statement专门执行sql语句的) stmt = conn.createStatement(); // 4 执行sql语句 String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')"; // 专门执行DML语句的(insert update delete) // 返回值是“影响数据库中的记录条数” int count = stmt.executeUpdate(sql); System.out.println(count == 1 ? "保存成功" : "保存失败"); // 5 处理返回结果集 } catch (SQLException e) { e.printStackTrace(); } finally { // 6 释放资源 // 为了保证资源一定释放,在finally语句块中关闭资源 // 并且要遵循从小到大依次关闭 // 分别对其 try..catch if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
案例2:JDBC的六步操作之删除和更新(为了巩固):
package com.java.JDBC; import java.sql.*; public class JDBCTest02 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // 1 注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // 2 获取连接 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydatabase","root","333"); // 3 获取数据库操作对象 stmt = conn.createStatement(); // 4 执行sql语句 // int count = stmt.executeUpdate("delete from dept where deptno = 50"); int count = stmt.executeUpdate("update dept set deptno = 88 where deptno = 10 "); System.out.println(count == 1 ? "删除成功" : "删除失败"); // 5 获取sql结果集 } catch (SQLException e) { e.printStackTrace(); } finally { // 6 释放资源 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
案例3:JDBC的六步操作之升级写法介绍(比较常用):
package com.java.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JDBCTest03 { public static void main(String[] args) { try { // 1 注册驱动 // 这是比较常用的写法 // 为什么这种方式常用?因为参数是一个字符串,字符串你可以写到xxx.properties文件中。 // 以下方法不需要接收返回值,因为我们只想用他的类加载动作。 Class.forName("com.mysql.jdbc.Driver"); // 2 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","333"); // com.mysql.jdbc.JDBC4Connection@3ab39c39 System.out.println(conn); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
案例4:JDBC的六步操作升级写法案例:
jdbc.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/mydatabase user=root password=333
代码:
package com.java.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.ResourceBundle; /* 实际开发中不建议把连接数据库的信息写死到java程序中。 写到配置文件中,方便以后的更改,并且不用重启程序。 */ public class JDBCTest04 { public static void main(String[] args) { // 使用资源绑定器绑定属性配置文件 ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); String driver = bundle.getString("driver"); String url = bundle.getString("url"); String user = bundle.getString("user"); String password = bundle.getString("password"); Connection conn = null; Statement stmt = null; try { // 1 注册驱动 Class.forName(driver); // 2 获取连接 conn = DriverManager.getConnection(url,user,password); // 3 获取数据库操作对象 stmt = conn.createStatement(); // 4 执行sql语句 // int count = stmt.executeUpdate("delete from dept where deptno = 50"); int count = stmt.executeUpdate("update dept set deptno = 88 where deptno = 10 "); System.out.println(count == 1 ? "更新成功" : "更新失败"); // 5 获取sql结果集 } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { // 6 释放资源 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }