1.概念
JDBC(Java Database Connectivity java数据库连接)指的是通过Java代码,来操作数据库,是一种用于执行SQL语句的Java API,是Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问
2.工作原理
(1)一个成熟的数据库一般都会提供一些API(Application Programming Interface 应用程序编程接口,广义概念),供程序员使用,可以给人提供一些功能,这些功能往往是通过一些函数/类这样的方式来提供的
【1】 Arraylist、Scanner、Random等都可以认为是Java标准库提供的API。
【2】 Interface也是接口,特指Java语法中的一种特殊语法格式(狭义概念),Java 中的interface也是一种提供API的方式
(2)成熟的数据库有很多,如MySQL、Oracle、SQLServer、SQLite等,这些数据库提供的AIP差异很大。JDBC就是Java这边提出的一套操作数据库的API,存在的意义就是为了统一每个数据库的API,让所有的数据库都遵循Java的这套API,能按照一样的方式来操作使用。
(3)JDBC是提供了一套统一的API,但是数据库也有自己的API,这里是每个数据库厂商提供了数据库的驱动包(一些代码),类似于翻译,将API进行转化
(4)JDBC是个jar包,.jar类似于.rar这样的压缩包,.jar是java定义的一种压缩格式,里面包含了很多的.class文件
1.步骤
2.分析
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 JDBCDemo1 {
public static void main(String[] args) throws SQLException {
// 假定数据库中有一个 student 表 (id, name), 往里面插入一个数据.
// 让用户通过控制台来输入学号和姓名.
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号: ");
int id = scanner.nextInt();
System.out.println("请输入姓名: ");
String name = scanner.next();
// 1. 创建 "数据源"
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
// 2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
// 3. 构造 SQL 语句
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 = " + n);
// 5. 释放必要的资源. 关闭连接.
statement.close();
connection.close();
}
}
1. 创建 “数据源”
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root"); //设置用户名
((MysqlDataSource) dataSource).setPassword("123456"); //设置密码
2. 和数据库服务器建立网络上的连接
使用【Connection java.sql】,不要用【Connection com.mysql.jdbc】(MySQL驱动包的Connection)
Connection connection = dataSource.getConnection();
3. 构造 SQL 语句
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象,即Statement、PreparedStatement、CallableStatement
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 = " + n);
5. 释放必要的资源. 关闭连接.
创建的语句对象和连接对象,都会持有一些计算机的硬件/软件上的资源,这些资源不用了就应该要及时释放。
java中虽然有“垃圾回收”机制,可以自动释放内存,但是计算机的资源又不仅仅是内存,这些其他的资源就需要手动释放(一般都是会提供close方法,专门负责释放资源的方法)
statement.close();
connection.close();
三、查询操作
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
// 查询
public class JDBCDemo3 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的学号: ");
int studentId = scanner.nextInt();
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("2222");
Connection connection = dataSource.getConnection();
// 这里同样可以包含一些占位符.
String sql = "select * from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, studentId);
// 执行查询操作, 要使用 executeQuery. 返回值是一个 ResultSet 类型的对象. 表示了一个 "表格"
ResultSet resultSet = statement.executeQuery();
// 遍历结果集合,最先指向的是第一行记录的前一个位置,每次调用next就会往下走一行,读取成功了,返回true,否则返回false
while (resultSet.next()) {
// 获取到这一行的 学号 列
int id = resultSet.getInt("id");
// 获取到这一行的 姓名 列
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
// 释放资源.
resultSet.close();
statement.close();
connection.close();
}
}
1.ResultSet对象