第六章 JDBC
第一章 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 驱 ...
随机推荐
- html5中的video标签和audio标签
不管是否承认,flash早已不像过往那样如日中天了.亚马逊全面放弃flash.苹果放弃flash.安卓也放弃了移动端的flash支持.事实上flash已经不太适合web开发了,因为HTML5中的vid ...
- MySQL(四)--蠕虫复制、查询
1 蠕虫复制 蠕虫复制:从已有的数据中去获取数据,然后将数据又进行新增操作,数据成倍增加. 表创建高级操作:从已有创建新表(复制表结构) create table 表名 like 数据库.表名; 蠕虫 ...
- 2016-2017-2 《Java 程序设计》课堂实践项目
目录 基本工具 基础内容 Hello World 和 模块分解 数组的使用 命令行参数 递归 分支语句 String类的使用 类的定义与测试 多态 IO与异常 数据库 网络与安全 数据结构应用 And ...
- Beta的计划和人员的变动
一.新的成员和组长是否重选: 刘光华:先加入的一个帅哥,乐于助人,编码基础不是很好,但是有一颗热爱学习的心,会积极主动的完成自己的任务的,一句话宣言:我们的团队是最棒的! 程志铭:做事认真负责,工作脚 ...
- 201521123092《java程序设计》第五周学习总结
1.本周学习总结 #1.1 尝试使用思维导图总结有关多态与接口的知识点. 2.书面作业 #1.代码阅读:Child压缩包内源代码##1.1 com.parent包中Child.java文件能否编译通过 ...
- 201521123089 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 总结: (1)类名的首字母一定要大写. (2)制类型转换:类强制转换为子类时只有当引用类型真 ...
- 201521123115 《Java程序设计》第1周学习总结
1. 本周学习总结 之前一直没有用心学,这周上课虽然认真但还是太多不懂加上还要补考没有时间来消化所以很多都是囫囵吞枣,希望能够赶快补上把. 知道了java的前世今生,JVM/JRE/JDK,JVM就是 ...
- java第十一次作业
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synch ...
- Spring4 customEditors
Spring4.0版本以后customEditors属性为Map<Class<?>, Class<? extends PropertyEditor>>,所以用key ...
- jmeter测试HTTP请求
HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GE ...