第六章 JDBC

时间:2022-09-19 14:16:17

第一章 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》中文翻译系列 &lpar;37&rpar; ------ 第六章 继承与建模高级应用之独立关联与外键关联

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

  6. KnockoutJS 3&period;X API 第六章 组件&lpar;5&rpar; 高级应用组件加载器

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

  7. Java语言程序设计&lpar;基础篇&rpar; 第六章 方法

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

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

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

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

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

随机推荐

  1. linux环形buff模拟多线程信号量操作

    互斥锁mutex变量的值非0即1,只能用来表示两种状态下的临界资源.而信号量是与之类似的,用来表示可用资源的,区别在于,信号量可以表示多个可用资源的. --值为2的信号量也就是特殊的互斥锁了. 那么下 ...

  2. win10下安装Wampservice过程中遇到的问题及解决办法

    今天在电脑上装Wampserver的时候遇到了几个问题,启动Wampserver无法成功,一直显示橙色.若启动成功Wampserver的图标会显示绿色. 下面的是解决方法 安装 在浏览器中搜索Wamp ...

  3. VxWorks 6&period;9 内核编程指导之读书笔记 -- 多任务(二)

    VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...

  4. 注释PHP和html混合代码

    <?php if(false){ ?> any code <?php } ?>

  5. Flex移动皮肤开发&lpar;一&rpar;

    范例文件 mobile-skinning-part1.zip Flex 4.5提供的移动增强的皮肤特性,支持触摸交互.性能优良,并且考虑到了内存占用问题.尽管目前市场上有不少性能优异的设备,但典型的S ...

  6. 获取app崩溃信息的途径 iOS

    获取崩溃日志的几种方法: 1.当用户抱怨闪退时,你可以要求他让设备与iTunes同步,设备与电脑上的iTunes Store同步后,会将崩溃日志保存在电脑上(路径:Mac OS X:~/Library ...

  7. Learn c language the one day

    第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...

  8. HDU 4501

    超市里有n件他想要的商品.小明顺便对这n件商品打了分,表示商品的实际价值.小明发现身上带了v1的人民币,会员卡里面有v2的积分,而且他能免费拿k件.他想知道他最多能买多大价值的商品. 由于小明想要的商 ...

  9. ASP&period;NET Web API 2 之路由配置

    Ø  简介 ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的.不过,在平常的开发过程中,对它有基本的了解就足够了.因为我们主要关注点并不在 ...

  10. mysql兼容emoji表情存取

    emoji介绍 Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是字符)是一套起源于日本的12x12像素表情符号,由栗田穣崇(Shigetaka Kurit)创作,最早在 ...