什么是JDBC
现在的应用系统大多都离不开数据库,Java程序访问数据库的基本方式是通过JDBC。JDBC(Java DataBase Connectivity,Java数据库连结)技术的简称,是一种用于执行SQL语句的Java API。它由一组用Java编程语言编写的类和交界口组成。这个API由 java.sql.*,java.sql.*包中的一些类和接口组成,它为数据库开发人员提供了一个标准的API,使它们能够用纯Java API来编写数据库应用程序。
JDBC工作原理
JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。真正的数据库访问操作实现是由各自数据厂商提供的。通常把厂商提供的特定于数据库的访问API称为数据库JDBC驱动程序。
JDBC访问数据库层次结构:
JDBC优势:
- Java语言访问数据库完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
JDBC使用步骤
JDBC使用流程图
接下来我们来看我们的JDBC编程案例
JDBC开发案例
准备数据库环境(创建一个便签应用的数据库以及表)
//如果存在memo,就将它删除
drop database if exists 'memo';
create database if not exiets 'memo' default character set utf8 collate utf8_general_ci;
drop table if exists `memo_group;
create table if not exists `memo_group`(
id int primary key auto_increment comment '便签组编号',
name varchar(8) not null unique key comment '便签组名称',
created_time datetime not null comment '创建时间',
modify_time timestamp comment '修改时间'
)engine innodb;
insert into `memo_group` (id,name,created_time) values (1, '默认组',
now());
drop table if exists `memo_info`;
create table if not exists `memo_info`(
id int primary key auto_increment comment '便签编号',
group_id int not null comment '便签组编号',
title varchar(32) not null comment '便签标题',
content varchar(1024) not null default '' comment '便签内容',
is_protected char(1) not null default '0' comment '是否私密, 0:公开
1:私密',
background enum('WHITE','RED','BLUE','GREEN') default 'WHITE'
comment '背景颜⾊',
is_remind char(1) default '0' comment '是否提醒, 0:不提醒 1:提醒',
remind_time datetime comment '提醒时间',
created_time datetime not null comment '创建时间',
modify_time timestamp comment '修改时间'
)engine innodb;
-- 欢迎标签
insert into `memo_info`(id,group_id,title,content,created_time) values
(1,1,'欢迎使⽤','下⾯是使⽤⼿册',now())
drop table if exists `memo_share`;
create table if not exists `memo_share`(
id int primary key auto_increment comment '便签分享编号',
info_id int comment '便签编号',
mark varchar(32) not null default '' comment '分享备注',
share_time datetime not null comment '分享时间'
)engine innodb;
-- 欢迎标签分享
insert into `memo_share`(id,info_id,mark, share_time) values (1,1,'特别
有意思的便签APP',now());
1、准备数据库驱动包
MySQL数据库的驱动包
我们将我们的下载到的jar包要添加到我们的IDEA中
- 我们右击我们的src,在里面会有一个Open Module Settings
- 然后我们将我们的Open Module Settings打开,里面会有一个Dependencies,我们将我们的jar包拖进去就可以了。
2、加载JDBC驱动程序
//加载驱动程序
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
3、建立数据库连接
Connection connection=DriverManager.getConnection
("jdbc:mysql://localhost:3306/memo?user=root&password=369888abc&useSSL=false");
我们这里的useSSL=false是我们的版本问题,为了安全连接添加的。
4、创建操作命令
Statement statement=connection.createStatement();
ResultSet resultSet=statement.executeQuery
("select id,name,created_time,modify_time from memo_group ");
我们这里写的一条select语句,所以需要返回的是我们的结果集
5、执行SQL语句
6、处理结果集
while(resultSet.next()){
//如果返回true表示有下一行记录,否则无计记录
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
LocalDateTime createdTime=
resultSet.getTimestamp("created_time").toLocalDateTime();
LocalDateTime modifyTime=
resultSet.getTimestamp("modify_time").toLocalDateTime();
System.out.println(
String.format(
"编号:%d,名称:%s,创建时间:%s,修改时间:%s",
id,name,
createdTime.toString(),
modifyTime.toString()
)
);
}
7、释放资源(关闭结果集、命令、连接)
将上面打开的自于关闭掉
我们会发现我们的删除语句,我们的插入语句,我们的修改语句都差不多,所以我们写一个模板方法:
package com.lele.jdbc;
import java.sql.*;
public abstract class JDBCTemplate {
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private int effect=-1;
private String url;
public JDBCTemplate(String host,Integer port,String username,String password,String database){
this.url=String.format("jdbc:mysql://%s:%d/%s?user=%s&password=%s&useSSL=false",
host,
port,
database,
username,
password);
}
public final void call(){
//加载驱动
loadDdriver();
//2:创建连接
createConnect();
//3:创建命令
createStatment();
//4:准备 SQL
createSql();
//执行
execute();
//处理结果
//1第一类:返回int
handlerResult();
//第二类返回结果集
//7关闭结果集,命令、链接
closeAll();
}
private void closeAll() {
if(this.resultSet!=null){
try {
this.resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(this.connection!=null){
try {
this.connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(this.statement!=null){
try {
this.statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
this.effect=-1;
}
private void handlerResult() {
if(this.executeType()){
this.handlerR(resultSet);
}else{
this.handlerCUD(effect);
}
}
//我们的插入,删除,修改的情况
public abstract void handlerCUD(int effect);
//我们的查询的情况
public abstract void handlerR(ResultSet resultSet);
private void createStatment() {
try {
statement=connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
private void execute() {
String sql = this.createSql();
if (sql != null) {
if (this.executeType()) {
try {
resultSet = statement.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
} else {
try {
effect = statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//我们创建sql语句,留给我们的用户自己创建
public abstract String createSql();
//返回我们的执行结果
public abstract boolean executeType();
private void createConnect() {
try {
connection= DriverManager.getConnection
(this.url);
} catch (SQLException e) {
e.printStackTrace();
}
}
private void loadDdriver() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
我在这里为大家附上我的测试的代码,帮助大家理解
package com.lele.jdbc;
import java.sql.*;
import java.time.LocalDateTime;
public class TestJDBCTemplate {
public static void main(String[] args) {
JDBCTemplate jdbcTemplate=new JDBCTemplate
("localhost",3306,"root","369888abc","memo") {
@Override
public void handlerCUD(int effect) {
//do nothing
}
@Override
public void handlerR(ResultSet resultSet) {
if(resultSet!=null){
try {
while(resultSet.next()){
//如果返回true表示有下一行记录,否则无计记录
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
LocalDateTime createdTime=
resultSet.getTimestamp("created_time").toLocalDateTime();
LocalDateTime modifyTime=
resultSet.getTimestamp("modify_time").toLocalDateTime();
System.out.println(
String.format(
"编号:%d,名称:%s,创建时间:%s,修改时间:%s",
id,
name,
createdTime.toString(),
modifyTime.toString()
)
);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public String createSql() {
return "select id,name,created_time,modify_time from memo_group";
}
@Override
public boolean executeType() {
return true;
}
};
jdbcTemplate.call();
}
}
这里我主要详细的说明了我们的sql语句中Select语句的操作,关于插入和删除的我们有写,如果还是有不明白的宝宝,可以直接在下面问我,我一直都在哦。