第一章 JDBC

一.JDBC的简介

1.什么是JDBC

JDBC是java数据库连接(java database connectivity)技术的简称,它充当了java应用程序与各个不同数据库之间进行对话的媒介,它可以把数据持久保存。

2.什么是持久化

持久化是将程序中的数据在瞬间时状态和持久状态间转换的机制,如把内存中的数据,不能保存的,永久的保存在数据库中。

3.JDBC API

JDBC是由一组使用java语言编写的类和接口组成,可以为多种关系数据库提供统一访问。Sun公司(现在被Oracle收购)提供了JDBC的接口规范—JDBC API。

二.JDBC的工作原理

Java应用程序

 

JDBC API

 

JDBC Driver Manager

 

JDBC 驱动

 

各种数据库

1.JDBC Driver Manager

JDBC Driver Manager(驱动程序管理器)由Sun公司提供,负责管理各种不同的JDBC驱动,把java应用程序连接到相应的JDBC 驱动程序上。它位于JDK的java.sql包中。

2.JDBC驱动

JDBC驱动是由各个数据厂商或第三方中间厂商提供,负责连接各种不同的数据库,不同的数据库则需要不同的JDBC驱动。

三.JDBC API的介绍

JDBC API由Sun公司提供,其中提供了java应用程序与各个不同数据库交互的标准接口,如Connection(连接)接口,Statement接口,ResultSet(结果集)接口,PreparedStatemrnt接口等。

  1. Driver Manager(驱动程序管理器)类:装载驱动程序,并为创建新的数据库连接提供支持。
  2. Connection接口:负责连接数据库,并为创建新的数据库连接提供支持。
  3. Statement接口:由Connection产生,负责执行SQL语句。
  4. ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。
  5. PreparedStatement接口:Statement的子接口,同样由Connection产生,执行SQL语句。与Statement相比,具有高安全性,高性能,高可读性,高可维护性的优点。

四.JDBC 访问数据库的步骤

1.加载JDBC驱动

使用Class.forName( )方法将给定的JDBC驱动类加载到java虚拟机中。若系统中不存在给定的类,则会引发异常,异常类型为 ClassNotFoundException。语法:

Class.forName(“JDBC驱动类的名称”)

2.与数据库建立连接

使用DviverManager类的getConnection( )方法建立连接,语法:

Connection conn=DviverManager.getConnection(数据库连接字符串,数据库用户名,密码)

3.发送SQL语句,并得到返回结果

由Connection连接创建Statement结构的对象,并将SQL语句传递给它所连接的数据库,如果是查询操作,将返回类型为ResultSet的结果集,如果是其他,将返回别的类型值。语法:

Statement  stet=conn.createStatement();

         ResultSet se=stet.executeQuery(“SELECT `id`,`name`,`sex` FROM `master`”);

4.处理返回结果

处理返回结果主要是针对查询操作的结果集,通过循环取出结果集中每条记录并做相应处理。语法:

While (se.next() ){

         Int id=se.getInt(`id`);

         String name=se.getString(2);

         String sex=se.getString(`sex`);

};

五.连接数据库

1.JDBC—ODBC桥连方式连接数据库

Java应用程序—》JDBC API —》JDBC ODBC桥—》ODBC API—》ODBC层—》DB server(数据库)

1.驱动的下载

下载windows ODBC 的安装程序(http://dev.mysql.com/downloads/connectior/odbc)从中选择与操作系统相匹配的驱动版本下载。例如,windows7 32位操作系统,需要下载的版本为mysql-connector-odbc-5.3.6-win32.msi

2.配置mysql ODBC数据源

不同的操作系统配置的位置稍有不同,以windows7为例:

打开控制面板—》系统和安全—》管理工具—数据源ODBC—》单机“添加”进行配置:

1):data source name:数据源名称,如mysql

2):Description:数据源的描述信息

3):Server:服务器的IP地址

4):User:用户名

5):Password:密码

6):Database:连接的数据库

JDBC的驱动类是“sun.jdbc.odbc.jdbcOdbcDriver”。

数据库的连接字符串是“jdbc:odbc:myDB”。

这种连接方式可以访问所有的ODBC可以访问的数据库,但是只能用于windows平台服务器,可移植性不好,一般很少使用,只作为了解。

2.使用纯java方式连接数据库

纯java驱动方式由JDBC 驱动直接访问数据库,驱动程序完全由java语言编写,优点是运行速度快,可以跨平台。

缺点是JDBC驱动程序一般由厂商提供,这类JDBC驱动只对应一种数据库,甚至只对应某个版本的数据库,非常由局限性。

工作原理:java应用程序—》JDBC API—》JDBC驱动—》DB server

例:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import org.apache.log4j.Logger;

public class Test2 {

private static Logger logger = Logger.getLogger(Test2.class.getName());

public static void main(String[] args) {

Connection con = null;

// 1.加载驱动

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

logger.error(e);

}

// 2.建立连接

try {

con = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/epet" +

"?useUnicode=true&Encoding=utf-8",

"root", "root");

System.out.println("建立连接成功!");

} catch (SQLException e) {

logger.error(e);

} finally {

// 3.关闭连接

try {

if (con != null) {

con.close();

System.out.println("关闭连接成功!");

}

} catch (SQLException e) {

logger.error(e);

}

}

}

}

六.Statement接口和ResultSet接口

Connection对象创建Statement对象,

1.Connection接口常用的方法

方法名称

作用

Void close( )

关闭连接,立即释放数据刻和JDBC资源

Statement createStatement( )

创建一个Statement对象来将sql语句放送到数据库

PreparedStatement PreparedStatement(String  sql)

创建一个PreparedStatement对象来将sql语句放送到数据库

Boolean isClose()

查询Connection对象是否已经被关闭

2.Statement接口常用的方法

方法名称

作用

ResultSet executeQuery(String sql)

执行SQL查询并返回ResultSet对象

int executeUpdate(String sql)

执行插入,删除,更新的操作,返回受影响的行数

Boolean execute (String sql)

可以执行任意的SQL语句,若结果为ResultSet对象返回为true,否则返回false

3.ResultSet接口常用的方法

方法名称

作用

Boolean next( )

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

Boolean previous( )

将光标从当前位置向上移动一行

Void close( )

关闭ResultSet对象

Int getInt(int columnIndex)

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

Int getInt(String columnLabel)

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

Int getFloat(int columnIndex)

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

Int getFloat(String columnLabel)

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

Int getString(int columnIndex)

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

Int getString(String columnLabel)

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

Int getRow()

得到光标当前所指行的行号

Boolean absolute(int row)

光标移动到row指定的行

七.PreparedStatement接口

1.为什么要使用PreParedStatement

与Statement相比,具有高安全性,高性能,高可读性,高可维护性的优点。

例:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Scanner;

import org.apache.log4j.Logger;

public class Test6 {

private static Logger logger = Logger.getLogger(Test6.class.getName());

public static void main(String[] args) {

Connection con = null;

PreparedStatement st=null;

ResultSet rs=null;

//根据控制台提示输入用户账号和密码

Scanner input=new Scanner(System.in);

System.out.println("\t\t宠物主人登陆");

System.out.print("请输入姓名:");

String name=input.next();

System.out.print("请输入密码:");

String pwd=input.next();

// 1.加载驱动

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

logger.error(e);

}

// 2.建立连接

try {

con = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/epet",

"root", "root");

System.out.println("建立连接成功!");

//3.插入狗狗的信息到数据库

String sql="SELECT * FROM master " +

"where name='"+name+"' and password='"+pwd+"'";

st=con.prepareStatement(sql);

st.setString(1, name);

st.setString(2, pwd);

rs=st.executeQuery();

if(rs.next()){

System.out.println("登陆成功!欢迎您!");

}else{

System.out.println("登陆失败!");

}

} catch (SQLException e) {

logger.error(e);

} finally {

// 4.关闭连接

try {

if(rs!=null){

rs.close();//关闭结果集对象

}

} catch (SQLException e2) {

logger.error(e2);

}

try {

if(st!=null){

st.close();//关闭prepareStatement对象

}

} catch (SQLException e1) {

logger.fatal(e1);

}

try {

if (con != null) {

con.close();//关闭数据库连接对象

System.out.println("关闭连接成功!");

}

} catch (SQLException e) {

logger.error(e);

}

}

}

}

如上例所述,如果用户输入错误的姓名和密码,只要在密码结尾加入“or ‘1’=’1”,那么执行的SQL语句实际变成“SELECT * FROM master where name='"+name+"' and password='"+pwd’”or ‘1’=’1’,那么SQL语句也是可以通过的,因此很不安全。

2.PraParedStarement接口的常用方法

方法名称

作用

Boolean execute ( )

可以执行任意的SQL语句,若结果为ResultSet对象返回为true,否则返回false

Result executeQuery()

在此PreParedStatement对象中执行SQL查询,返回查询结果ResultSet对象

Int executeUpdate()

执行(DML)插入,删除,更新的操作,返回受影响的行数

Void setInt(int Index,int x)

将指定参数设置给定java int值。设置其他类型参数的方法与此类似,如setFloat(int Index,float x)等。

Void setObject(int index,Objext x)

使用给定对象设置指定参数的值。

第六章 JDBC的更多相关文章

  1. Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  2. 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(一)

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第六章 Realm及相关对象 1.用户.角色.权限的关系 用户和角 ...

  3. 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章  继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...

  6. KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器

    无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...

  7. Java语言程序设计(基础篇) 第六章 方法

    第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...

  8. 读《编写可维护的JavaScript》第六章总结

    第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...

  9. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

随机推荐

  1. !JS实战之随机像素图

    JavaScript实例分享之----画随机像素图.随机像素图(作者自己取得名字)指的是一张图片上每一个像素的颜色都是随机的.此时应该能联想到这幅图多么眼花缭乱,好吧,我们用JS来实现它的原因是JS很 ...

  2. 扫雷游戏制作过程(C#描述):第五节、菜单操作(续)

    前言 这里给出教程原文地址. 该项目已经放在github上托管. 发布版已经分享到百度网盘 菜单操作(续) 接着节前一章节的内容,我们继续完善菜单栏的功能. 我们首先,先完善Rank的选项,我们希望我 ...

  3. 201521123005 《java程序设计》 第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 Q1List中指定元素的删除(题目4 ...

  4. 学号:201521123116 《java程序设计》第六周学习总结

    1. 本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2.书面作业 1.1.Object对象中的clone方法是 ...

  5. 201521123101 《Java程序设计》第2周学习总结

    1. 本周学习总结 使用码云保存管理自己的代码: 学习String和Array: 继续对JAVA的探索,希望以后能在编程上更顺畅一些 2. 书面作业 1.使用Eclipse关联jdk源代码(截图),并 ...

  6. 201521123119《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1.常用异常 题目5-1 Q1.1 截图你的提交结果(出现学号) Q1.2 ...

  7. JS中有关分支结构、循环结构以及函数应用的一些简单练习

    案例一:搬桌子    年龄大于七岁男女都可以搬桌子,年龄小于七岁大于五岁的男生可以搬桌子: var num =parseInt(prompt("请输入你的年龄")) var sex ...

  8. 史上最全CentOS安装教程,图文结合

    这是我最近整理的一份最全的CentOS安装步骤,亲自测试步骤,步步都有截图,步骤清晰.按此教程可轻松装机,并且安装成功的主机能访问外部网络. 闲话不说,首先介绍一下本教程用到工具: VMware Wo ...

  9. java进程/线程;堆和栈;多线程

    一.进程和线程 进程:在内存中运行的应用程序,一个exe是一个进程. 如:ps -exf  可以查看各个应用的进程,其中ppid为父进程: ps aux | egrep '(cron|syslog)' ...

  10. 获取OrangePI板子CPU温度

    cat /sys/class/thermal/thermal_zone0/temp 读取这个文件可返回CPU温度,我看网上的说法说是要除以1000才是温度,但我这返回的数字是41...