JDBC编程菜鸡攻略

8 篇文章 0 订阅
1 篇文章 0 订阅

什么是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语句的操作,关于插入和删除的我们有写,如果还是有不明白的宝宝,可以直接在下面问我,我一直都在哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值