创建一个以JDBC连接数据库的程序,包含7个步骤:
1、加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。
例如:try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驱动程序类 ,加载驱动失败!"); e.printStackTrace(); }
成功加载后,会将Driver类的实例注册到DriverManager类中。
2、提供JDBC连接的URL
• 连接URL定义了连接数据库时的协议、子协议、数据源标识。
• 书写形式:协议:子协议:数据源标识 协议:在JDBC中总是以jdbc开始 子协议:是桥连接的驱动程序或是数据库管理系统名称。 数据源标识:标记找到数据库来源的地址与连接端口。 例如:(MySql的连接URL)jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
3、创建数据库的连接
•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
•使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。例如:
//连接MySql数据库,用户名和密码都是root String url = "jdbc:mysql://localhost:3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("数据库连接失败!"); se.printStackTrace() ; }
4、创建一个Statement
•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3
种类型: 1、执行静态SQL语句。通常通过Statement实例实现。 2、执行动态SQL语句。通常通过PreparedStatement实例实现。 3、执行数据库存储过程。通常通过CallableStatement实例实现。 具体的实现方式:Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
5、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。 2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等 3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。 具体实现的代码:ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ;
6、处理结果
两种情况:
1、执行更新返回的是本次操作影响到的记录数。 2、执行查询返回的结果是一个ResultSet对象。 • ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。 • 使用结果集(ResultSet)对象的访问方法获取数据:while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString(1) ; // 此方法比较高效 }(列是从左到右编号的,并且从列1开始)
7、关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反: 1、关闭记录集 2、关闭声明 3、关闭连接对象if(rs != null){ // 关闭记录集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 关闭声明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 关闭连接对象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }---------------------------------分割线---------------------------------
一、如何通过JDBC访问数据库
JDBC:Java DataBase Connectivity数据库连接用于在java程序中实现操作数据库。一般步骤如下:
加载JDBC驱动器。将数据库的JDBC驱动加载到classPath,web工程的一般放大WEB-INF/lib/下,java工程项目的则用build path将jar包导进去。
加载JDBC驱动,并将其注册到DriverManager中,一般使用反射Class.forName(String driveName). 简历数据库连接,取得Connection对象。一般通过Driver.getConnection(url,username,password)方法实现。 建立Statement对象或是PreparedStatement对象。 执行SQL语句 访问结果集ResultSet 依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放掉所占用的资源。 实例代码如下:首先创建一张表:
create tabel Employee( id int primarykey, name varchar(20), age int);
示例程序:
import java.sql.*; public class Test{ public static void main(String args[]){ String user = "user1"; String password = "pwd"; String url = "jdbc:mysql://127.0.0.1:3306/Test"; String driver = "com.mysql.jdbc.Driver"; Connection con = null; Statement stmt = null; ResultSet rs = null; try{ Class.forName(driver); con=DriverManager.getConnection(url,user,password); stmt=con.createStatement(); stmt.execute("insert into Employee values(1,'James1',36)"); rs=stmt.executeQuery("select * from Employee"); while(rs.next()){ System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3)); } }catch(SQLException e){ System.out.println(e.getMessage()); }finally{ try{ if(rs!=null) rs.close(); if(stmt!=null) stmt.close(); if(con!=null) con.close(); }catch(SQLException =e){ System.out.println("fe:"+e.getMessage()); } } }}
二、Statement、PreparedStatement和CallableStatement的区别
Statement一般用于执行不带参数的SQL语句,并返回生成的结果,每次执行SQL语句时,数据库都要编译该SQL语句。
PerparedStatement表示 与的SQL语句对象,用于执行带参数的SQL语句。效率高、安全性好、代码可读性和可维护性好。(推荐使用) CallableStatement用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。 举例说明PreparedStatement:
import java.sql.*; public class Test{ public static void main(String args[]){ String user="user1"; String password="pwd"; String url="jdbc:mysql://127.0.0.1:3306/Test"; String driver="com.mysql.jdbc.Driver"; Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try{ Class.forName(driver); con=DriverManager.getConnection(url,user,password); ps=con.preparedStatement("select * from Emloyee where id=?"); ps.setInt(1,1); rs=ps.executeQuery(); while(rs.next()){ System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3)); } }catch(SQLException e){ System.out.println(e.getMessage()); }finally{ try{ if(rs!=null)rs.close(); if(ps!=null)ps.close(); if(con!=null)con.close(); }catch(SQLException fe){ System.out.println("fe:"+fe.getMessage()); } } }}
三、getString()方法和getObject()方法有什么区别
在数据量很大的时候直接调用ResultSet方法的getString、getInt、getData方法会抛出异常:OrcaleException。此时应该使用getObject方法。因为其他方法会将查询结果都加载到内存中,如果数据量超过内存上限,则会导致异常。
四、JDBC与Hibernate有什么区别
Hibernate是JDBC的封装。采用配置文件的形式将数据库连接参数写到XML文件中。(下次再研究Hibernate)
package com.test; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * * @author Hongten * @date 2012-7-16 * */public class JDBCTest { public static void main(String[] args) { String driver = "com.mysql.jdbc.Driver"; String dbName = "spring"; String passwrod = "root"; String userName = "root"; String url = "jdbc:mysql://localhost:3308/" + dbName; String sql = "select * from users"; try { Class.forName(driver); Connection conn = DriverManager.getConnection(url, userName, passwrod); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println("id : " + rs.getInt(1) + " name : " + rs.getString(2) + " password : " + rs.getString(3)); } // 关闭记录集 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭声明 if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭链接对象 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } }