目录
1 JDBC引言
1.1 JDBC简介
JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。
此前我们学习过SQL后,可以通过DataGrip
、 Navicat
、SQLyog
等图形化客户端发送SQL操作数据库。本质上,JDBC的作用和图形化客户端的作用相同,都是发送SQL操作数据库。差别在图形化界面的操作是图形化、傻瓜化的,而JDBC则需要通过编码(先不要思考JDBC代码怎么写,也不要觉得它有多难)完成图形操作时的效果。
总结:JDBC本质上也是一种发送SQL操作数据库的client技术,只不过需要通过Java编码完成。
为什么要学习JDBC?既然说JDBC和 Navicat
的作用相同,而 Navicat
图形化操作很简单(我们也很熟练),那么为什么还要学习操作更复杂(需要编码)、更陌生的新的Java客户端技术呢?
Java是可编程的(可定制化),可以将普通用户输入的数据拼接成各种各样的可运行的SQL,从而降低普通用户使用数据库服务的难度。
举个例子:任何系统中都有登录功能,登录时需要从用户表中根据用户名查询然后比对密码,每个人的用户名密码肯定不同,执行的select语句的条件部分就不同,直接让用户通过
Navicat
操作数据库,就得由用户拼接SQL,这对于小白用户要求过高。而JDBC就可以通过Java代码将用户输入的用户名密码拼接到SQL中完成查询,普通小白用户通过JDBC程序操作数据库时,只要会输入用户名密码即可!!!
1.2 JDBC原生编程(了解)
1.2.1 JDBC涉及的API
JDBC要通过Java代码操作数据库,JDBC中定义了操作数据库的各种接口和类型:
-
Driver: 驱动接口,定义了Java如何和数据库获取连接
-
DriverManager: 管理驱动的工具类, 可以管理多种驱动,通过它可以获取和数据库的连接
-
Connection:连接接口,通过它完成Java和数据库之间的交互
-
DataSource::数据源接口,用来管理Java和数据库建立的连接,可以复用之前建立的连接
-
PreparedStatement: 发送SQL的工具接口,该类型对象用于向数据库发送一条SQL
-
ResultSet: 结果集接口, 该类型的对象表示一条查询SQL返回的结果
注意:学习到这里不需要你掌握上述的任何一个类型(后续会逐步学习到每一个类型),只需要加深理解JDBC需要通过编码操作数据库(也就是JDBC的可编程属性)即可。
1.2.2 JDBC原生编程示例(了解)
之前,我们已经反复强调JDBC是一种和 Navicat
相当的客户端程序,那么JDBC操作数据库的步骤和 Navicat
操作数据库步骤就大同小异,下面我们先回顾下 Navicat
的操作步骤,然后分析出JDBC的步骤。
总结:开发步骤
1. 加载驱动 2. 获取链接:配置url、username和password 3. 准备SQL以及发送SQL的工具 4. 执行SQL 5. 处理结果集 6. 释放资源
-- 需求:从t_person表中查询数据
-- 数据准备
create table t_person(
person_id int primary key auto_increment,
person_name varchar(20),
age tinyint,
sex varchar(6),
mobile varchar(20),
address varchar(200)
);
insert into t_person values(1,'王月华',18,'F','1563868xxxx','郑州'),(2,'刘天赐',18,'M','1563768xxxx','郑州');
-- 需求 查询t_person表所有数据
select * from t_person;
-
准备工作(搭建开发环境)
需要在项目中引入数据库驱动jar包(jar文件:针对class文件的压缩格式包含了多个带包的class文件,类似于普通文件打包的zip、rar)
-
eclipse
将mysql-connector-java.jar添加到项目环境中 1. 右键选中项目,新建一个folder名为lib,将jar包复制到lib目录中 2. 右键选中jar包,build path-->add to build path
-
idea
将mysql-connector-java.jar添加到项目环境中 1. 右键选中项目,新建一个Directory名为lib,将jar包复制到lib文件夹中 2. 右键选中jar包,Add as Library --> OK
-
-
编码(JDBC6步)
public class JDBCTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1 加载驱动
/*
驱动版本8.0.x com.mysql.cj.jdbc.Driver
驱动版本5.1.x com.mysql.jdbc.Driver
*/
Class.forName("com.mysql.cj.jdbc.Driver");
//2 获取连接
String username = "root";//用户名
String password = "123456";//密码
/*
url参数用来确定连接的数据库信息: 数据库机器ip 端口号port 数据库名db_name 连接的参数,比如编解码集、时区...
url格式:jdbc:mysql://ip:port/db_name?k=v参数 ,只需要了解url的组成,不需要记忆
*/
String url = "jdbc:mysql://localhost:3306/baizhi?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
Connection conn = DriverManager.getConnection(url, username, password);//通过DriverManager管理驱动获取连接
//3 准备发送SQL的工具
String sql = "select * from t_person";
PreparedStatement pstm = conn.prepareStatement(sql);
//4 发送执行SQL
ResultSet rs = pstm.executeQuery();
//5 处理结果集(如果有)
while(rs.next()){
/*
rs.getXxx(列顺序从1开始) 或者 rs.getXxx("列名") 获取指定列的数据,Xxx为数据类型
实战中多使用列名,可读性强
*/
int personId1 = rs.getInt("person_id");
String personName1 = rs.getString("person_name");
int age1 = rs.getInt("age");
String sex1 = rs.getString("sex");
String mobile1 = rs.getString("mobile");
String address1 = rs.getString("address");
System.out.println("personId="+personId1+",personName="+personName1
+",age="+age1+",sex="+sex1+",mobile="+mobile1+",address="+address1);
int personId2 = rs.getInt(1);
String personName2 = rs.getString(2);
int age2 = rs.getInt(3);
String sex2 = rs.getString(4);
String mobile2 = rs.getString(5);
String address2 = rs.getString(6);
System.out.println("personId="+personId2+",personName="+personName2