第一章 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 aio nio bio

    转自:http://blog.csdn.NET/liuxiao723846/article/details/45066095 Java中的IO主要源自于网络和本地文件 IO的方式通常分为几种,同步阻塞 ...

  2. 团队作业4——第一次项目冲刺 FiRsT DaY

    项目冲刺--first blood 今天是阳光明媚的一天[明明是阴天好吗= =],今天是心情愉悦的一天[每天都要提交博客高兴个水水哦-3-] 天霸动霸.tua小队迎来了第一敏捷冲刺,小伙伴们是时候打起 ...

  3. 201521123068 《java程序设计》 第7周学习总结

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

  4. 201521123015 《Java程序设计》第3周学习总结

    本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点. 书面作业 Q1.代码阅读 publi ...

  5. js的原型

    在讲js的原型之前,必须先了解下Object和Function. Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是 ...

  6. Sql Server——基础

    前言: 在了解数据库之前,我们应该首先了解一下和数据库有关的知识,如:什么是数据,什么又是数据库等.  数据:描述事物的符号记录称为数据,它是数据库中存储的基本对象.  数据库(Datebase):数 ...

  7. Spring02-AOP

    1,动态代理,指的是通过一个代理对象创建需要的业务对象,然后在这个代理对象中统一进行各种操作. 步骤: 1)写一个类实现InvocationHandler接口: 2)创建要代理的对象 2,创建一个简单 ...

  8. 部署maria数据库到linux(源码编译安装)

    maria数据库是mysql原作者另外开发的一个版本,使用方法和mysql一样,可以直接用mysql的库连接. 在这下载包并解压: https://mariadb.org/download/ 建立数据 ...

  9. mysql 1093错误

    1093错误:修改一个表的时候子查询不能是同一个表 解决办法:把子查询再套一层,变成原来表的孙子查询就可以了 例如: INSERT INTO gg SET id3=(SELECT c.a+1 FROM ...

  10. 纯css隐藏移动端滚动条解决方案(ios上流畅滑动)

    纯css隐藏移动端滚动条解决方案(ios上流畅滑动) html代码展示(直接复制代码保存至本地文件运行即可): <!DOCTYPE html> <html lang="en ...