JDBC(Java DataBase Connectivity):java语言连接数据库。
JDBC是SUN公司定义的一套接口(interface)。
接口都有调用者和实现者。
面向接口调用、面向接口写实现类,这都属于面向接口(抽象)编程。
面向接口编程降低程序的耦合度,提高程序的扩展能力。
多态机制是非常典型的面向抽象编程。(不要面向具体编程)
Animal a = new Cat();
Animal a = new Dog();
Public void feed (Animal a){}
思考:为什么SUN公司要指定一套JDBC接口呢?
因为每一个数据库的底层实现原理不一样。
Oracle数据库有自己的原理。
MySQL数据库也有自己的原理、
MS SqlServer数据库也有自己的原理。
…
每一个数据库都有自己独特的实现原理。
1. 注册驱动(告诉java程序,即将要连接的是哪个品牌的数据库)
方式一(不常用):
Driver driver = new com.mysql.cj.jdbc.Driver();//,多态,父类型引用指向子类型对象。
DriverManager.registerDriver(driver);
//不需要接收返回值,因为我们只想用它的类加载动作
Class.forName("com.mysql.jdbc.Driver");
Driver类的源代码中有一个静态代码块。
Class.forName会导致类加载异常:ClassNotFoundException e
2. 获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程间的通信,重量级的,使用完之后一定要关闭)
String url = "jdbc:mysql://localhost:3306/1147?serverTimezone=UTC&user=true&characterEncoding=UTF-8";
String user = "root";
String password ="root";
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println("数据库连接对象"+conn);
3. 获取数据库操作对象(专门执行sql语句的对象)
java.sql
Interface Statement:用于执行静态SQL语句并返回其生成的结果的对象。
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM band";
rs = stmt.executeQuery(sql);
5.处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步的查询结果集)
String sql = "insert into band(name,remark) values('软件工程5班','666')";
int result = stmt.executeUpdate(sql);
if (result == 1){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
String sql = "SELECT * FROM band";
rs = stmt.executeQuery(sql);
//5.处理查询结果集,循环查出每一行
while (rs.next()){//光标指向的行有数据
int id = rs.getInt("id");
String name = rs.getString("name");
String remark = rs.getString("remark");
System.out.println(id+","+name+","+remark);
}
java.sql
Interface ResultSet
:next() :将光标从当前位置向前移动一行。
:将光标从当前位置向前移动一行。 ResultSet光标最初位于第一行之前; 第一次调用方法next使第一行成为当前行; 第二个调用使第二行成为当前行,依此类推。
:true如果新的当前行(光标指向的当前行)有效(有数据); false如果当前行(光标指向的当前行)无效(没有有数据)
getString(String columnLabel) :以列名的形式获取数据(健壮),要以查询结果的列名为准(假设有as别名,要用别名)
getString(int columnIndex) :以第几列(1,2,3)的形式获取数据 ,具体要以查询语句中列名的顺序(不健壮)
getInt(String columnLabel):以数据库底层的数据为准,去出来,可以直接拿来运算
getDouble(String columnLabel):以数据库底层的数据为准,去出来,可以直接拿来运算
6.释放资源(使用完资源之后一定要关闭资源。java和数据库属于进程间通信,开启之后一定要关闭)
//为了保证资源一定释放,在finallly语句块中关闭资源。
//并且要遵循从小到大依次关闭(正序创建,逆序关闭)
//分别对其try–catch
rs.close;关闭数据库查询结果集
stmt.close();关闭数据库操作对象
conn.close();关闭数据库连接对象
finally {
//6.释放资源(使用完资源之后一定要关闭资源。java和数据库属于进程间通信,开启之后一定要关闭)
//为了保证资源一定释放,在finallly语句块中关闭资源。
//并且要遵循从小到大依次关闭
//分别对其try--catch
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
代码
public class JDBCProperties {
//1.注册驱动
//2.获取连接
//3.获取数据库操作对象
//4.执行sql语句
//5.处理sql结果集
//6.释放资源
public static void main(String[] args) {
//使用资源绑定器绑定属性配置文件
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String username = bundle.getString("username");
String pwd = bundle.getString("pwd");
String url = bundle.getString("url");
Connection conn = null;
Statement stmt = null;
try{
//1.注册驱动
// Driver driver = new com.mysql.cj.jdbc.Driver();
// DriverManager.registerDriver(driver);
Class.forName(driver);
//2.获取连接
conn = DriverManager.getConnection(url,username,pwd);
//3.获取数据库操作对象
stmt = conn.createStatement();
//4.执行sql语句
String sql = "insert into band(name,remark) values('软件工程5班','666')";
int result = stmt.executeUpdate(sql);
if (result == 1){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
//SQL异常和类加载异常
}catch (SQLException|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();
}
}
}
}
}
package cn.edu.mju.JDBC;
import java.sql.*;
import java.util.ResourceBundle;
/**
* @author 友人A
* @描述 功能说明:
* @date 2020/5/8
*/
public class JDBCSelect {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
ResourceBundle bundle= ResourceBundle.getBundle("jdbc");
String url = bundle.getString("url");
String username = bundle.getString("username");
String pwd = bundle.getString("pwd");
try{
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
conn = DriverManager.getConnection(url,username,pwd);
//3.获取数据库操作对象
stmt = conn.createStatement();
//4.执行sql语句
String sql = "SELECT * FROM band";
rs = stmt.executeQuery(sql);
//5.处理查询结果集,循环查出每一行
while (rs.next()){//光标指向的行有数据
int id = rs.getInt("id");
String name = rs.getString("name");
String remark = rs.getString("remark");
System.out.println(id+","+name+","+remark);
}
//5.处理查询结果集
}catch (Exception e){
e.printStackTrace();
}finally {
//6.释放资源
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}