开发者社区> 小弟的谷哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

后台(06)——JDBC

简介: 探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分...
+关注继续查看

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明


本文简介

本文主要介绍JDBC的基础知识及其用法。


JDBC简介

JDBC(java database connectivity)是SUN公司提供的一套利用Java语言操作数据库的标准规范。
在JDBC中定义了许多接口而数据库厂商在其数据库驱动中实现了这些接口。关于JDBC与数据库驱动的关系,请参见下图:

这里写图片描述

JDBC中定义的接口(规范),各数据库厂商(比如MySQL,Oracle,DB2等)在其数据库驱动中实现了这些接口(规范)。所以,JDBC屏蔽了Java与不同数据库打交道的细节问题;假如项目原本使用的是MySQL,在某段时间后换成了Oracle,那我们基本不用去修改原来项目中的SQL语句,只需要把JDBC中MySQL的数据库驱动切换成Oracle对应的数据库驱动即可。

JDBC的核心技术点:

  • DriverManager:用于加载驱动
  • Connection: 用于创建与数据库的连接
  • Statement: 用于操作sql语句
  • ResultSet: 结果集或一张虚拟表

JDBC的操作步骤:

  • 加载驱动
  • 创建连接
  • 创建Statement对象
  • 执行sql语句且返回结果
  • 处理结果
  • 关闭资源

嗯哼,在了解这些之后我们来看一个简单的示例,代码如下:

package cn.com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UnitTest {
    @Test
    public void testJDBC1() {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
            statement = connection.createStatement();
            String sql = "select * from student";
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resultSet = null;
            }

            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
        }

    }

}

在该示例中,利用JDBC从数据库查询数据。代码解析如下:

  • 第一步:
    加载MySQL数据库驱动,请参见代码第22行
  • 第二步:
    创建与数据的连接,请参见代码第23行
  • 第三步:
    创建用于执行SQL语句的Statement对象,请参见代码第24行
  • 第四步:
    利用Statement执行SQL语句且得到结果集,请参见代码第26行
  • 第五步:
    处理结果集,请参见代码第27-34行
  • 第六步:
    关闭资源,请参见代码第37-64行

详解JDBC常用类和接口

通过刚才的例子,我们对于JDBC的使用有了初步的了解和认知,现在此基础上详解JDBC常用的类和接口

java.sql.Drivermanager类

java.sql.Drivermanager类用于加载(注册)驱动和与数据库建立连接。

  • 利用java.sql.Drivermanager类用于加载(注册)驱动

    在此,我们采用的是:

    Class.forName(“com.mysql.jdbc.Driver”);

    还有另外一种方式:

    DriverManager.registerDriver(new com.mysql.jdbc.Driver());

    该方式不但强烈依赖数据库的驱动jar而且会导致驱动被重复注册2次。故不建议使用该方式

  • 利用java.sql.Drivermanager类与数据库建立连接

    比如,该示例中:

    DriverManager.getConnection(“jdbc:mysql://localhost:3306/db1”,”root”, “root”);

    其中jdbc表示协议,mysql表示子协议,localhost代表IP,3306表示端口号,db1表示要连接的数据库,第一个root表示用户名,第二个root表示密码。这些值是我示例中的配置,在项目中使用时请替换这些值。

java.sql.Connection接口

java.sql.Connection是一个接口,它用于与数据库交互;各数据库驱动中均实现了该接口。java.sql.Connection最常用的操作是创建用于执行SQL语句的Statement,即:

connection.createStatement();

java.sql.Statement接口

java.sql.Statement接口用于操作SQL语句并返回相应的结果集;各数据库驱动中均实现了该接口。java.sql.Statement的常用方法如下:

  • executeQuery(String sql)
    该方法用于执行select语句并根据查询语句返回结果集
  • executeUpdate(String sql)
    该方法用于执行insert、update、delete语句并返回受影响的行数
  • execute(String sql)
    此方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false

java.sql.ResultSet接口

java.sql.ResultSet用于保存执行SQL语句之后得到的结果集;各数据库驱动中均实现了该接口。

ResultSet对外暴露一个游标,该游标默认指向结果集第一行之前。ResultSet常见方法释义如下:

boolean next()

将游标从当前位置向下移动一行

boolean previous()

将光标移动到此ResultSet对象的上一行。

void afterLast()

将光标移动到末尾,正好位于最后一行之后。

void beforeFirst()

将光标移动到开头,正好位于第一行之前。

Object getObject(int columnIndex);

根据序号取值,索引从1开始

Object getObject(String ColomnName);

根据列名取值

int getInt(int colIndex)

以int形式获取ResultSet结果集当前行指定列号值

int getInt(String colLabel)

以int形式获取ResultSet结果集当前行指定列名值

float getFloat(int colIndex)

以float形式获取ResultSet结果集当前行指定列号值

float getFloat(String colLabel)

以float形式获取ResultSet结果集当前行指定列名值

String getString(int colIndex)

以String形式获取ResultSet结果集当前行指定列号值

String getString(String colLabel)

以String形式获取ResultSet结果集当前行指定列名值

Date getDate(int columnIndex);

以Date形式获取ResultSet结果集当前行指定列号值

Date getDate(String columnName);

以Date形式获取ResultSet结果集当前行指定列号值

void close()

关闭ResultSet对象

在从ResultSet中获取到数据库中数据后,我们就将这些数据封装到JavaBean中;在此请注意Java的数据类型与数据库的数据类型的对应关系:

这里写图片描述


利用preparedStatement防止SQL注入

preparedStatement(预编译对象)是Statement的子类,它具有如下特点:

  • 预先编译SQL语句
  • 性能优异
  • 在SQL语句中使用占位符

在此利用preparedStatement优化刚才的示例,代码如下:

package cn.com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UnitTest {
    @Test
    public void testJDBC2() {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
            String sql = "select * from student where studentid=? and studentname=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 4);
            preparedStatement.setString(2, "波少野结衣");
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resultSet = null;
            }

            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                preparedStatement = null;
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
        }

    }

}

至此,关于JDBC的基础知识就介绍完了,谢谢。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
御术:比能力更重要的是你的底层操作系统
成就那个初心,活着,活过,大多看起来「自律」的人只不过是习惯了用梦想来「自虐」。
969 0
2017系统系统分析师的通过人数与通过率探秘
2017系统系统分析师的通过人数与通过率探秘 估计系统分析师2017全国全年通过人数,不足100人,通过率不足10%。 附浙江省历年(2006---2016),系统分析师考试通过人数。 2016年,通过5人 2015年,通过9人 2014年,通过12人 2013年,通过5人; 2012年,通过...
1586 0
精美后台系统模板
以前不知道从网上哪里下载的后台HTML页面模板了,一直觉得很好看,反倒最近比较兴的那个ADMINLTE后台不好看。。。 111.png 222.png HTML源码下载:http://www.niunan.net/download/admin_ui_jingmei.zip
815 0
在后台中高效工作 – 后台任务
https://blogs.msdn.microsoft.com/windowsappdev_cn/2012/06/07/503/
473 0
+关注
小弟的谷哥
welcome
766
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载