首页 > 代码库 > Java解惑 之 MySQL与JDBC编程

Java解惑 之 MySQL与JDBC编程

一、JDBC的常用接口和类:

1、DriverManager:主要用于管理JDBC驱动的服务类。在程序中使用该类的主要功能是获取Connection对象,该类包含如下方法:
  • public static synchronized Connection getConnection(String url, String user, String password)  throws  SQLException:该方法获取数据库的连接。
2、Connection:代表数据库连接对象,而每一个Connection代表一个物理连接会话。要想访问数据库就必须先获得数据库的连接,否则无法对数据库进行操作。常见方法如下:
  • Statement createStatement() throws SQLException:该方法返回一个Statement对象
  • PreparedStatement  prepareStatement(String sql) throws SQLException:该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。
  • CallableStatement  prepareCall(String sql) throws SQLException:该方法返回CallableStatement对象,该对象用于调用存储过程。
注:想要执行SQL语句应先获取Statement对象。
    Connection控制事务的方法:
  • Savepoint  setSavepoint():创建一个保存点
  • Savepoint  setSavepoint(String name):以指定名字来创建一个保存点
  • void setTransactionIsolation(int level):设置事务的隔离级别
  • void rollback():回滚事务
  • void rollback(Savepoint savepoint):将事务保存到指定的保存点
  • void setAutoCommit(boolean autoCommit):关闭自动提交,打开事务
  • void commit():提交事务
3、Statement:用于执行SQL语句的工具接口。该对象既可以用于执行DDL、DCL语句,也可以用于执行DML语句,还可以用于执行SQL查询。当执行SQL查询时,返回查询到的结果集。常用方法如下:
  • ResultSet  executeQuery(String sql) throws SQLException:该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于执行查询语句。
  • int executeUpdate(String sql) throws SQLException:该方法用于执行DML语句,并返回受影响的行数,该方法也可用于执行DDL语句,执行DDL语句将返回0。
  • boolean  execute(String sql) throws SQLException:该方法可执行任何SQL语句。
               技术分享 如果执行后第一个结果为ResultSet对象,则返回true
               技术分享 如果执行后第一个结果为受影响的行数或没有任何结果,则返回false
4、PreparedStatement:预编译的Statement对象。PreparedStatement是Statement的子接口,它允许数据库预编译SQL语句(这些SQL语句通常带有参数),以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句,故性能更好,实际开发中用的较多。独有(异于Statement)的方法:
  • void setXxx(int parameterIndex, Xxx value):该方法根据传入的参数值的类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句中指定位置的参数。
5、ResultSet:结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名称获得列数据。它包含了如下常用的方法来移动记录指针。
  • void close():释放ResultSet对象
  • boolean absolute(int row):将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行。如果移动后的记录指针指向一条有效记录,则该方法返回true。
  • void beforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态----记录指针的起始位置位于第一行之前。
  • boolean first():将ResultSet的记录指针定位到首行。如果移动后的记录指针指向一条有效记录,则该方法返回true
  • boolean previous():将ResultSet的记录指针定义到上一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
  • boolean next():将ResultSet的记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
  • boolean last():将ResultSet的记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
  • void afterLast():将ResultSet的记录指针定位到最后一行之后。

二、JDBC的编程步骤

1、加载数据库驱动,通常采用Class类的forName() 静态方法来加载驱动。
  1. //加载驱动
  2. Class.forName(driverClass);
  3. //加载MySQL的驱动
  4. Class.forName("com.mysql.jdbc.Driver");
  5. //加载Oracle的驱动
  6. Class.forName("oracle.jdbc.driver.OracleDriver");
2、通过DriverManager获取数据库连接:
  1. //获取数据库连接
  2. DriverManager.getConnection(String url, String user, String password);
  3. //MySQL数据库URL的写法
  4. jdbc:mysql://hostname:port/databasename
  5. //Oracle数据库URL的写法
  6. jdbc:oracle:thin:@hostname:port:databasename
3、通过Connection对象创建Statement对象。创建方法有如下几个:
  • createStatement():创建基本的Statement对象
  • preparedStatement(String sql):根据传入的SQL语句创建预编译的Statement对象
  • preparedCall(String sql):根据传入的SQL语句创建CallableStatement对象
4、使用Statement执行SQL语句。所有的Statement都有如下三个方法来执行SQL语句
  • execute():可以执行任何SQL语句,但比较麻烦
  • executeUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数,执行DDL语句返回0
  • executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象
5、操作结果集。
6、释放数据库资源,关闭连接。
简单示例:
  1. package com.sqq.mystudy.JDBC;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class JDBCTest {
  7. public static void main(String[] args) {
  8. try {
  9. //1、加载MySQL数据库驱动
  10. Class.forName("com.mysql.jdbc.Driver");
  11. //2、使用DriverManager获取数据库连接
  12. Connection conn = DriverManager.getConnection(
  13. "jdbc:mysql://localhost:3306/mytest",
  14. "root","pwd"
  15. );
  16. //3、使用Connection创建一个Statement对象
  17. Statement stmt = conn.createStatement();
  18. //4、执行SQL语句
  19. ResultSet rs = stmt.executeQuery("SELECT * FROM mtest");
  20. while (rs.next()) {
  21. System.out.println(rs.getInt(1) + "\t"
  22. + rs.getString(2) + "\t\t"
  23. + rs.getString(3));
  24. }
  25.             
  26.             rs.close();
  27.             stmt.close();
  28.             conn.close();
  29. } catch (Exception e) {
  30. System.out.println(e);
  31. }
  32. }
  33. }
运行结果:
技术分享
 

三、事务处理

    1、事务
    • 概念:事务是由一步或多步数据库操作序列组成的逻辑执行单元,这一系列的单元要么全部执行,要么全部放弃执行。(程序和事务是两个不同的概念。一般而言,一个程序中可能包含多个事务
    • 事务的特性(4个): 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、和持续性(Durability)。简称为 ACID性
  • MySQL默认关闭事务(如果打开会自动提交),若要开启MySQL的事务支持,可以显示调用如下命令:
    1. SET AUTOCOMMIT = {0 | 1} #0为关闭自动提交,即开启事务
  • 如果只想临时性的开启事务,可以使用 start transaction 或者 begin
    2、JDBC的事务支持
    • JDBC连接的事务支持由Connection提供,Connection默认打开自动提交,即关闭事务。此时的每条SQL语句一旦执行,便会立即提交到数据库,永久生效,无法进行回滚操作; 如果想要关闭,可以调用Connection的setAutoCommit()方法来关闭自动提交,开启事务:
      1. //关闭自动提交,开启事务
      2. conn.setAutoCommit(false);
    • 此时使用Statement对象执行SQL语句之后,必须调用Connection的commit()方法来手动提交事务:
      1. //提交事务
      2. conn.commit();
    • 如果有SQL语句执行失败,此时也可以使用Connection的rollback()方法来回滚事务:
      1. //回滚事务
      2. conn.rollback();
    • 简单的示例:
      1. public static void commitTransaction(String[] sqls) {
      2. //加载驱动
      3. try {
      4. Class.forName(dbPar.getDriver());
      5. Connection conn = null;
      6. try {
      7. conn = DriverManager.getConnection(dbPar.getUrl(),
      8. dbPar.getUser(), dbPar.getPassword());
      9. //关闭自动提交事务
      10. conn.setAutoCommit(false);
      11. Statement stmt = conn.createStatement();
      12. for (String sql : sqls) {
      13. System.out.println(sql);
      14. }
      15. //提交事务
      16. conn.commit();
      17.                //关闭连接
      18.                conn.close();
      19. } catch (SQLException e) {
      20. e.printStackTrace();
      21. }
      22. } catch (ClassNotFoundException e) {
      23. e.printStackTrace();
      24. }
      25. }

Java解惑 之 MySQL与JDBC编程