1、概念
- JDBC(Java Database Connectivity)是一种用于执行SQL语句的JavaAPI,可以为多种关系型数据库提供统一访问,他是由一组用Java语言编写的类和接口组成。
2、本质
- java官方提供的一套规范,用于帮助开发人员快速实现不同关系型数据的连接。
实际上就是SUN公司为了满足程序员便利,提供了很多供程序员使用来操作数据库的接口,而这些接口的具体实现则在每个数据库公司去单独实现。使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
如果没有JDBC,java程序调用数据库需要实现每个数据库的不同方法。
采用JDBC后:
3、入门程序流程
- 导入jar包
- 注册驱动 (告诉java程序,即将连接的是哪个品牌的数据库)
- 获取数据库连接 (表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级,使用完之后一定要关闭)
- 获取执行者对象 (专门执行sql语句的对象)
- 执行sql语句并返回结果
- 处理结果 (只有上一步执行的是select语句,才会处理数据)
- 释放资源 (java和数据库是进程间的通信)
4、连接
4.1 注册驱动
由 Driver接口实现:
-
java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
-
在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
-
Oracle的驱动:oracle.jdbc.driver.OracleDriver
-
mySql的驱动: com.mysql.jdbc.Driver
-
具体代码实现:
下面这段代码写在了 Driver类的静态代码块中了,只需要让类加载即可以执行静态代码块,因此可以通过反射机制进行类的加载,即上面代码。 不需要返回值,只需要他的类加载动作。
//通过创建数据库驱动来实现Driver
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//通过反射机制加载类实现静态代码段
//Class.forName("com.mysql.cj.jdbc.Driver");
4.2 URL
- url: 统一资源定位符(网络中某个资源的绝对路径)
- URL包括: 协议 IP PORT 资源名
- http:// 通信协议 182.61.200.7 IP地址 80 端口号 index.html 服务器上的某个资源名
5、代码实现
5.1 实现DML语句(增 删 改)
没有返回结果集,stat调用的是 executeUpdate
方法,返回的结果是对数据的进行DML操作的记录条数。count==1则表示对一条数据进行DML操作,返回3则是处理记录条数为3。
package com.java;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.注册驱动
//Class.forName("com.mysql.cj.jdbc.Driver");
//下面这段代码写在了 Driver类的静态代码块中了,只需要让类加载即可以执行静态代码块,因此可以通过反射机制
//进行类的加载,即上面代码。 不需要返回值,只需要他的类加载动作。
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//3.获取连接
/*
jdbc:mysql:// 协议
127.0.0.1 localhost都是本机ip地址
3306 mysql数据库端口号
atguigudb 数据库名
*/
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/mytest1","root","root");
//4.获取执行者对象 (数据库操作对象)
Statement stat = con.createStatement();
//5.执行sql语句
String sql = "insert into user(id,name,age) values (20,'aaa',20)";
// ResultSet rs=stat.executeQuery(sql);
//处理结果
int count = stat.executeUpdate(sql);
if(count==1){
System.out.println("保存成功");
}
stat.close();
con.close();
}
}
5.2 实现DQL语句 (查询语句)
执行的是 executeQuery
方法,返回的是处理集,然后对处理集进行遍历,则可以列出数据。
package com.java;
import java.sql.*;
public class Jdbcselect {
public static void main(String[] args) {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytest1","root","root");
stat = conn.createStatement();
String sql = "select * from user";
rs = stat.executeQuery(sql);
while (rs.next()){
//getString方法就是将获取到的数据全部转换为String类型
//当然还有其他类型 getInt getDouble ==》可以直接对结果进行数据操作
//通过列号获取不健壮
// String id = rs.getString(1);//根据列号开始获取数据,JDBC列号从1开始
// String name = rs.getString(2);
// String age = rs.getString(3);
//通过列名称获取数据,列名称是查询结果集的列名称
String id = rs.getString("id");//
String name = rs.getString("name");
String age = rs.getString("age");
System.out.println(id+" "+name+" "+age);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//释放资源
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat!=null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
5.3 优质方法—配置文集存放字符串
在对应的src下创建一个配置文件jdbc.properties其中的内容如下:
className=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest1
user=root
password=root
使用配置文件的好处:
- 实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码 ,解耦。
- 如果修改了配置信息,省去重新编译的过程。
- 编写的java程序在部署到服务器上时,需要打包。如果java代码修改过,就需要重新打包。使用配置文件的方式,如果配置信息修改,并没有导致代码的修改。所以不需要重写打包。
Properties properties = new Properties();
//加载资源的路径:默认为src下
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
properties.load(is);
String className = properties.getProperty("className");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
//加载驱动
Class.forName(className);
//获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}