第一章 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. 串口数据缓存java版

    接触串口很久了,一直以来将都是将串口读取出来的数组转换成字符串通过string.contains()查找是否包涵目标数组,自己感觉low到爆,所以写了一个byte-buffer,测试还是蛮好用的.希望 ...

  2. NOPI读xls文件写到txt中(NPOI系列二)

    private void button2_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); //找 ...

  3. 个人作业2——必应词典APP分析

    第一部分:调研.评测 1.刚刚打开必应词典的时候,它给我的第一反应就是界面美观,最上面是一个查询框,下面有一些经典的句子.单词以及一些精选的文章,所有的功能都可以一目了然,看一眼就知道要怎么去使用,这 ...

  4. 【集美大学1411_助教博客】alpha阶段后 成绩

    团队作业7 成绩(助教对团队排名) 团队名称 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 全组讨论的照片 团队成员在Alpha阶段的角色和具体贡献 合计 排 ...

  5. 【Beta】阶段 第三次Daily Scrum Meeting

    每日任务 ·1.本次会议为第三次 Meeting 会议 ·2.本次会议在周三上午9:40召开,会议时间为10分钟 一.今日站立式会议照片 二.每个人的工作(有work item的ID) 三.工作中遇到 ...

  6. 201521123114 《Java程序设计》第7周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 Q1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public b ...

  7. 201521123090《Java程序设计》第6周学习总结

    本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对 ...

  8. 201521123024 《Java程序设计》第4周学习总结

    1. 本周学习总结 2. 书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 2.面向对象设计(大作业1,非常重要) 2.1 将在网上商 ...

  9. 控制结构(8) 线性化(linearization)

    // 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...

  10. python学习笔记1.2

    在python中%的用处是求余数,而不是除数.