JDBC基本步骤

JDBC基本步骤

  JDBC定义了java与各种SQL数据库之间的编程接口,JDBC API是一个统一的标准应用程序接口,这样可以屏蔽异种数据库之间差异。

JDBC工作原理

  JDBC与ODBC(Open Base Connectivity,开放式数据库连接)的作用非常类似,它在应用程序和数据库之间起到桥梁作用。ODBC使用得特别广泛,在java中还提供了JDBC-ODBC桥,能够在JDBC与ODBC之间进行转换,这样可以通过ODBC屏蔽不同种数据库之间的差异。

JDBC编程步骤


1.注册载入JDBC驱动程序

  注冊载入驱动driver。也就是强制类载入:其注冊载入JDBC驱动有三种方法:

  1. 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“;

  2. 直接创建一个驱动对象:

      new oracle.jdbc.driver.OracleDriver()。

  3. 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

  1. ResultSet executeQuery(String sqlString):

      运行查询数据库的SQL语句。返回一个结果集(ResultSet)对象。

  2. int executeUpdate(String sqlString):

      用于运行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATETABLE和DROP TABLE等

  3. execute(sqlString):

      用于运行返回多个结果集、多个更新计数或二者组合的 语句。详细实现的代码:

    ResultSet rs = stmt.executeQuery(“SELECT * FROM …”) ;

    int rows = stmt.executeUpdate(“INSERTINTO …”) ; boolean flag =stmt.execute(String sql) ;

5.处理结果 两种情况

  1. 运行更新返回的是本次操作影响到的记录数。


  2. 运行查询返回的结果是一个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. 关闭连接对象
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;

/**
* 小型项目可以使用该连接池,如果涉及到大型项目,应该使用专业的是数据库连接池管理工具。
* C3P0
*
*/
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();
}
}

/**
* 创建连接尺寸装载数据库连接
* @return
*/
public static Connection getPoolConnection() {
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}

/**
* 从连接池中取出连接
* @return
*/
public static Connection getConnection() {
con = pool.removeFirst();
return con;
}

/**
* 把使用之后的数据库连接放回连接池中
* @param 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;

/**
* 获取数据库连接
*
* @return
*/
public static Connection getDBUtilsConnection() {
con = getConnection();
return con;
}

/**
* 关闭顺序 rs -- pstmt --con
*
* @param con
* @param pstmt
* @param rs
*/
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;

/**
* insert update delete
* @param sql
* @param objects
* @return
*/
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;
}

/**
* select
* @param sql
* @param objects
* @return
*/
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;
}

/**
* 关闭已经使用结束后的数据集
* @param rs
*/
public void close(ResultSet rs) {
close(con, pstmt, rs);
}
}

ps:一个老师写的,先放在这里吧

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×