第六章 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 驱 ...
随机推荐
- NHibernate教程(12)--延迟加载
本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...
- NHibernate学习教程(6)--事务Transactions
本节内容 事务概述 1.新建对象 [测试成功提交] [测试失败回滚] 2.删除对象 3.更新对象 4.保存更新对象 结语 上一篇我们介绍了NHibernate中的Insert, Update, De ...
- 标题:a++和++a的区别
以前我也是老搞不懂a++和++a的区别, 后来看了很多资料, 终于总结出来一条规律, 小白专用! 看完这个例子就懂了: 例1:$a = 8, 求 ++a + a++ - --a + a-- + ++a ...
- 七,UDP
那天朋友问我为什么有UDP Sever 和 UDP Client ,,我说:每个人想的不一样,设计上不一样...... 既然是面向无连接的,那么模块发数据就指定IP和端口号,,,为了能和多个UDP ...
- 团队作业2——需求分析&原型设计
Deadline: 2017-4-14 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目包括后文的三个方面 需求分析 原型设计 编码规范 晚交 - 0分 迟交两周以上 - ...
- 团队作业8——Beta 阶段冲刺4th day
团队作业8--Beta 阶段冲刺4rd day 一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 添加了支付功能,并且对支付功能进行了测试 (2)今天计划完成的工作(具 ...
- 201521123099《java程序设计》第五周学习总结
本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现 ...
- 201521123111 《Java程序设计》第1周学习总结
Java 第一周学习 1.刚开始学习对java还是陌生的,完全不清楚.通过刚开始的上课,有一点点的了解.刚开始可能相对比较基础,进程有点快,而且多媒体屏幕有点反光,所以还是蛮多不懂的.接下来应该好好努 ...
- 201521123017 《Java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 1.1 截图 1.2 4-2中fin ...
- 从GO内存模型与调用协议理解defer closure的坑
资料参考: 官网defer介绍: https://blog.golang.org/defer-panic-and-recover 深入解析go: 多值返回: https://tiancaiamao.g ...