
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包 含一些通用的接口类。
JDBC访问数据库层次结构:

JDBC优势:
下载 这里提供一个最为简单的下载方法:去maven中央仓库下载

看自己的数据库的版本情况来下载(点击Central下载即可)对应的版本(经典版最高是8.0,更高的版本在最新版中) 注:MySQL的版本必须和connector的版本一致
导包

(描述当前数据从哪来即数据库服务器所在的位置) 通过原码我们可以看到DataSourse是被interface修饰的类,不能用来直接实例化该对象,因此我们只能实例化它的子类MysqlDataSource

DataSource dataSource = new MysqlDataSource();DataSourse:Java标准库JDBC自带的接口 MysqlDataSource:刚刚导入的 .jar包
1)数据库服务器在哪里 2)访问服务器的账户是啥 3)访问服务器的密码是啥
//第一种写法
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("jqka");
//第二种写法
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java112?characterEncoding=utf8&useSSL=false");
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("jqka");第一种写法的好处:耦合程度更低 按照第一种写法,后续代码中如果再使用DataSource这个东西,是看不到"MysqlDataSource"这个信息的. 就使得后续的其他部分代码和“mysql"这个概念解耦合了.后面的代码,和啥数据库没关系.如果要更换数据库,此时代码修改的成本就比较低
说明:
Url
jdbc:mysql: 描述了url的用途是用来给jdbc的mysql使用的
127.0.0.1: IP地址.描述了mysql服务器所在的主机的位置.
3306:端口号,用来区分一个主机上的应用程序的.
java112?characterEncoding=utf8:数据库名和字符集
useSSL=false:额外的参数起到了针对这次的数据库连接,解释说明,这里表示关闭加密User
root就是DBA权限最高账户管理员Password
jqka即自己数据库的密码受查异常,所以要向上进行抛异常


//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
System.out.println(connection);此处的Connection 对象,就是表示了一个数据库连接, 注意:
这里必须选择sql的Connection

我们之前在cmd敲的sql,是把 sql发送到mysql服务器mysql服务器负责解板,解析完成之后,执行.解析检查sql是否有语法错误具体要完成什么工作..... 解析工作,需要消耗系统资源 由于mysql服务器,同一时刻可能要同时给多个客户端提供服务.解析工作积少成多,也就会比较消耗资源
因此往往就可以把解析工作,放到客户端来完成(自己写的代码) 客户端发送sql之前,先解析好,先把一些能做的工作做好,这样服务器就可以降低一些工作量,减轻压力了
构造方法有很多种,这里我们使用最主流的PreparedStatement预编译语句来完成这一操作
//4.程序构造MySQL语句
String sql = "insert into student values(2,'李四')";
PreparedStatement statement = connection.prepareStatement(sql);
statement.executeUpdate();的返回值表示影响了几行数据

//5.释放上述资源
statement.close();
connection.close();说明:释放资源的顺序,要和创建资源的顺序相反 建立连接/创建语句的时候,就需要消耗一定的内存/硬盘/网络筹资源....这些资源,都是跟随这个连接来走的. 如果连接不再使用了,就需要把这些资源释放掉.
此时我们还可以使用Scanner自定义让用户输入数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入id: ");
int id = scanner.nextInt();
System.out.println("请输入name: ");
String name = scanner.next();在我们输入的时候可以使用占位符来进行操作避免出现多个引号的情况
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);注意:
替换时下标是从1开始的
package jdbc;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class TestJDBC1 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入id: ");
int id = scanner.nextInt();
System.out.println("请输入name: ");
String name = scanner.next();
//1.创建数据源对象
//向下转型,DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("jqka");
/*MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java112?characterEncoding=utf8&useSSL=false");
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("jqka");*/
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.程序构造MySQL语句
//String sql = "insert into student values(2,'李四')";
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
//4.把sql语句传到服务器上执行
int n = statement.executeUpdate();
System.out.println(n);
//5.释放上述资源
statement.close();
connection.close();
}
}插入删除修改操作都是相似的,改语句内容即可
//插入数据
String sql = "insert into student values(2,'李四')";
//删除id = 1的数据
String sql = "delete from student where id = 1";
//修改id = 2的name为张三
String sql = "update student set name = '张三' where id = 2";
//传送sql语句到服务器上
int n = statement.executeUpdate();select操作有所差异
//查表
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//接受的是一个结果集合
ResultSet resultSet = statement.executeQuery();
//遍历
while (resultSet.next()) {
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
}
resultSet.close();说明:通过ResultSet表示查询结果的临时表~~ 代码中使用的时候可以当做"集合类"来使用,可以进行遍历
总结两种执行SQL的方法 executeQuery() 方法执行后返回单个结果集的,通常用于select语句 executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete 语句
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全 解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("jqka");
Connection connection = ds.getConnection();区别: 1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源 时,通过connection.close()都是关闭物理连接。 2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接 是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将 Conncetion连接对象回收。
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。

实际开发中最常用的是PreparedStatement对象:
