一 概念:
-
JDBC:
Java DataBase Connectivity 即java数据库连接。
jdbc是oracle公司指定的一套规范(一套接口) -
驱动:jdbc的实现类.由数据库厂商提供.
ps :我们可以使用厂商提供的jar例如mysql的jar包mysql-connector-java-5.1.39-bin.jar(随便下了一个版本的jar)来操作(通过jar包内的api)数据库 -
提供商 例如mysql提供了mysql的jar包,oracle 提供了oracle的jar包
(使用不同的jar包提供的api 就可以操作不同的数据库)
所以我们总结了jdbc 的功能:
1 连接数据库
2 发送sql语句
3 处理结果
二 使用jdbc操作数据库(简单的查询举例)
1 使用java代码操作之前我们先在数据库中建立个表 添加一些简单的信息
初始化数据库和表:
CREATE DATABASE day07;
USE day07;
create table category(
cid varchar(20) primary key,
cname varchar(20)
);
insert into category values('c001','电器');
insert into category values('c002','服饰');
insert into category values('c003','化妆品');
insert into category values('c004','书籍');
2 在编辑工具中添加驱动jar(本栗子基于idea)

操作十分简单,建立个lib文件夹用于存放我们的jar包,然后把下载好的jar粘贴过来,这时我们选中jar包在鼠标右键 add as library 选 module 确定 就ojbk了。
3 啥也别说了直接贴代码(十分简单直接粘过来,修改几个参数就能用,代码中表明了那些需要修改称为自己的十分简单)
首先来个思路:(可以参考 代码中会详细注释)
编码:
1注册驱动 : (反射注册)
2获取连接对象: (驱动管理静态调用 获得链接方法(有参数) 返回链接对象)
3编写sql: String 类型的sql语句
4创建预编译的语句执行者: 链接对象掉预编译函数预编译sql 获得预编译对象
5执行sql : 预编译对象执行sql
6处理结果: 获得查询 更新等结果
7释放资源: (关闭链接)
代码实现:
package jdbc;
import java.sql.*;
/**
* Create by SunnyDay on 2018/11/10
*/
public class JdbcDemo {
// mysql的固定驱动包名 (不需要更改)
private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
//数据库连接地址 注意: 后面的day07为我的数据库名字此处更改为你自己的数据库名字就行了
private static final String URL = "jdbc:mysql://localhost:3306/day07";
//用户名 (一般用户名都为root 安装mysql软件时设置的 如果你的不是 使用你自己的安装时自己起的名字就行)
private static final String USER_NAME = "root";
//密码 (填写你安装mysql时的密码 我的123456)
private static final String PASSWORD = "123456";
public static void main(String[] args) {
Connection connection = null;
try {
//1 加载mysql的驱动类 传mysql驱动包名
Class.forName(DRIVER_NAME);
//2 获取数据库连接
connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
//3 编写sql语句 (自己写 此处是我查询我day07 数据库中的category这张表,你查自己的行)
String sql = "SELECT * FROM CATEGORY";
// 4预编译sql
PreparedStatement prst = connection.prepareStatement(sql);
//5执行sql 获得结果
ResultSet rs = prst.executeQuery();
while (rs.next()) {
// 6 打印你自己的表字段 就行
System.out.println(rs.getString("cid") + "::" + rs.getString("cname"));
}
rs.close();
prst.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
//7 关闭连接 释放资源
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
简单的查询结果如下图:

是不是十分简单就搞好了(这个只是个简单的初学者使用的参考,如果老鸟们就可以跳过了哈哈)
三 相关 api详解
图解:(jdbc常用)




1 包 如上文我们所有使用的包都是 java.sql 或者 javax.sql包下的
2 DriverManager
2.1注册驱动方法:
2.1.1static void registerDriver(Driver driver)
注意:参数我们一般 new com.mysql.jdbc.Driver(); 这个包下的Driver是sql包下Driver的子类。
为什么我们不使用这种方式注册代码呢? 看Driver的源码如下:
package com.mysql.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
ps: 看实现了接口的包名正如我们所说的继承关系
看try内的语句 我们发现我们调用就是这个注册语句,结果这儿的静态代码块又调用了一次,这相当于代码执行了两次,其实让静态代码块执行就是类加载时执行,也就是类加载时静态代码块就执行,所以我们可以使用反射只需要一行代吗就行了(参考类加载原理)
所以注册驱动(我们一般使用反射的方式)
2.1.2反射的三种方式(随便选择)
如上文Class.forName(DRIVER_NAME);我们以后开发中习惯这种
2.2连接数据库 获得连接对象
static Connection getConnection(String url, String user, String password)
参数1:告诉我们连接什么类型的数据库及连接那个数据库
协议:数据库类型:子协议 参数
mysql: jdbc:mysql://localhost:3306/数据库名称
oracle: jdbc:oracle:thin@localhost:1521@实例
参数2:账户名 root
参数3:密码
3 Connection
Connection里面有两个常用的方法:
1 Statement createStatement()
2 PreparedStatement prepareStatement(String sql)
常用方法:
获取语句执行者:
(了解)Statement createStatement() :获取普通的语句执行者 会出现sql注入问题
★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者
(了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者
了解:
setAutoCommit(false) :手动开启事务
commit():提交事务
rollback():事务回滚
4 Statement
Statement:语句执行者 接口
PreparedStatement:预编译语句执行者 接口
常用方法:
设置参数:(问号为sql语句中的?占位符)
setXxx(int 第几个问号,Object 实际参数);
常见的方法:
setInt
setString
setObject
执行sql:
ResultSet executeQuery() :执行 r 语句 返回值:结果集
int executeUpdate() :执行cud 语句 返回值:影响的行数(通过这个数值可以知道是否执行成功)
5 ResultSet 结果集 接口
执行查询语句之后返回的结果
常用方法:
boolean next():判断是否有下一条记录,
若有返回true且将光标移到下一行,若没有呢则返回false
光标一开始处于第一条记录的上面
获取具体内容
getXxx(int|string)
若参数为int :第几列
若参数为string:列名(字段名)
例如:
获取cname的内容可以通过
getString(2)
getString("cname")
常用方法:
getInt
getString 也可以获取int值
getObject 可以获取任意
完!!!
网友评论