Java解惑 之 MySQL与JDBC编程

1、JDBC的经常使用接口和类:

一、DriverManager:主要用于管理JDBC驱动的服务类。在程序中使用该类的主要功能是获取Connection对象,该类包含以下方法:
  • public static synchronized Connection getConnection(String url, String user, String password)  throws  SQLException:该方法获取数据库的链接。
二、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():提交事务
三、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
四、PreparedStatement:预编译的Statement对象。PreparedStatement是Statement的子接口,它容许数据库预编译SQL语句(这些SQL语句一般带有参数),之后每次只改变SQL命令的参数,避免数据库每次都须要编译SQL语句,故性能更好,实际开发中用的较多。独有(异于Statement)的方法:
  • void setXxx(int parameterIndex, Xxx value):该方法根据传入的参数值的类型不一样,须要使用不一样的方法。传入的值根据索引传给SQL语句中指定位置的参数。
五、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的记录指针定位到最后一行以后。

2、JDBC的编程步骤

一、加载数据库驱动,一般采用Class类的forName() 静态方法来加载驱动。
   
   
   
   
   
  1. //加载Oracle的驱动
  2. Class.forName("oracle.jdbc.driver.OracleDriver");
//加载驱动Class.forName(driverClass); //加载MySQL的驱动Class.forName("com.mysql.jdbc.Driver");
二、经过DriverManager获取数据库链接:
   
   
   
   
   
//获取数据库链接DriverManager.getConnection(String url, String user, String password); //MySQL数据库URL的写法jdbc:mysql://hostname:port/databasename //Oracle数据库URL的写法jdbc:oracle:thin:@hostname:port:databasename
三、经过Connection对象建立Statement对象。建立方法有以下几个:
  • createStatement():建立基本的Statement对象
  • preparedStatement(String sql):根据传入的SQL语句建立预编译的Statement对象
  • preparedCall(String sql):根据传入的SQL语句建立CallableStatement对象
四、使用Statement执行SQL语句。全部的Statement都有以下三个方法来执行SQL语句
  • execute():能够执行任何SQL语句,但比较麻烦
  • executeUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数,执行DDL语句返回0
  • executeQuery():只能执行查询语句,执行后返回表明查询结果的ResultSet对象
五、操做结果集。
六、释放数据库资源,关闭链接。
简单示例:
   
   
   
   
   
package com.sqq.mystudy.JDBC;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JDBCTest { public static void main(String[] args) { try { //一、加载MySQL数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //二、使用DriverManager获取数据库链接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mytest", "root","pwd" ); //三、使用Connection建立一个Statement对象 Statement stmt = conn.createStatement(); //四、执行SQL语句 ResultSet rs = stmt.executeQuery("SELECT * FROM mtest"); while (rs.next()) { System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t\t" + rs.getString(3)); }            
            rs.close();
            stmt.close();
            conn.close();
} catch (Exception e) { System.out.println(e); } }}
运行结果:
 

3、事务处理

    一、事务
    • 概念:事务是由一步或多步数据库操做序列组成的逻辑执行单元,这一系列的单元要么所有执行,要么所有放弃执行。(程序和事务是两个不一样的概念。通常而言,一个程序中可能包含多个事务
    • 事务的特性(4个): 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、和持续性(Durability)。简称为 ACID性
  • MySQL默认关闭事务(若是打开会自动提交),若要开启MySQL的事务支持,能够显示调用以下命令:
         
         
         
         
         
    SET AUTOCOMMIT = {0 | 1} #0为关闭自动提交,即开启事务
  • 若是只想临时性的开启事务,能够使用 start transaction 或者 begin
    二、JDBC的事务支持
    • JDBC链接的事务支持由Connection提供,Connection默认打开自动提交,即关闭事务。此时的每条SQL语句一旦执行,便会当即提交到数据库,永久生效,没法进行回滚操做; 若是想要关闭,能够调用Connection的setAutoCommit()方法来关闭自动提交,开启事务:
            
            
            
            
            
      //关闭自动提交,开启事务conn.setAutoCommit(false);
    • 此时使用Statement对象执行SQL语句以后,必须调用Connection的commit()方法来手动提交事务:
            
            
            
            
            
      //提交事务conn.commit();
    • 若是有SQL语句执行失败,此时也能够使用Connection的rollback()方法来回滚事务:
            
            
            
            
            
      //回滚事务conn.rollback();
    • 简单的示例:
            
            
            
            
            
      public static void commitTransaction(String[] sqls) { //加载驱动 try { Class.forName(dbPar.getDriver()); Connection conn = null; try { conn = DriverManager.getConnection(dbPar.getUrl(), dbPar.getUser(), dbPar.getPassword()); //关闭自动提交事务 conn.setAutoCommit(false); Statement stmt = conn.createStatement(); for (String sql : sqls) { System.out.println(sql); } //提交事务 conn.commit();                //关闭链接                conn.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
相关文章
相关标签/搜索