文档章节

数据库开发 - JDBC基础

抢小孩糖吃
 抢小孩糖吃
发布于 2016/09/12 16:37
字数 2002
阅读 77
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

#JDBC 基础 ##连接数据库 通常是由客户端和服务器端两部分组成,客户端封装服务器请求发送给服务器端,服务器端执行完毕以后,将结果返回给客户端

##MySQL连接数据库方式

  • 图形化工具
    MySQL官方客户端Workbench,这类工具的优点在于页面友好,操作简单。缺点在于只能够实现一些简单的查询,
  • 驱动程序jar包
    应用程序通过jar包,就能够实现使用JDBC与数据进行通信。
  • 命令行工具
    命令行输入完整SQL语句。

输入图片说明

##应用程序连接数据库 多种数据库不同,客户端与服务器端通信协议也不相同。提高学习成本。当从一个数据库迁移到另外一个,非常困难。不具有一致性。

JDBC是接口规范。

输入图片说明

##JDBC优势

  • 简单
    只要掌握一套接口,便可以开发数据库
  • 快捷
    降低开发时间
  • 移植性
    统一接口和规范
  • 框架
    JDBC满足了最基本的功能。基于JDBC之上可以定制框架。

##JDBC体系架构 JDBC从体系架构上来说分为两层,上层的JDBC API层,主要负责与编写的Java Web程序进行通信。下层的JDBCDriver API层,主要负责和具体的数据库进行连接。一般由数据库厂商提供,负责与数据库的通信。 输入图片说明

##安装JDBC JDBC的API已经集成到了JDK中,不需要引用和额外安装。我们需要安装的是JDBC的驱动程序。对于MySQL数据库,我们需要登录Oracle MySQL官网,进行注册下载。

Oracle MySQL官网
MySQL下载页面 - 注意:MySQL分为商业版和社区版
MySQL社区版下载页面 MySQL和其他程序的连接
MySQL和JDBC的连接

备注:
可以直接通过http://mvnrepository.com/搜索最新jar包。

##HelloWorld 输入图片说明

##Driver & DriverManager ###Driver Driver实际上是接口,定义了各个驱动程序,需要实现的功能,是驱动程序的抽象。通过操作Driver驱动接口,既可以实现对各个驱动程序的操作。 ###DriverManager DriverManager是管理类,用户通过Class.forname(DriverName)的方式,就可以向DriverManger注册驱动程序;通过DriverManager的getConnection方法创建数据库的物理连接。
我们可以从代码看到DriverManager.getConnection(DB_URL,USER,PASS),分别有三个参数。这用户名密码在我们从部署数就可以获取。
DB_URL是后端数据库的唯一标识符,应用程序通过该标识符即可唯一确定后端的某个数据库实例。

jdbc:mysql://10.164.172.20:3306/cloud_study

有以下内容组成:

  • 协议:jdbc:
  • 子协议:mysql://
    我们以MySQL为例,这里就是mysql。前面我们知道通过class.forName注册驱动程序,当我们注册多个驱动程序,当我们要调用getConnection建立到后端数据库连接,DriverManager通过DB_URL的子协议部分来确定调用对应的驱动程序
  • 子名称
    • 主机
    • 端口
    • 数据库

##常用JDBC URL

  • MySQL jdbc:mysql://<ip>:<port>/database
  • Oracle jdbc:oracle:thin:@<ip>:<port>:database
  • SQLServer jdbc:microsoft:sqlserver://<ip>:<port>;DatabaseName=database

输入图片说明

##JDBC API

输入图片说明

##Connection对象 Connection对象实际代表了,Java应用程序和后端数据库服务器的一条物理连接。基于这条链接,我们可以执行SQL语句。

  • 常用方法
    Statement stmt = conn.createStatement();Connection对象可以创建一个或者多个Statement对象。

##Statement Statement对象实际上是SQL的容器,在这个SQL容器中,我们可以进行select、create、update、delete等。可以承载我们放入的SQL语句。

  • 常用方法
    ResultSet rs = stmt.executeQuery("select userName for user");通过方法参数放入SQL语句,执行方法获取SQL语句执行后的结果集。这个结果集是ResultSet对象来表示。当我们update或者delete时,返回的对象并不是ResultSet对象,而是int对象。代表SQL语句的更新或者删除影响的数据库行数。

输入图片说明

##ResultSet ResultSet对象实际代表了SQL查询结果。我们知道关系型数据库本质上实际上是一个二元表,所以ResultSet对象也是由行列组成的二元表。ResultSet对象内部时具有指针的,来指向对应的行记录。默认该指针指向第一行记录。
###获取行 当使用next方法时,指针指向后一行记录。
通过previous方法,指针指向前一行记录。
通过absolute方法,指针指向某一行记录。
通过beforeFirst方法,指针指向第一行的最前端,通过next方法才能够指向第一条记录(注意:beforeFirst指向第一行的前面,指向链表的header)。
通过afterLast方法,指针指向最后一行记录的下一条记录。

输入图片说明

###获取列 可以通过列表,或者通过列的序号方式,获取并定位。Index的第一列的序号为0
getString(ColumnName/Index)
getInt(ColumnName/Index)
getObject(ColumnName/Index)

输入图片说明

##JDBC API JDBC的异常,是由SQLException抛出异常。

输入图片说明

#JDBC实战 ##构建步骤 构建Java Web程序需要以下步骤:

  • 1.装载驱动程序
  • 2.建立数据库连接
  • 3.执行SQL语句
  • 4.获取执行结果
  • 5.清理环境 输入图片说明

##编写测试代码

###在Maven中添加JDBC驱动 由于常用的数据库为Mysql、PostgreSQL、SQLite,则添加这三种,其他请自行去mvnrepo添加。

··· <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>

<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
  <groupId>org.xerial</groupId>
  <artifactId>sqlite-jdbc</artifactId>
  <version>3.8.11.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>6.0.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>9.4.1210.jre7</version>
</dependency>

</dependencies> ···

##代码连接过程

1.加载驱动程序

    static final String JDBC_DRIVER = "org.postgresql.Driver";
//    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

        // 1. add Driver
        Class.forName(JDBC_DRIVER);

如果发生载入错误,就会报异常,编者遇到两个错误,第一种是JDK版本与驱动程序的JDK版本不一致;另外就是找不到类

2.创建数据库连接

// 2. create db connnection
        try {
            DriverManager.getConnection(DB_URL,USER,PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }

如果发生错误,就会报异常

org.postgresql.util.PSQLException: FATAL: database "xxx" does not exist

3.运行SQL

// 3.run SQL
            statement = connection.createStatement();
            resultSet = statement.executeQuery("SELECT \"userName\" FROM \"public\".\"user\"");

注意:这里编者使用的是PostgreSQL,其SQL语句和MySQL有许多不同。

4.获取结果集

// 4.get userName
            while(resultSet.next())
            {
                Integer index = resultSet.getRow();
                String value = resultSet.getString("userName");
                System.out.println("resultSet [row]:" + index + " [value]:" + value);
            }

###5.关闭数据库连接

 finally {
            try {

                // 5. close connection
                if(connection != null)
                    connection.close();
                if(statement != null)
                    statement.close();
                if(resultSet != null)
                    resultSet.close();

                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }

###打印结果

Hello World!
getConnection
resultSet [row]:1 [value]:aaa
resultSet [row]:2 [value]:bbb
resultSet [row]:3 [value]:ccc

##小测验 查找下列代码的问题:
输入图片说明

回答:
1.没有try-catch异常,在发送给数据库的SQL语句在传送有可能会发生异常,必须要捕获异常,进行相应的异常处理与关闭链接。
2.没有进行链接的关闭和清理工作。

下图方法如果发生异常,则会导致不能关闭数据库连接
输入图片说明

下图没有判断对象是否为null
输入图片说明

#附录 ##Postgresql JDBC驱动的问题

org/postgresql/Driver : Unsupported major.minor version 52.0

通过查询发现,该内容为驱动与JDK版本不兼容。则尝试载入其他版本。 切换到

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4.1210.jre7</version>
</dependency>

##MySQL JDBC驱动问题 JDK7与MySQL的驱动版本为6的无法正常运行

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.39</version>
    </dependency>

##完整的HelloJDBC.java

package com.hava.jdbc;

import java.sql.*;

/**
 * Created by zhanpeng on 2016/9/21.
 */
public class HelloJDBC {

    static final String JDBC_DRIVER = "org.postgresql.Driver";
//    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

    static final String DB_URL = "jdbc:postgresql://192.168.1.200/test";

    static final String USER = "postgres";

    static final String PASSWORD = "";

    public static void helloworld() throws ClassNotFoundException {

        Connection connection = null;

        Statement statement = null;

        ResultSet resultSet = null;


        // 1. add Driver
        Class.forName(JDBC_DRIVER);

        // 2. create db connnection
        try {
            connection = DriverManager.getConnection(DB_URL,USER,PASSWORD);
            System.out.println("getConnection");

            // 3.run SQL
            statement = connection.createStatement();
            resultSet = statement.executeQuery("SELECT \"userName\" FROM \"public\".\"user\"");

            // 4.get userName
            while(resultSet.next())
            {
                Integer index = resultSet.getRow();
                String value = resultSet.getString("userName");
                System.out.println("resultSet [row]:" + index + " [value]:" + value);
            }
        } catch (SQLException e) {
            // Exception
            e.printStackTrace();
        } finally {
            try {

                // 5. close connection
                if(connection != null)
                    connection.close();
                if(statement != null)
                    statement.close();
                if(resultSet != null)
                    resultSet.close();

                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }
    }
}

© 著作权归作者所有

抢小孩糖吃

抢小孩糖吃

粉丝 74
博文 263
码字总数 252402
作品 0
东城
程序员
私信 提问
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
2.8K
0
干货系列1:Java互联网网站开发工程师 的技术提高与晋升路线(技术专精)

前几天写了自己对于Java软件开发工程师职业发展规划方面的一些感悟,陆续收到一些反馈,希望我能再就Java工程师不同的开发(职责)方向谈谈职业发展问题。(上一篇:Java软件开发工程师的自我...

半饱即好
2018/06/26
0
0
好程序员大数据视频教程从零基础入门到精通

好程序员大数据视频教程从零基础入门到精通,学习大数据技术的必经之路是什么?是Hadoop吗?当然不是!如果想要踏入大数据的门槛,一个必须的条件就是我们的编程基础。熟练掌握一门编程语言是对大...

好程序员IT
04/03
27
0
Java程序设计经典300例

《Java程序设计经典300例》共分为3篇。 第1篇 基础篇(第1~5章)本篇主要内容包括:Java语言基础、流程控制、数组、字符串和面向对象编程。通过本篇的学习,读者可以掌握Java开发环境的配置...

请叫我院长
2013/12/03
512
0
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
2018/07/25
2
0

没有更多内容

加载失败,请刷新页面

加载更多

密码加密与微服务鉴权JWT详细使用教程

[TOC] 1.1、了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性。 什么是无状态? 1.服务端不保存任何客户端请求者信...

庭前云落
18分钟前
6
0
Xamarin.FormsShell基础教程(9)Shell相关类体系

Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类。Shell类实现了大多数应用程序所需的基本UI功能的页面。除此以外,常用的类还有ShellContent、Tab、Fly...

大学霸
20分钟前
4
0
聊聊MVC、MVP、MVVM吧

先来介绍下本文结构: 三种框架的具体概念 在安卓开发上的写法、优缺点 1.概念 1.1 MVC MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模...

二营长的意大利炮手
37分钟前
4
0
如果解释Python,什么是.pyc文件?

我已经了解Python是一种解释型语言......但是,当我查看我的Python源代码时,我看到.pyc文件,Windows将其识别为“编译的Python文件”。 这些来自哪里? #1楼 Python代码经历了两个阶段。 第...

javail
42分钟前
4
0
.NET Core初览

初览的应用场景为游戏服务器开发。所以测试在侧重点上更强于IO和密集型计算 TODO

梦想游戏人
45分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部