JDBC的使用

JDBC

JDBC全称为java database connectivity,是sun公司指定的java数据库连接技术的简称。

他是sun公司和数据库开发商共同开发出来的独立于DBMS的应用程序接口,它为java程序员进行数据库编程提供了统一的API。

JDBC实际上有两组API,一组面向java应用程序开发人员,另一组是面向数据库驱动程序开发人员的,一般都是数据驱动程序开发人员利用后面一组API开发出供应程序开发人员使用的API。

核心的类和接口

我们需要熟悉包java.sql.*中定义的类(class),接口(interface),例外(expection),并且能够灵活使用他们,就能够发挥出JDBC强大的功能。

  1. java.sql.DriverManager用来加载不同数据库厂商的JDBC驱动,并为创建新的数据库连接提供支持
  2. java.sql.Driver指定数据库的驱动入口,DriverManager将通过该类作为连接数据的参数
  3. java.sql.Connection完成针对某指定数据库的连接功能
  4. java.sql.Statement在一个已经建立的连接中,作为SQL语句执行的容器,它有两个子类:
    • java.sql.CallableStatement 用于执行数据库中已经创建好的存储过程。
    • java.sql.preparedStatement用于执行预编译的SQL语句。
  5. java.sql.ResultSet用于存储执行特定SQL语句后返回的结果集。

JDBC基本使用过程

如果是增删改, 可不使用ResultSet

  1. 加载驱动程序类(可省略, 推荐写上),这里加载mysql的jdbc驱动, 即初始化Driver中的静态代码块

    class.forName("com.mysql.jdbc.Driver")

  2. 建立连接

    connection conn = DriverManager.getConnection(url,"user","password");

  3. 通过这个连接连接sql语句执行的容器

    Statement statement = conn.createStatement();

  4. 建立sql语句

    String sql = "select * from table1";

  5. 利用前面的sql容器执行刚建立的sql语句,并把结构返回到结果集对象中。

    ResultSet rs = statement.executeQuery(sql);

  6. 分析获取的查询结果

简单的查询案例

要查询的表 (user):

id (int 主键自增) name (varchar) money (double)
1 tom 5000

代码:

/**
 * JDBC快速入门程序: 查询jt_db.account表中的所有数据
 */
public class TestJdbc02 {
    @Test
    public void testFindAll() {
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            // 1. 注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 获取数据库连接(导入java.sql.Connection 包)
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf8",
                    "root",
                    "123456");
            // 3. 获取传输器
            stat = conn.createStatement();
            // 4. 执行SQL, 返回结果
            String sql = "select * from account";
            rs = stat.executeQuery(sql);
            // 5. 处理结果(打印到控制台)
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                double money = rs.getDouble("money");
                System.out.print(id + ", " + name + ", " + money);
                System.out.println();
            }
            System.out.println("TestJdbc.testFindAll");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 6. 释放资源(原则: 越晚获取的越先关闭!)
            if (rs != null) { // 如果rs为null, 则不需要关闭, 反之, 不必关闭对象
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                } finally {
                    rs = null;
                }
            }
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                } finally {
                    stat = null;
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }
    }
}

注意关闭顺序, 先后循序为: 关闭ResultSet -> 关闭Statement -> 关闭Connection

结果:

1, tom, 5000

JDBC工具类

为了简化开发, 我们可以提取一个JDBC的工具类, 方便获取Connection连接对象和关闭操作

代码如下:

/** JDBC工具类 */
public class JdbcUtil {
	// 获取连接对象
	public static Connection getConn() throws Exception{
		Class.forName( "com.mysql.jdbc.Driver" );
		Connection conn = DriverManager.getConnection(
				"jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf-8",
				"root", 
				"123456");
		return conn;
	}
	
    // 释放资源
	public static void close(Connection conn, 
			Statement stat, ResultSet rs){
		if(rs != null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally{
				rs = null;
			}
		}
		if(stat != null){
			try {
				stat.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally{
				stat = null;
			}
		}
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally{
				conn = null;
			}
		}
	}
}

新增

使用工具雷, 只写核心代码

Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
    conn = JdbcUtil.getConn();
    stat = conn.createStatement();
    String sql = "insert into account value(null, 'join', 3500)";
    int rows = stat.executeUpdate(sql);
    System.out.println("影响行数: " + rows);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    JdbcUtil.close(conn, stat, rs);
}

修改

Connection conn = null;
Statement stat = null;
try {
    conn = JdbcUtil.getConn();
    stat = conn.createStatement();
    String sql = "update account set money=1500 where name = 'join'";
    int rows = stat.executeUpdate(sql);
    System.out.println("影响行数: " + rows);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    JdbcUtil.close(conn, stat, null);
}

删除

Connection conn = null;
Statement stat = null;
try {
    conn = JdbcUtil.getConn();
    stat = conn.createStatement();
    String sql = "delete from account where name = 'join'";
    int rows = stat.executeUpdate(sql);
    System.out.println("影响行数: " + rows);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    JdbcUtil.close(conn, stat, null);
}
原文地址:https://www.cnblogs.com/zpKang/p/13033295.html