第六章 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 驱 ...
随机推荐
- 移动端图片放大滑动查看-插件photoswipe的使用
最近在开发项目的时候,遇到一个需求,需要移动端实现放大查看图片的功能,然后我就在网上搜索了一下资料,看到了photoswipe这个插件,后来试了试,确实挺好用的,它可以实现手势放大缩小查看图片,左右滑 ...
- python--购物车优化
基本要求:用户入口1.商品信息存在文件里 2.已购商品.余额记录,长期保存, 即第一次启动是需要输入预算的,以后就拿剩下的钱买东西 商家入口 1.可以添加商品,删除商品,修改商品价格 2.按q可以退出 ...
- 如何在C++中产生随机数
C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand().不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随 ...
- 团队作业4——第一次项目冲刺(Alpha版本)4.27
一.当天站立式会议照片 本次会议主要内容:组长给大家分配新一步任务,分别汇报目前所完成的内容,完善昨日的解压接口代码,并做测试修正. 二.每个人的工 三.燃尽图 横坐标:工作日,以天为单位,一共七天, ...
- Swing-布局管理器之GridLayout(网格布局)-入门
注:本文内容源自于三十一.Java图形化界面设计——布局管理器之GridLayout(网格布局),笔者在学习过程中根据自身理解修改了部分代码. 网格布局特点: l 使容器中的各组件呈M行×N列的网格 ...
- 201521123055 《Java程序设计》第8周学习总结
1. 本章学习总结 2. 书面作业 Q1.List中指定元素的删除(题目4-1) public static List<String> convertStringToList(String ...
- 预防黑客入侵 防黑必学的cmd命令vs网络安全
这些命令又可*********三类:网络检测(如ping).网络连接(如telnet)和网络配置(如netsh).前面两种相对简单,本文只介绍两个网络配置工具.自带的关于网络的命令行工具很多,比如大家 ...
- 201521123055 《Java程序设计》第12周学习总结
1. 本章学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. Q ...
- 201521123057 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 1.字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) ...
- JAVA课程设计-购物车 (201521123101 柏清晔)
1.团队课程设计博客链接 /[团队博客链接]http://www.cnblogs.com/yayaya/p/7062197.html 2.个人负责模板或任务说明 1.连接数据库 2.修改购物车的jsp ...