下面就简单的分析一下JDBC的这六个步骤: 1.获取连接Connection对象分析 a.获取数据库的三大要素 |-- URL:不同的数据库系统的URL不相同,但是至少有如下的内容: 主协议:次协议:HOST(主机):PORT(端口):SID(库名) |-- USER:用户名 |-- PASSWORD:密码 b.DriverManager获取连接的原理:
1 //驱动管理器类 2 class DriverManager { 3 static Vector<Driver> drivers = new Vector<Driver>(); 4 public static void registerDriver(Driver d) { 5 driver.add(d); 6 } 7 /** *//**获取连接的方法*/ 8 public static Connection getConnection(String url,String user,String pwd) throws SQLException { 9 Properties info = new Properties(); 10 info.setProperty("user",user); 11 info.setProperty("password",pwd); 12 return getConnection(url,info); 13 } 14 public static Connection getConnection(String url,Properties info)throws SQLException { 15 /**//*迭代多由的驱动,并且一次与给定的URL进行匹配,如果成功则返回当前驱动的Connection对象*/ 16 Iterator<Driver> iter = drivers.iterator(); 17 while(iter.hasNext()) { 18 Driver d = iter.next(); 19 if(匹配(url,d)) { 20 return d.connect(url,info); 21 }else { 22 continue; 23 } 24 } 25 /**//*到此都没有返回,说明没有匹配成功,则抛出SQLException异常*/ 26 throw new SQLException("no suitable driver"); 27 } 28 }
2. Statement 调用静态SQL PreparedStatement 来执行动态SQL,可以为SQL动态绑定参数。 如:同构SQL,SQL内容一样参数不同。
1 select id,first_name from s_emp 2 where dept_id = ? and name like ?; 3 4 insert into t_user values(?,?,?,?); 5 -- 上面的这些情况就可以用setXXX的方法(绑定参数)来传参数。 6 -- 例: 7 Connection con = ConnectionFactory.getConnection(); 8 String sql = "XXXXXXXXXXXXXXXXXXXXXXXXXX"; 9 PreparedStatement pstm = con.PreparedStatement(sql); 10 //绑定参数 11 pstm.setInt(1,XXX); 12 pstm.setString(2,XXX); 13 . . .
3.CallableStatement用来调用存储过程[procedure]
1 String sql = "{call insert_user(?,?)}" 2 CallableStatement cstm = con.prepareCall(sql); 3 //绑定参数 4 cstm.setString(1,"user"); 5 cstm.setString(2,"password"); 6 //执行过程,此返回值表示受影响的记录条数 7 int res = cstm.executeUpdate(); 8
4.执行SQL
1 statement: 2  3 executeQuery(selectSQL); => ResultSet 4 executeUpdate(dmlSQL); => int 5 execute(arbiSQL); => boolean 6  7 if(stm.execute(sql)) { 8 //为真,表示执行select语句 9 ResultSet rs = stm.getResultSet(); 10 }else { 11 //为假,表示执行非select语句 12 int res = stm.getUpdateCount(); 13 }
5.处理结果集
1 ResultSet rs: 2 rs.next(); => boolean用于判断结果集中是否还有可读取的元素。 3 rs.getXXX(); get系列方法,用于读去结果集中的元素。
6.释放资源
1 Connection.close(); 2 Statement.close(); 3 ResultSet.close();
|