第六章 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接口等。

  1. Driver Manager(驱动程序管理器)类:装载驱动程序,并为创建新的数据库连接提供支持。
  2. Connection接口:负责连接数据库,并为创建新的数据库连接提供支持。
  3. Statement接口:由Connection产生,负责执行SQL语句。
  4. ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。
  5. 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)

使用给定对象设置指定参数的值。

上一篇:wepack+sass+vue 入门教程(二)


下一篇:codeforces Gym 100187H H. Mysterious Photos 水题