开始时间:2021-03-25
JDBC(Java Database Connectivity)
Java语言连接数据库
本质是一套接口
面向接口调用、面向接口写实现类,这都属于面向接口编程。
实现接口编程是为了解耦合,可参考复习
多态就是很典型的面向抽象编程
程序员面向JDBC写代码,JDBC提供接口,多方数据库厂家编写JDBC接口(数据库驱动,一个jar包)。
jar包中有很多class文件,class就是对JDBC实现的接口
例如:
编写一个程序员类
public class JavaProgrammer {
public static void main(String[] args) throws Exception {
JDBC jdbc = new MySQL();
jdbc.getConnection();
//通过反射机制创建对象
Class c = Class.forName("MySQL");
JDBC jdbc1 = (JDBC) c.newInstance();
jdbc1.getConnection();
}
}
编写一个接口类
public interface JDBC {
/*
连接数据库的方法
*/
void getConnection();
}
编写一个类实现接口
public class MySQL implements JDBC {
public void getConnection() {
System.out.println("连接MySQL数据库成功");
}
}
运行一下
连接MySQL数据库成功
连接MySQL数据库成功
当然,也可以通过配置文件来实现,可参考反射的资源绑定器部分
import java.util.ResourceBundle;
public class JavaProgrammer {
public static void main(String[] args) throws Exception {
//通过反射机制创建对象
ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc");
String className = resourceBundle.getString("className");
Class c = Class.forName(className);
JDBC jdbc1 = (JDBC) c.newInstance();
jdbc1.getConnection();
}
}
JAVAEE规范与JAVASE规范区别
- JAVA.SE:指Java类在单独执行,在单独处理业务时需要遵守语法规则。
比如继承,访问权限,接口实现,控制语句,标识符命名。 - JAVAEE: Java在进行商业开发时遵守开发规则
在商业开发过程中,往往需要Java类与不同服务器进行沟通来解决当前业务I由于在商业开发过程中,Java需要与13种不同服务器进行沟通,因此sUN公司根据13种服务器特征指定13套接口,这13套接口统称为JAVAEE规范。接口中实现类由不同服务器厂商来提供。服务器厂商将完成接口实现类以JAR包形式提供。Java程序员通过jar包得到接口中实现类,从而实现与指定服务器之间交流。
配置Jar包
Jar包下载
选第一个download
no thanks直接下载
下载好后解压
然后去 计算机-属性-高级系统设置-高级-环境变量-新建 “classpath”
.;F:\编程学习\Java学习\mysql-connector-java-8.0.23\mysql-connector-java-8.0.23\mysql-connector-java-8.0.23.jar
注意 点号后接分号,再放路径名
将自己写的project打包成jar包
新建一个名叫provider的module
创建mydept类
再创建一个空的receiver的module
选择file-projectstructure-artifacts
新建一个empty的包
重命名后,将需要做成jar包的module拖进去
选择build -build artifacts
build后
找到jar位置,复制,粘贴到receiver里面
右键TestJar add library
绑定成功,可以使用了
JDBC编程六步
- 第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
- 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭
- 第三步:获取数据库操作对象(专门执行sql语句的对象)
- 第四步:执行SQL语句(DQLDML. …)
- 第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
- 第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
Driver是一个接口,没办法直接new
只能先new他的类,也叫Driver
接口Driver是 java.sql.Driver
类Driver是 com.mysql.jdbc.Driver
Driver.Class在mysql-connector-java-8.0.23下
1.注册驱动
测试一下
package JDBCTEST;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCTest01 {
public static void main(String[] args) {
try {
// java.sql.Driver driver
//1.注册驱动
//多态,父类型引用子类型对象
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
System.out.println("ok");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
在DOS命令窗口里面测试,在Idea里面不行
C:\Users\Administrator>java F:\编程学习\Java学习\JDBC\Test.java
ok
2.获取连接
package JDBCTEST;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCTest01 {
public static void main(String[] args) {
try {
// java.sql.Driver driver
//1.注册驱动
//多态,父类型引用子类型对象
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
System.out.println("ok");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/mysql";
String user = "root";
String password = "333";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("DataBase connection Object:" + connection);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
URL统一资源定位符
通信协议+IP地址+端口+服务器资源名
3.获取数据库操作对象(Statement)
statement = connection.createStatement();
C:\Users\Administrator>java F:\编程学习\Java学习\JDBC\Test02.java
ok
DataBase connection Object:com.mysql.cj.jdbc.ConnectionImpl@485966cc
Saving succeeds
4.执行sql
//4.执行sql
String sql = "insert into dept(deptno,dname,loc)values(60,'Office','Chengdu')";
//执行DML语句,这里记录了影响的数据库条数
int count = statement.executeUpdate(sql);
System.out.println(count == 1 ? "Saving succeeds" : "Saving fails");
6.释放资源
//6.释放资源
//写在finally中保证一定执行
//释放顺序从小到大
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
总的来一遍
package JDBCTEST;
import java.sql.*;
public class JDBCTest02 {
public static void main(String[] args) {
//再外部声明,方便后面关闭
Statement statement = null;
Connection connection = null;
try {
// java.sql.Driver driver
//1.注册驱动
//多态,父类型引用子类型对象
Driver driver = new com.mysql.cj.jdbc.Driver();
//调用方法完成注册
DriverManager.registerDriver(driver);
System.out.println("ok");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/mysql";
String user = "root";
String password = "333";
//建立connection
connection = DriverManager.getConnection(url, user, password);
System.out.println("DataBase connection Object:" + connection);
//3.获取数据库操作对象(Statement)
statement = connection.createStatement();
//4.执行sql
String sql = "insert into dept(deptno,dname,loc)values(60,'Office','Chengdu')";
//执行DML语句,这里记录了影响的数据库条数
int count = statement.executeUpdate(sql);
System.out.println(count == 1 ? "Saving succeeds" : "Saving fails");
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.释放资源
//写在finally中保证一定执行
//释放顺序从小到大
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
再来一份删除的
package JDBCTEST;
import java.sql.*;
public class JDBCTEST03 {
public static void main(String[] args) {
Driver driver = null;
Connection connection = null;
Statement statement = null;
try {
driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
System.out.println("register is ok");
String url = "jdbc:mysql://localhost:3306/mysql";
String user = "root";
String password = "333";
connection = DriverManager.getConnection(url, user, password);
System.out.println("database connection object is " + connection);
statement = connection.createStatement();
String sql = "delete from dept where loc='Chengdu'";
int count = statement.executeUpdate(sql);
System.out.println(count == 1 ? "delete succeeds" : "delete fails");
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-
java.sql.DriverManager类:这个类存在于JDK_1.8下。
负责将数据库厂商提供Driver接口实现进行注册
负责在Java工程与Mysql服务器之间建立一个【连接通道】 -
java.sql.connection接口:负责管理Java工程与数据库服务器之间【连接通道】
-
java.sql.Preparedstatement接口:负责管理在【连接通道】上进行往返交通的
【交通工具】 -
java.sql.Resultset接口:负责管理数据库服务器返回【临时表】