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开发前的准备工作
先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。
classpath=.;D:\course\06-JDBC\resources\MySql Connector Java
5.1.23\mysql-connector-java-5.1.23-bin.jar以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。 IDEA有自己的配置方式。
4、JDBC编程六步(需要背会)
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句(DQL DML…)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
5、示例源码:
/**
* Copyright © 2020 zongyue All rights reserved.
*
* 功能描述:
* @Package: db
* @author: zongyue
* @date: 2020年4月16日 下午12:43:48
*/
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.PropertyResourceBundle;
/**
* Copyright: Copyright (c) 2020
*
* Date Author Version ClassName
*---------------------------------------------------------*
* 2020年4月16日 zongyue v1.0.0 DBmanager.java
*
* @Description:
*/
public class DBmanager {
private static String url; // 数据库连接字串
private static String userName; // 数据库用户名称
private static String driver; // 数据库驱动名称
private static String pwd; // 数据库用户登陆密码
private final static String fileName = "database"; // 属性文件名称
public static final int PAGESIZE = 5;
// ThreadLocal 当前线程局部变量
@SuppressWarnings("rawtypes")
private static ThreadLocal connection = new ThreadLocal();
public DBmanager(){}
//静态代码块在类加载时执行并且只执行一次
static {
// PropertyResourceBundle使用属性文件中的静态字符串集合来管理语言环境资源。
PropertyResourceBundle prb = (PropertyResourceBundle) PropertyResourceBundle.getBundle(fileName);
// 枚举Enumeration
Enumeration enu = prb.getKeys();
while (enu.hasMoreElements()) {
String propertyName = enu.nextElement().toString();
// 读取配置文件中的静态字符串并且赋值给类成员变量
if (propertyName.equals("database.driver"))
driver = prb.getString("database.driver");
if (propertyName.equals("database.url"))
url = prb.getString("database.url");
if (propertyName.equals("database.username"))
userName = prb.getString("database.username");
if (propertyName.equals("database.password"))
pwd = prb.getString("database.password");
}
System.out.println("readConfig");
}
// getConn方法用于获取数据库连接
/**
* synchronized 控制对类成员变量的访问:每个类实例对应一把锁, 每个 synchronized
* 方法都必须获得调用该方法的类实例的锁方能执行, 否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才
* 将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制 确保了同一时刻对于每一个类实例,其所有声明为 synchronized
* 的成员函数 中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁), 从而有效避免了类成员变量的访问冲突
*/
@SuppressWarnings("unchecked")
public synchronized static Connection getConn() throws SQLException {
//readConfig();
// Connection con = (Connection) connection.get();
// if (con != null && !con.isClosed()) {
// return con;
// }
try {
Class.forName(driver);
Connection con = DriverManager.getConnection(url, userName, pwd);
// setAutoCommit
// 将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式下,则将执行其所有 SQL 语句,并将这些语句作为单独的事务提交。
// 否则,其 SQL 语句将成组地进入通过调用 commit 方法或 rollback
// 方法终止的事务中。默认情况下,新的连接处于自动提交模式下。
connection.set(con);
System.out.println("数据库已连接");
return con;
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("无法连接数据库");
}
return null;
}
}
/**
* Copyright © 2020 zongyue All rights reserved.
*
* 功能描述:
* @Package: db
* @author: zongyue
* @date: 2020年4月16日 下午12:46:14
*/
package db;
import java.sql.Connection;
import java.sql.SQLException;
/**
* Copyright: Copyright (c) 2020
*
* Date Author Version ClassName
*---------------------------------------------------------*
* 2020年4月16日 zongyue v1.0.0 Main.java
*
* @Description:
*/
public class Main {
public static void main(String[] args) {
try {
Connection connection = DBmanager.getConn();
System.out.println("调用方法");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("wufalianjieshujuku");
}
}
}
完整下载:https://github.com/NydiaChung/JavaPractice/tree/master/JDBC