JDBC
一、JDBC概述:
JDBC (Java Database Connectivity)指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。
二、JDBC的功能
①加载JDBC驱动程序
②建立与数据库的连接
③使用SQL语句进行数据库的操作并处理结果
④关闭相关连接
三、JDBC的驱动程序和体系结构
3.1、驱动程序
JDBC主要提供两个层次的接口,分别是面向程序开发人员的JDBC API(JDBC应用程序接口)和面向系统底层的JDBC Drive API(JDBC驱动程序接口)

3.2、体系结构
DriverManager :依据数据库的不同,管理JDBC驱动
Connection :负责连接数据库并担任传送数据的任务
Statement :由Connection 产生、负责执行SQL语句
ResultSet:负责保存Statement执行后所产生的查询结果

3.21、DriverManager
java.sql.DriverManager用来装载驱动程序,并创建新的数据连接。关键方法:
getConnection():
使用给定的url建立一个数据库连接,并返回一个Connection接口对象;
3.22、Connection
java.sql.Connection接口完成对某一指定数据库的连接。关键方法:
createStatement():在本连接上生成一个Statement对象,该对象可对本连接的特定数据库发送SQL语句;
**commit()**:提交数据库上当前的所有待提交的事务;
close():关闭当前的JDBC数据库连接
3.33、Statement
java.sql.Statement接口用于执行 SQL 语句并将数据检索到 ResultSet 中 。关键方法:
executeQuery(String sql):执行一条SQL查询语句,返回查询结果对象;
executeUpdate(String sql):执行一条SQL插入、更新、删除语句,返回操作影响的行数;
execute(String sql):执行一条SQL语句
3.34、ResultSet
java.sql.ResultSet接口用于保存数据库结果集,通常通过执行查询数据库的语句生成
java.sql.ResultSet接口对于给定声明获得结果的存取控制。在这些接口中提供了非常丰富的方法,可以使用这种方法对数据库进行各种操作
四、JDBC访问数据库基本步骤
①导入包
②加载并注册驱动程序
③创建Connection对象
④创建Statemen对象
⑤执行语句
⑥关闭资源

4.1、导入包
直接
或者
1 2 3 4 5
| import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet;
|
4.2、加载并注册驱动程序
JDBC驱动由数据库厂商提供

4.21、JDBC_ODBC桥连方式
在个人开发与测试中使用JDBC-ODBC桥连方式
4.22、纯Java驱动方式
在生产型开发中,推荐使用纯Java驱动方式
由JDBC驱动直接访问数据库
优点:100% Java,快又可跨平台
缺点:访问不同的数据库需要下载专用的JDBC驱动

4.221、使用纯Java驱动方式进行直连
1、下载数据库厂商提供的驱动程序包
2、将驱动程序包引入工程中(需要加载导入的jar包)
3、编程,通过纯Java驱动方式与数据库建立连接
1 2 3 4 5 6
| Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Class.forName("com.mysql.jdbc.Driver");
Class.forName(“oracle.jdbc.driver.OracleDriver");
|
DBMS |
类包名 |
驱动名称 |
URL地址 |
SQL Server |
sqljdbc4.jar |
com.microsoft.sqlserver.jdbc.SQLServerDriver |
jdbc:sqlserver://localhost:1433;databaseName=数据库名称 |
MySQL |
mysql-connector-java-5.0.16-ga-bin.jar |
com.mysql.jdbc.Driver |
jdbc:mysql://localhost:3306/数据库名称 |
ORCLE |
class12.jar |
oracle.jdbc.driver.OracleDriver |
jdbc:oracle:thin:@dssw2k01:1521:数据库名称 |
DB2 |
db2jcc.jar |
com.ibm.db2.jdbc.net.DB2Driver |
jdbc:db2://localhost:6789/数据库名称 |
食用方法:
1 2 3 4 5 6 7 8 9
| try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); } catch (ClassNotFoundException e) { System.out.println("加载数据库驱动时抛出异常内容如下:"); e.printStackTrace(); }
|
4.3、创建Connection对象
食用方法:
DriverManager类的静态方法getConnection(),将返回一个数据库连接(Connection对象)
1
| Connection connection = DriverManager.getConnection(url,userName,password);
|
4.4、创建Statement对象
食用方法:
使用JDBC执行SQL命令前,必须先创建Statement对象。调用Connection对象的createStatement( )方法,该方法返回一个Statement对象
1
| Statement statement = connection.createStatement();
|
Statement接口提供了3种执行语句的方法
方法 |
功能 |
executeQuery(String sql) |
将返回一个ResultSet型的结果集,用来执行SELECT查询语句 |
executeUpdate(String sql) |
用于执行INSERT、UPDATE或DELETE语句。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。 |
execute(String sql) |
返回类型boolean,代表执行此语句是否有resultset 返回,有就是ture。用于执行返回多个结果集、多个更新计数或二者组合的语句 |
4.5、执行语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int n=statement.executeUpdate(sql); System.out.println("更新了"+n+"行");
resultSet = statement.executeQuery(sql); while (resultSet.next()) {
System.out.print("学号:" + resultSet.getString("sno") + "\t"); System.out.print("姓名:" + resultSet.getString("sname") + "\t"); System.out.print("性别:" + resultSet.getString("sex") + "\t"); System.out.print("年龄:" + resultSet.getInt("age") + "\t"); System.out.print("班级:" + resultSet.getInt("sclass") + "\t"); System.out.println(); }
|
4.6、关闭资源
1 2 3 4 5 6
|
resultSet.close(); statement.close(); connection.close();
|
代码实现
一、更改Update
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;
public class TestUpdate { public static void main(String[] args) {
String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8"; String userName="root"; String password="root"; Connection connection=null; Statement statement=null; try { Class.forName("com.mysql.jdbc.Driver"); try { connection = DriverManager.getConnection(url,userName,password); statement = connection.createStatement(); String sql="delete from student where sname='张三丰'"; int n=statement.executeUpdate(sql);
System.out.println("更新了"+n+"行"); } catch (SQLException e) { e.printStackTrace(); System.out.println("创建连接失败,检查url,userName,password以及SQL语句"); } } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("加载驱动失败,检查驱动字符串,以及是否导入jar包"); }finally { if(statement!=null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
|
二、查询Query
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| package Test;
import javax.xml.transform.Result; import java.sql.*;
public class TestQuery { public static void main(String[] args) throws SQLException { String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8"; String userName = "root"; String password = "root"; Statement statement = null; Connection connection = null; ResultSet resultSet=null;
try { Class.forName("com.mysql.jdbc.Driver"); try { connection = DriverManager.getConnection(url, userName, password); statement = connection.createStatement(); String sql = "select * from student"; resultSet = statement.executeQuery(sql); while (resultSet.next()) {
System.out.print("学号:" + resultSet.getString("sno") + "\t"); System.out.print("姓名:" + resultSet.getString("sname") + "\t"); System.out.print("性别:" + resultSet.getString("sex") + "\t"); System.out.print("年龄:" + resultSet.getInt("age") + "\t"); System.out.print("班级:" + resultSet.getInt("sclass") + "\t"); System.out.println(); } } catch (SQLException e) { e.printStackTrace(); System.out.println("创建连接失败,检查url,userName,password以及SQL语句"); } } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("加载驱动失败,检查驱动字符串,以及是否导入jar包"); } finally { if (resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
|
三、封装

路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| //封装类 package Util;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;
public class DBUtil {
private static String driverClass; private static String url; private static String userName; private static String password; static { Properties p = new Properties(); //加载读取文件 try { FileInputStream is = new FileInputStream(new File("src/Util/db.properties")); try { p.load(is); driverClass=p.getProperty("driver"); url=p.getProperty("url"); userName=p.getProperty("user"); password=p.getProperty("pwd"); try { Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() { Connection conn=null; try { conn=DriverManager.getConnection(url,userName,password); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void close(ResultSet rs,Statement st,Connection conn) { try { if(rs!=null) { rs.close(); } if(st!=null) { st.close(); } if(conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { Connection conn=DBUtil.getConnection(); System.out.println(conn); DBUtil.close(null,null, conn); } }
|
1 2 3 4 5
| //封装文件db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8 user=root pwd=root
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import Util.DBUtil; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
public class TestUtil { public static void main(String[] args) { Statement statement = null; ResultSet resultSet = null; Connection connection = DBUtil.getConnection(); try { statement = connection.createStatement(); String sql="select * from student"; resultSet = statement.executeQuery(sql); while (resultSet.next()) {
System.out.print("学号:" + resultSet.getString("sno") + "\t"); System.out.print("姓名:" + resultSet.getString("sname") + "\t"); System.out.print("性别:" + resultSet.getString("sex") + "\t"); System.out.print("年龄:" + resultSet.getInt("age") + "\t"); System.out.print("班级:" + resultSet.getInt("sclass") + "\t"); System.out.println(); } } catch (SQLException e) { e.printStackTrace(); }finally { DBUtil.close(resultSet,statement,connection); }
} }
|
四、Statement处理静态SQL
PreparedStatement 就是带有占位符的SQL 语句,数据库对他们事先进行编译,因此,客户端需要做的只是传送占位符位置所需要的数据。
而普通Statement的SQL语句,只有在程序运行时才对他们进行编译,因此PreparedStatement运行的速度更快
Statement处理静态的SQL语句主要分为3种对象:
Statement: 基本语句
PreparedStatement: 预编译语句
CallableStatement:存储过程

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| package Test;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
import Util.DBUtil;
public class TestPrepare {
public static void main(String[] args) { Connection conn =null; PreparedStatement pt =null; ResultSet rs =null; try { conn=DBUtil.getConnection(); String sql="select * from student where age=?"; pt = conn.prepareStatement(sql); pt.setObject(1, 20); rs = pt.executeQuery(); while(rs.next()) { System.out.print("学号:"+rs.getString("sno")+"\t"); System.out.print("姓名:"+rs.getString("sname")+"\t"); System.out.print("性别:"+rs.getString("sex")+"\t"); System.out.print("年龄:"+rs.getInt("age")+"\t"); System.out.print("班级:"+rs.getInt("sclass")+"\t"); System.out.println(); }
DBUtil.close(rs,pt, conn); } catch (SQLException e) { e.printStackTrace(); } } }
|