第一章 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) |
使用给定对象设置指定参数的值。 |