1、加载驱动 Class.forName(driverClass) 上面的driverClass就是数据库驱动对应的字符串 mysql: com.mysql.jdbc.Driver oracle: oracle.jdbc.driver.OracleDriver 2、获取连接 DriverManager.getConnection(String url,String user,String pass) url不同数据库可能存在较大差异 mysql: jdbc:mysql://hostname:port/databasename oracle: jdbc:oracle:thin:@hostname:port:databasename 3、通过Connection对象创建Statement对象 createStatement() preparedStatement(String sql) 根据传入的SQL创建预编译Statement对象 prepareCall(String sql) 根据传入的SQL创建CallableStatement对象 4、使用Statement执行SQL语句 execute:可用来执行任何SQL语句,比较麻烦 executeUpdate:主要用于执行DML和DDL语句,执行DML返回受影响行数,执行DDL返回0 executeQuery:只能执行查询语句,返回结果集对象 5、操作结果集 Result指针移动:next、previous、first、last、berforeFirst、afterLast、absolute getXXX获取指针指向行,特定列的值 6、回收数据库资源 JDBC提供了独立于数据库的统一API,用于执行sql命令。 JDBCAPI主要由下面的常用接口和类组成: DriverManger 用于管理JDBC驱动的服务类。使用该类主要是获取Connection对象 static Connection getConnection(String url, String user, String password) 试图建立到给定数据库 URL 的连接。 Connection 代表数据库连接对象,每个Connection代表一个物理连接会话。访问数据库,必需获得数据库连接 常用方法: Statement createStatement() PreparedStatement prepareStatement(String sql) 返回预编译的Statement对象 CallableStatement prepareCall(String sql) 用于调用存储过程 几个控制事务的方法: SavaPoint setSavepoint()创建一个保存点 Savepoint setSavepoint(String name) void setTransactionIsolation(int level) 设置事务隔离级别 rollback() rollback(SavePoint savepoint) 回滚到指定的保存点 setAutoCommit(boolean autoCommit); 关闭自动提交,打开事务 void commit() 提交事务 Statement 用于执行SQL语句的工具接口。执行DDL DCL DML SQL 查询 常用方法: ResultSet executeQuery(String sql) 查询语句,返回结果集 int executeUpdate(String sql) 执行DML语句,返回受影响的行数,也可以执行DDL,执行DDL将返回0 boolean execute(String sql) 可以执行任何SQL语句,如果执行的第一个结果为ResultSet对象,则返回true。否则返回false preparedStatement 预编译的Statement对象。是statement对象的子接口,允许数据库预编译SQL,以后每次只改变SQL命令的参数,避免多次编译,因此性能更好 新方法: void setXxx(int parameterIndex,Xxx value) 给指定参数赋值 注意: PreparedStatement同样有executeUpdate、executeQuery和execute三个方法,不过不需要接受SQL字符串 ResultSet 结果集对象 常用方法: void close() boolean absolute(int row) 将结果集指针移动到第几行,如果是负数,则移动到倒数第几行。如果指针对应有效记录,返回true void beforeFirst() 指针移到首位 boolean previous() 指针上移 boolean next() 指针下移 boolean last() 指针移到最后一行 void afterLast() 将指针移到最后一行后 float getFloat(int columnIndex) Java 编程语言中 float 的形式获取此 ResultSet 对象的当前行中指定列的值。 参数:columnIndex - 第一个列是 1,第二个列是 2,…… float getFloat(String columnLabel) Java 编程语言中 float 的形式获取此 ResultSet 对象的当前行中指定列的值。 这里是两方面的 一方面是你的数据库使用utf-8编码 然后在连接数据库的时候指定编码 语句例子: tj.conn=JDBC.getConnection("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/hs?characterEncoding=UTF-8","guodaxia", "961012gz");
package com.util; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import org.apache.log4j.Logger; public class JDBC { public static Logger logger=Logger.getLogger(JDBC.class); private static Connection conn=null; public static Connection getConnection(String filePath){ Properties prop=new Properties(); try { prop.load(new FileInputStream(filePath)); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } try { Class.forName(prop.getProperty("jdbc.driver")); conn=DriverManager.getConnection(prop.getProperty("jdbc.url"), prop.getProperty("jdbc.user"), prop.getProperty("jdbc.password")); logger.info("连接成功!"); } catch (ClassNotFoundException e) { logger.debug("加载驱动失败!"); e.printStackTrace(); } catch (SQLException e) { logger.debug("连接数据库失败!"); System.out.println(""); e.printStackTrace(); } return conn; } } jdbc.url=jdbc:mysql://localhost:3306/hs?characterEncoding=UTF-8 jdbc.driver=com.mysql.jdbc.Driver jdbc.user=guodaxia jdbc.password=961012gz
### ??Logger?????????? ###
##log4j.rootLogger=debug, stdout,logfile
log4j.rootLogger=debug, stdout
### ??????????? ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### ???????????zs.log ###
# log4j.appender.logfile=org.apache.log4j.FileAppender
# log4j.appender.logfile.File=zs.log
# log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
# log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%l %F %p %m%n
jdbc可以使用可变参数优化:
package com.util; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class JDBCTool { private JDBCTool(){} private static Connection conn; private static PreparedStatement pstml; private static ResultSet rs; public static void getConnecttion(){ Properties prop=new Properties(); try { prop.load(new FileInputStream("src/jdbc.properties")); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } String driver=prop.getProperty("driver"); String url=prop.getProperty("url"); String user=prop.getProperty("user"); String pwd=prop.getProperty("pwd"); try { Class.forName(driver); conn=DriverManager.getConnection(url,user,pwd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static int DML(String sql,Object ... params){//使用可变参数 int num=0; try { pstml=conn.prepareStatement(sql); if(params!=null){ for(int i=0;i<params.length;i++){ pstml.setObject((i+1), params[i]); } } conn.setAutoCommit(false);//关闭自动提交,开启事务 try{ num=pstml.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } return num; } public static ResultSet Query(String sql,Object ... params){ try { pstml=conn.prepareStatement(sql); if (params != null) { for (int i = 0; i < params.length; i++) { pstml.setObject((i + 1), params[i]); } } return rs = pstml.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } public static void closeAll(){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(pstml!=null){ try { pstml.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static boolean isConnect(){ return conn==null?false:true; } }
jdbc使用事务:
conn.setAutoCommit(false);//关闭自动提交,开启事务 try{ num=pstml.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); e.printStackTrace(); }
jdbc使用存储过程:
package com.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.sql.Types; import com.util.JDBC; /* 我懒得关闭了 */ public class CallableDemo { public static void main(String[] args) { Connection conn=JDBC.getConnection("src/jdbc.properties"); try { /* 调用存储过程的格式:{call 过程名(?,?,?...)},?是存储过程参数的占位符*/ //CallableStatement对象的setXxx为传入参数设置值 //通过CallableStatement的registerOutParameter注册传出参数 //通过CallableStatement对象的getXxx(int index)获取指定传出参数的值 CallableStatement cstmt=conn.prepareCall("{call pro(?,?,?)}"); cstmt.setInt(1, 4); cstmt.setInt(2, 5); cstmt.registerOutParameter(3, Types.INTEGER); cstmt.execute(); System.out.println("执行结果是:"+cstmt.getInt(3)); } catch (SQLException e) { e.printStackTrace(); } } }