1.JDBC是什么?
Java DataBase Connectivity(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接口呢?
因为每一个数据库的底层实现原理都不一样:
Oracle数据库有自己的原理。
MySQL数据库也有自己的原理。
MS SqlServer数据库也有自己的原理。
…
每一个数据库产品都有自己独特的实现原理。
JDBC的本质到底是什么? 一套接口。
3.编写程序模拟JDBC本质
4.JDBC开发前的准备工作
先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中
classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.48\mysql-connector-java-5.1.48-bin.jar
以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
IDEA有自己的配置方式,具体可以百度寻找。
5.JDBC编程六步(需要背会)
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句(DQL DML…)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
url:统一资源定位符(网络中某个资源的绝对路径)
https://www.baidu.com/ 这就是URL
URL包括哪几部分?
协议,IP,Port,资源名
http://182.61.200.7:80/index.html
http:// 通信协议
182.61.200 服务器IP地址
80:服务器上软件的端口
index.html 是服务器上某个资源名
jdbc:mysql://localhost:3306/ourleetcode
jdbc:mysql:// 协议
localhost即127.0.0.1 IP地址
3306 mysql数据库端口号
ourleetcode具体的数据库实例名
什么是通信协议?有什么用?
通信协议是通信之前就提前定好的数据传送格式。数据包具体怎么传数据,格式是提前定好的。
7.第一个程序
package test;
import java.sql.*;
//jdbc编程六步
public class jdbcTest01 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
try {
//1.注册驱动
Driver driver = new com.mysql.cj.jdbc.Driver(); //注意mysql8.0以上版本要这么写,8.0以下版本写com.mysql.jdbc.Driver()
DriverManager.registerDriver(driver);
//2.获取连接
String url = "jdbc:mysql://192.168.1.20:3306/ourleetcode?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT"; //8.0以下版本不写ourleetcode后面的东西。ourleetcode是我自己数据库的名字
String user = "mc_class";
String password = "123456";
con = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接对象 = " + con);
//3.获取数据库操作对象(Statement专门执行sql语句的)
stmt = con.createStatement();
//4.执行sql
String sql = "insert into test(神魔恋) values('你好')";
//专门执行DML语句的(insert, delete, update)
//返回值是影响数据库中的记录条数
int count = stmt.executeUpdate(sql);
System.out.println(count == 1 ? "保存成功" : "保存失败");
//5.处理查询结果集
}
catch(SQLException e) {
e.printStackTrace();
}
finally {
//6.释放资源
//为了保证资源一定释放,在finally语句块中关闭资源
//并且要遵循从小到大依次关闭(先关闭stmt,然后关闭con)
//分别对其try...catch
try {
if(stmt != null)
stmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
try {
if(con != null)
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在navicat中查看发现已经插入成功了。
一定要熟记jdbc流程,要做到能够快速默写。
8.第二个程序
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class jdbcTest02 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
try {
//1.注册驱动
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
//2.获取连接
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ourleetcode?" +
"useUnicode=true&characterEncoding=utf8&serverTimezone=GMT", "root", "123456");
//3.获取数据库操作对象
stmt = con.createStatement();
//4.执行sql语句
//注意jdbc中的sql语句不需要提供分号结尾
String sql = "delete from test where 神魔恋='你好'";
int count = stmt.executeUpdate(sql);
System.out.println(count == 1 ? "删除成功" : "删除失败");
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
if(stmt != null)
stmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
try {
if(con != null)
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在navicat中查看发现已经删除成功了。
9.注册驱动的常用方法
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); 是注册驱动的第一种写法
下面说下第二种写法,也是常用写法:
Class.forName(“com.mysql.cj.jdbc.Driver”);
为什么这种方式常用?因为参数是一个字符串,字符串可以写到xxx.properties文件中,这种方法不需要接收返回值,因为我们只想用它的类加载动作。
10.从属性资源文件中读取连接数据库信息
将连接数据库的所有信息配置到配置文件中,实际开发中不建议将连接数据库的信息写死到java程序中。因为你给客户开发一个程序,人家客户是不可能把数据库的密码之类的隐私数据告诉你的,但是你可以调用他的配置文件,这样既看不到隐私信息,又完成了任务。
首先我们在IDEA的src目录下新建一个JDBC.properties
在里面输入:
driver=com.mysql.cj.jdbc.Driver
url=
user=
password=
具体的写法和上面我给的代码演示是一样的,写入你自己的配置就行。
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.ResourceBundle;
public class jdbcTest03 {
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 con = null;
Statement stmt = null;
try {
//1.注册驱动
Class.forName(driver);
//2.获得连接
con = DriverManager.getConnection(url, user, password);
//3.获取数据库操作对象
stmt = con.createStatement();
//4.执行sql语句
String sql = "update test set 李在赣神魔='你好呀' where 李在赣神魔='喝车别开酒'";
int count = stmt.executeUpdate(sql);
System.out.println(count == 1 ? "修改成功" : "修改失败");
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if(stmt != null)
stmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
try {
if(con != null)
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在navicat中查看发现已经修改成功了。