JDBC基本概念
1、JDBC:Java DataBase Connectivity(Java语言连接数据库)
2、JDBC本质是什么?
JDBC是SUN公司制定的一套接口(interface)
接口都有调用者和实现者。
面向接口调用、面向接口写实现类。这都属于面向接口编程
为什么要面向接口编程?
降低耦合:降低程序的耦合度,提高程序的扩展力。
多态机制就是非常典型的:面向抽象编程
编写JDBC六个步骤
第一步:注册驱动(作用:告诉Java程序,要连接的是哪个数据库(mysql、oracle…))
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭)
第三步:获取数据库操作对象(执行sql语句的对象)
第四步:执行SQL语句(DQL,DML…)
第五步:处理查询结果集(只有第四步为查询(select)语句时,才需要执行第五步)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间1同行,开启之后一定要关闭)
JDBC中的sql语句不需要提供封号结尾
URL
url:统一资源定位符(网络中某个资源的绝对路径)
https://www.baidu.com/ 这就是URL
URL包括哪几部分?
协议、IP、PORT、资源名
https://182.61.200.7:80/index.html
通信协议:https://
IP:182.61.200.7
服务器端口号:80
资源名:index.html
jdbc:mysql://localhost:3306/test1
协议:jdbc:mysql://
IP:localhost
服务器端口号:3306
资源名:test1
什么是同行协议,有什么用?
通信协议是通信之前就提前订好的数据传送格式。
数据包具体怎么传数据,格式提前定好的。
第一种注册驱动的方式
//1、注册驱动
Driver driver = new com.mysql.jdbc.Driver(); //多态,父类引用指向子类对象
DriverManager.registerDriver(driver); //注册给定的驱动
package com.csx.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.*;
/**
* @program: TestJDBC
* @description
* @author: Csx
* @create: 2020-05-04 17:14
**/
public class TestJDBC01 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1、注册驱动
Driver driver = new com.mysql.jdbc.Driver(); //多态,父类引用指向子类对象
DriverManager.registerDriver(driver); //注册给定的驱动
//2、获取连接
String url = "jdbc:mysql://localhost:3306/test1";
String username = "root";
String password = "root";
con = DriverManager.getConnection(url,username,password);
//3、获取数据库操作对象(Statement专门执行sql语句的)
stmt = con.createStatement();
//4、执行SQL语句
//查询用executeQuery,需要第五步
rs = stmt.executeQuery("select * from dept");
//增删改用executeUpdate,不需要第五步,返回值是影响数据库中的的记录条数
//int i = stmt.executeUpdate("insert into dept(DEPTNO,DNAME,LOC) values(50,'开发部','杭州')");
//System.out.println(i==1?"处理成功":"处理失败");
//5、处理查询结果集
while(rs.next()){
String deptNo = rs.getString("DEPTNO");
String deptName = rs.getString("DNAME");
String loc = rs.getString("LOC");
System.out.println("部门编号:"+deptNo+",部门名:"+deptName+",地址:"+loc);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6、释放资源
//为了保证资源一定释放,在finally语句中关闭资源
//并且要遵循从小到大依次关闭
//因此要分别对其try...catch
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
第二种注册驱动的方式(常用)
利用反射来加载Driver类,利用类中的静态代码块实现对驱动的注册
直接反射这个.class文件,这个类就会被加载进JVM,静态代码块在类加载时就会被执行,所以驱动被注册
为什么这种方式常用?
因为参数是一个字符串,字符串可以写到xxx.properties配置文件中。
以下方法不需要接收返回值,因为我们只要用它的类加载动作
可以看到mysql驱动的源码Driver中也是调用的第一种方式,因此用反射机制加载该类,就可以让该类在编译阶段就执行
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
package com.csx.jdbc;
import java.sql.*;
/**
* @program: TestJDBC
* @description
* @author: Csx
* @create: 2020-05-03 23:08
**/
public class TestJDBC02 {
public static void main(String[] args) {
Connection con = null;
Statement st = null;
ResultSet rs = null;
try {
//1、注册驱动
//为什么这种方式常用?因为参数是一个字符串,字符串可以写到xxx.properties配置文件中。
//以下方法不需要接收返回值,因为我们只要用它的类加载动作
Class.forName("com.mysql.jdbc.Driver");
//2、 获取连接对象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1","root","root");
//3、获取数据库操作对象
st = con.createStatement();
//4、执行sql语句
rs = st.executeQuery("select * from dept");
//5、处理查询结果集
while (rs.next()) {
String deptNo = rs.getString("DEPTNO");
String dName = rs.getString("DNAME");
String loc = rs.getString("LOC");
System.out.println("部门编号:" + deptNo + "部门名:" + dName + "地址:" + loc);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
//6、释放资源
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
//6、释放资源
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
//6、释放资源
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ResultSet获取查询结果集
1、光标(next())指向的行有数据,有数据返回true,没有数据返回false。
2、getString()方法的特点是:不管数据库中的数据类型是什么,都以String的形式取出。
3、JDBC中所有的下标从1开始。不是从0开始,1,2,3指的是数据库表中的第几列
4、如果起了别名,获取的名字要写别名
5、除了可以以String类型取出之外,还可以以特定的类型取出。
while(rs.next()){
String deptNo = rs.getString(1);
String deptName = rs.getString(2);
String loc = rs.getString(3);
System.out.println("部门编号:"+deptNo+",部门名:"+deptName+",地址:"+loc);
}
运行结果
以特定的类型取出
读取配置文件中的数据
配置文件
driver=com.mysql.jdbc.Driver
url =jdbc:mysql://localhost:3306/test1
username =root
password =root
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String username = bundle.getString("username");
String password = bundle.getString("password");
//1、注册驱动
Class.forName(driver);