第一章 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接口等。
- Driver Manager(驱动程序管理器)类:装载驱动程序,并为创建新的数据库连接提供支持。
- Connection接口:负责连接数据库,并为创建新的数据库连接提供支持。
- Statement接口:由Connection产生,负责执行SQL语句。
- ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。
- 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的更多相关文章
-
Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
-
2017.2.7 开涛shiro教程-第六章-Realm及相关对象(一)
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第六章 Realm及相关对象 1.用户.角色.权限的关系 用户和角 ...
-
精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...
-
《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章 继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...
-
《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13 在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...
-
KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器
无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...
-
Java语言程序设计(基础篇) 第六章 方法
第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...
-
读《编写可维护的JavaScript》第六章总结
第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...
-
第六章第一个linux个程序:统计单词个数
第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数. 第 1 步:建立 Linu x 驱 ...
随机推荐
-
linux环形buff模拟多线程信号量操作
互斥锁mutex变量的值非0即1,只能用来表示两种状态下的临界资源.而信号量是与之类似的,用来表示可用资源的,区别在于,信号量可以表示多个可用资源的. --值为2的信号量也就是特殊的互斥锁了. 那么下 ...
-
win10下安装Wampservice过程中遇到的问题及解决办法
今天在电脑上装Wampserver的时候遇到了几个问题,启动Wampserver无法成功,一直显示橙色.若启动成功Wampserver的图标会显示绿色. 下面的是解决方法 安装 在浏览器中搜索Wamp ...
-
VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)
VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...
-
注释PHP和html混合代码
<?php if(false){ ?> any code <?php } ?>
-
Flex移动皮肤开发(一)
范例文件 mobile-skinning-part1.zip Flex 4.5提供的移动增强的皮肤特性,支持触摸交互.性能优良,并且考虑到了内存占用问题.尽管目前市场上有不少性能优异的设备,但典型的S ...
-
获取app崩溃信息的途径 iOS
获取崩溃日志的几种方法: 1.当用户抱怨闪退时,你可以要求他让设备与iTunes同步,设备与电脑上的iTunes Store同步后,会将崩溃日志保存在电脑上(路径:Mac OS X:~/Library ...
-
Learn c language the one day
第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...
-
HDU 4501
超市里有n件他想要的商品.小明顺便对这n件商品打了分,表示商品的实际价值.小明发现身上带了v1的人民币,会员卡里面有v2的积分,而且他能免费拿k件.他想知道他最多能买多大价值的商品. 由于小明想要的商 ...
-
ASP.NET Web API 2 之路由配置
Ø 简介 ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的.不过,在平常的开发过程中,对它有基本的了解就足够了.因为我们主要关注点并不在 ...
-
mysql兼容emoji表情存取
emoji介绍 Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是字符)是一套起源于日本的12x12像素表情符号,由栗田穣崇(Shigetaka Kurit)创作,最早在 ...