JDBC编程指南

[toc]

JDBC是什么 (Java DataBase Connectivity)

jdbc是一种Java编程语言和各种数据库之间数据库无关连接的行业标准,
JDBC API为基于SQL的数据库访问提供了调用级API

数据库无关

在没有JDBC之前,我们需要编写不同的程序对接不同厂商的数据库系统,像下图所示,需要针对不同的数据库api编程,可想而知,当我们需要更换数据库系统而产生的大量重复工作,增加不必要的开发成本

图片来至Java从初学到精通

而JDBC的出现,统一了Java程序访问不同数据库系统的api,应用程序通过调用JDBC来操作数据库时,实际上是右数据库系统厂商提供的JDBC驱动程序来完成的。这样一来,即使要更换数据库系统,也仅仅是更换相应的驱动程序就可以了。(本文使用mysql的驱动程序)

图片来至Java从初学到精通

JDBC API主要完成以下三个工作:

  • 建立与数据库的连接或访问任何表格数据源
  • 发送SQL语句到数据库
  • 处理数据返回的结果

这三个工作中都有其对应的jdbc api来完成各自的任务。应用程序可以使用这些api 来操作数据库系统了

JDBC API

DriverManager

管理JDBC驱动的服务类,主要功能是获取Connection对象(示例程序中的第2步)

getConnection方法

Connection getConnection(url,username,password)

  • url写法:jdbc:mysql://localhost:3306/mydb
    本地数据库简写:jdbc:mysql:///mydb
  • jdbc:协议
  • mysql:子协议
  • localhost:主机名
  • 3306:端口号
  • mydb:数据库名称

Connection

数据库连接对象,每个Connection对象表示一个连接会话。

Connection的常用方法

1. 返回Statement对象

  • Statement createStatement()
  • PreparedStatement PreparedStatement(String sql):Statement的子类,将SQL语句提交到数据库进行预编译
  • CallableStatement prepareCall(String sql)Statement的子类,处理存储过程

2. 处理事务的常用方法

  • void setAutoCommit(boolean autoCommit):设置是否自动提交,默认true
  • void commit:提交事务
  • void rollback:事务回滚
  • Savepoint setSavepoint:创建一个保存点
  • Savepoint setSavepoint(Stirng name):指定名称来创建一个保存点
  • void rollback(Savepoint savepoint):将事务回滚到指定的保存点
  • void setTransactionIsolation(int level):设置事务隔离级别

Statement

执行具体的SQL语句,以及执行DDL、DCL、DML语句。

Statement子类 PreparedStatement

预编译的Statement对象

SQL语句一次编译多次执行

允许数据库预编译SQL语句(常带有参数或者叫占位符),这样一来,以后每次只需要改变SQL命令的参数,而不需要每次都编译SQL语句,性能得到了提升

PreparedStatement主要方法
  • void setXXX(int parmIndex,XXX value):设置预编译语句的参数

Statement常用方法

  • ResultSet executeQuery(String sql):只能执行查询语句,返回ResultSet
  • int executeUpdate(String sql):主要用于执行DML语句的,返回受影响行数。
  • boolean execute(String sql):执行任何SQL语句
  • addBatch(String sql):添加到批处理
  • executeBatch():执行批处理
  • clearBatch():清空批处理

ResultSet

结果集:查询结果的封装

ResultSet主要方法

移动指针的方法
  • next():移动指针到ResultSet记录的下一行,如果存在该条记录返回true
  • .......
获取当前行、指定列的值
  • getInt()、getString()针对不同数据类型的方法,
  • 通用的两个泛型方法<T> T getObject(int columnIndex,Class<T> type)、<T> T getObject(String columnLabel,Class<T> type)

JDBC实际操作

建库建表的SQL语句

-- 建库
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 建表
CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `username` VARCHAR(100) NOT NULL,
   `password` VARCHAR(40) NOT NULL,
   `name` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

示例程序框架

我们会在业务逻辑代码start的地方开始具体的执行操作

public void excute() throws SQLException {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet resultset = null;
        try {
            //1、加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取Connection对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8", "root", "***");
            if (conn != null) {
                System.out.println("连接成功");
            }
            conn.setAutoCommit(false);
            //业务逻辑代码start
            //插入数据操作
            String insertSql = "insert into user(username,password,name) values(?,?,?)";
            smt = conn.prepareStatement(insertSql);
            smt.setString(1, "xiaoming");
            smt.setString(2, "123");
            smt.setString(3, "小明");
            int result = smt.executeUpdate();
            if (result > 0) {
                System.out.println("添加成功");
            }
            smt.clearParameters();

            //修改数据操作
            String updateSql = "update user set name=? where id=?";
            smt = conn.prepareStatement(updateSql);
            smt.setString(1, "小牛");
            smt.setInt(2, 2);
            int updateResult = smt.executeUpdate();
            if (updateResult > 0) {
                System.out.println("修改成功");
            }
            smt.clearParameters();

            //查询数据操作
            String sql = "select *from user where id =?";
            smt= conn.prepareStatement(sql);
            smt.setInt(1,3);
            resultset = smt.executeQuery();
            while (resultset.next()) {
                int uid = resultset.getInt("id");
                System.out.println(String.format("id:%s,username:%s,password:%s,name:%s", uid, 
                        resultset.getString("username"), 
                        resultset.getString("password"), 
                        resultset.getString("name")));
            }
            //业务逻辑代码end
        conn.commit();
        } catch (Exception e) {
            System.out.println(e);
            conn.rollback();
        }
        //4、释放资源 写到finally里面,防止报错不能执行资源回收
        finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (smt != null) {
                try {
                    smt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (resultset != null) {
                try {
                    resultset.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

执行结果

连接成功
添加成功
修改成功
id:3,username:xiaoming,password:123,name:小明

业务逻辑代码中如果有错误,连接对象将执行回滚操作,保证数据的一致性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,271评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,533评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,580评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,203评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,204评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,664评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,014评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,991评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,536评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,558评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,678评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,267评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,997评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,429评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,580评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,259评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,744评论 2 366

推荐阅读更多精彩内容

  • JDBC基础知识 一、采用JDBC访问数据库的基本步骤: A.载入JDBC驱动程序 B.定义连接URL ...
    java日记阅读 3,861评论 0 20
  • 本节介绍Statement接口及其子类PreparedStatement和CallableStatement。 它...
    zlb阅读 1,173评论 0 0
  • 最近发现,朋友圈的人都普遍得了一种病,包括我。很多时候看到消息就在脑子里自动意念回复了,而导致不小心弧了人,等到对...
    傻得都方了阅读 6,565评论 3 5
  • 关于“一头雾水” 郎朗弹琴的时候,额头上都起雾了,都有水滴下来了,我都看见了,那就是一头雾水。
    秋野鹿鸣阅读 144评论 0 0
  • 12月4日 星期一 天气:晴 今天早晨女儿上学走后,在二宝盛衣物的小盒子里无意间收获了来自...
    三六班刘祥欣妈妈阅读 103评论 0 0