JDBC定义了java与各种SQL数据库之间的编程接口,JDBC API是一个统一的标准应用程序接口,这样可以屏蔽异种数据库之间差异。
JDBC工作原理
JDBC与ODBC(Open Base Connectivity,开放式数据库连接)的作用非常类似,它在应用程序和数据库之间起到桥梁作用。ODBC使用得特别广泛,在java中还提供了JDBC-ODBC桥,能够在JDBC与ODBC之间进行转换,这样可以通过ODBC屏蔽不同种数据库之间的差异。
JDBC编程步骤
1.注册载入JDBC驱动程序
注冊载入驱动driver。也就是强制类载入:其注冊载入JDBC驱动有三种方法:
Class.forName(DriverName);
当中DriverName=Driver包名。Driver类名;
Oracle的DriverName=”oracle.jdbc.driver.OracleDriver”。
SQLServer的DriverName=“com.microsoft.jdbc.sqlserver.SQLServerDriver“。
MySql的DriverName=“com.mysql.jdbc.Driver“;
直接创建一个驱动对象:
new oracle.jdbc.driver.OracleDriver()。
Class.forName(DriverName).newInstance();
代码完毕两个功能:第一,把驱动程序载入到内存里;第二。把当前载入的驱动程序自己主动去DriverManager那注冊,DriverManager是JDBC规范中唯一的Java类。
2.得到连接对象Connection
要连接数据库,须要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
使用DriverManager的**getConnectin(Stringurl , String username , String password )**方法.
参数user是指连接数据库时使用的用户名;参数password是指连接数据库时的用户user的登录密码;参数info是作为连接参数的任意字符串标记/值对的列表,通常至少应该包括”user”和”password”属性;参数url是指连接数据库的URL。该方法返回一个连接,一般用一个连接对象接收返回对象。
DriverManager在JDBC规范中是类而不是接口。它是一个服务类,用于管理JDBC驱动程序,提供getConnection()方法建立应用程序与数据库的连接。当JDBC驱动程序载入到内存时,会自己主动向DriverManager注冊。此行代码发出连接请求,DriverManager类就会用注冊的JDBC驱动程序来创建到数据库的连接。
DriverManager.getConnection()是个静态方法。
DriverManager在java.sql包中。当我们调用sql包里不论什么一个类(包含接口)的不论什么一个方法时都会报一个编译时异常SQLException。这里我们使用一个try块后跟多个catch块解决。
1 2 3 4 5 6 7 8
| private static final String url="jdbc:mysql://localhost:3306/demo1"; private static final String user="root"; private static final String password="987654zmd"; try { Connection con = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); }
|
常用的数据库软件的url写法:
Oracle: jdbc:oracle:thin:@ip:1521:dbName;
MySql:jdbc:mysql://ip:3306:dbName;
SQLServer:jdbc:sqlserver://ip:1443;databaseName=dbName;
当使用本机ip地址连接时须要关闭防火墙。否则连接不上,使用localhost或127.0.0.1则不用关闭防火墙。
3.创建 Statement对象
1、运行静态SQL语句。通常通过Statement实例实现。
2、运行动态SQL语句。通常通过PreparedStatement实例实现。
3、运行数据库存储过程。通常通过CallableStatement实例实现。
详细实现方式:
Statement stmt = con.createStatement();
PreparedStatement pstmt=con.prepareStatement(sql);
CallableStatement cstmt =con.prepareCall(“{CALLdemoSp(? , ?
)}”) ;
4.运行sql语句
Statement接口提供了三种运行SQL语句的方法:executeQuery、executeUpdate 和execute
ResultSet executeQuery(String sqlString):
运行查询数据库的SQL语句。返回一个结果集(ResultSet)对象。
int executeUpdate(String sqlString):
用于运行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATETABLE和DROP TABLE等
execute(sqlString):
用于运行返回多个结果集、多个更新计数或二者组合的 语句。详细实现的代码:
ResultSet rs = stmt.executeQuery(“SELECT * FROM …”) ;
int rows = stmt.executeUpdate(“INSERTINTO …”) ; boolean flag =stmt.execute(String sql) ;
5.处理结果 两种情况
运行更新返回的是本次操作影响到的记录数。
运行查询返回的结果是一个ResultSet对象。
ResultSet包括符合SQL语句中条件的全部行。而且它通过一套get方法提供了对这些行中数据的訪问。使用结果集(ResultSet)对象的訪问方法获取数据:
1 2 3 4 5 6 7
| while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ;
}
|
6.关闭资源释放资源
操作完毕以后要把全部使用的JDBC对象全都关闭,以释放JDBC资源。关闭顺序和声明顺序相反:
- 关闭记录集
- 关闭声明
- 关闭连接对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static void close(Connection con, Statement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); rs = null; } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pstmt != null) { pstmt.close(); pstmt = null; } } catch (SQLException e) { e.printStackTrace(); } finally { if (con != null) { con.close(); } } } } }
|
一个简单的框架
1.Pools.java
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
| import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList;
public class Pools {
private static final String url="jdbc:mysql://localhost:3306/demo1"; private static final String driver="com.mysql.jdbc.Driver"; private static final String user="root"; private static final String password="987654zmd"; private static Connection con = null; private static LinkedList<Connection> pool = new LinkedList<Connection>(); static { try { Class.forName(driver); for(int i = 0 ; i < 10 ; i++) { pool.addLast(getPoolConnection()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
public static Connection getPoolConnection() { try { con = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } return con; }
public static Connection getConnection() { con = pool.removeFirst(); return con; }
public static void free(Connection con) { pool.addLast(con); } }
|
2.DBUtils
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
| import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
public class DBUtils extends Pools {
private static Connection con = null;
public static Connection getDBUtilsConnection() { con = getConnection(); return con; }
public static void close(Connection con, Statement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); rs = null; } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pstmt != null) { pstmt.close(); pstmt = null; } } catch (SQLException e) { e.printStackTrace(); } finally { if (con != null) { free(con); } } } } }
|
3.SqlExecute
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
| import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
public class SqlExecute extends DBUtils {
private static Connection con = null; private static PreparedStatement pstmt = null;
public boolean sqlExecuteUpdate(String sql, Object[] objects) { boolean b = false; con = getDBUtilsConnection(); try { pstmt = con.prepareStatement(sql); if (objects != null) { for (int i = 0; i < objects.length; i++) { pstmt.setObject(i + 1, objects[i]); } } int row = 0; row = pstmt.executeUpdate(); if (row > 0) { b = true; } } catch (SQLException e) { e.printStackTrace(); }finally { close(con, pstmt, null); }
return b; }
public ResultSet sqlExecutteQuery(String sql , Object[] objects) { con = getDBUtilsConnection(); ResultSet rs = null; try { pstmt = con.prepareStatement(sql); if(objects != null) { for(int i = 0 ; i < objects.length ; i++) { pstmt.setObject(i + 1, objects[i]); } } rs = pstmt.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; }
public void close(ResultSet rs) { close(con, pstmt, rs); } }
|
ps:一个老师写的,先放在这里吧