文章目录
- 一、概述
- 二、使用
一、概述
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.步骤
- 将jar包导入到项目中
- 创建数据源
- 创建数据库连接Connection
- 创建操作命令Statement
- 使用操作命令来执行SQL
- 处理结果集ResultSet
- 释放资源
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();
- DataSource :JDBC的interface,MysqlDataSource :MYSQL驱动包中提供的类,实现了DataSource interface,是向上转型
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");
- 是向下转型(因为这个setUrl方法是子类独有的)
> MysqlDataSource dataSource = new MysqlDataSource();
> DataSource.setUrl();
也可以这样写,不需要任何转型 - 上述转型的写法,本意是希望,让MysqlDataSource这个类,不要扩散到代码的其他部分(目的是降低mysql驱动包和自写项目之间的耦合关系,避免后续更换数据库时,有太大的成本)
- URL:唯一资源定位符,通常使用URL来描述网络上的一个资源的位置,mysql本体是服务器,相当于是网络上的资源
- jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false
- jdbc:mysql:表示这个url是什么类型/用途的,这里意思是,【给JDBC的mysql使用的】
- 127.0.0.1
- 表示ip地址(网络上的一个设备的地址,通过一串数字来表示,这一串数字通常是4个部分,每个部分取值范围是0-255,4个部分使用.分割,使用点分十进制转换)
- 127.0.0.1 是个特殊的ip地址,即环回ip(loopback)特指自己的主机
- 3306:端口号,用来区分主机上的应用程序(进程)
- Test:数据库名
- characterEncoding=utf8:统一字符集是utf8
- useSSL=false:数据库服务器和客户端之间的通信要不要加密(不写是默认加密),不写有可能会连不上数据库
((MysqlDataSource) dataSource).setUser("root"); //设置用户名
((MysqlDataSource) dataSource).setPassword("123456"); //设置密码
- root:大家都是root
- 123456:安装数据库时,自己设置的密码
2. 和数据库服务器建立网络上的连接
使用【Connection java.sql】,不要用【Connection com.mysql.jdbc】(MySQL驱动包的Connection)
Connection connection = dataSource.getConnection();
- java.sql.SQLException:jdbc中提供的受查异常,务必要手动处理,(要么try catch、要么throws)
- 一个java程序可以连多个数据库服务器
- 和每个数据库服务器进行通信都得有一个独立的连接
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);
- SQL语句,是String类型的,JDBC提供了Statement(语句)对象,可以将String转换成Statement再发给服务器执行,但是,我们一般会使用PreparedStatement(预处理的语句)对象来代替Statement。
- Statement 是把sql原封不动地直接发给数据库服务器,数据库服务器自己负责解析SQL,PreparedStatement 则会在客户端这边初步解析一下SQL,如验证语法是否正确等等,此时服务器就不用做这些检查了,可以降低服务器的负担
- String sql = “insert into student values(” + id + ", " + name + “)”;
- 这种写法也可以达到动态输入的效果,但是不建议这么写,因为这个写法看起来比较混乱,而且这种拼接字符串的方式,并不安全(可能会受到SQL注入攻击,黑客会通过一些特定的输入,达成对数据库攻击的效果)
- ?是一个占位符,占据一个位置,后续PreparedStatement 会把变量的数值,代入到?中
4. 执行 SQL 语句
int n = statement.executeUpdate();
System.out.println("n = " + n);
- executQuery():本质是“读”操作, 方法执行后返回单个结果集的,通常用于select语句
executeUpdate():本质都是“写”操作,方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
语句
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,否则返回falsewhile (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对象
- ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
- ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。