日期:2014-05-16  浏览次数:20459 次

JDBC使用深入详解(一)

JDBC是一套接口,开发的时候只需要对这个借口打交道,j2ee整个体系也是这样,sun公司设计接口,其他公司来实现.
面向接口编程的好处,各个数据库厂商最了解自己的产品,sun没必要搞这个,给你们接口,你们玩去,编程者只需要知道这个接口参数,方法有什么作用,至于里面具体实现,底层数据库操作跟我没关系,爱咋的咋的....


WEB有些类似,有了servlet我们不需要知道这个,只需要知道servlet类与方法,至于http是怎样的不需要知道,当然这个不是http来实现这些接口,而是servlet封装了http的详细东西...

我们当然也可以自己做,我们把jdbc接口实现了,也可以是个driver....

步骤:
注册驱动 (只做一次)
建立连接(Connection)
创建执行SQL的语句(Statement)
执行语句
处理执行结果(ResultSet)
释放资源


注册驱动分析:
DriverManager是一个驱动管理器,同一个程序可以注册多个驱动,如何注册多个驱动,根据url来查找连接,所有驱动无法建立连接将会报错!

Class.forName(“com.mysql.jdbc.Driver”)-->>反射,加载到JVM,会调用静态代码块.
而在驱动类里面,静态代码块注册了驱动,隐行的注册了,正应为如此,下面这个就注册了两次,推荐这种方式,不会对具体的驱动类产生依赖。


DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖,上面即使jar包不存在可以通过编译...


System.setProperty(“jdbc.drivers”, “driver1:driver2”);
可以注册很多驱动,用冒号分隔.虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。



驱动类型(四种类型)

创建连接:
url格式:
JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
User,password可以用“属性名=属性值”方式告诉数据库;
其他参数如:useUnicode=true&characterEncoding=GBK。

JDBC是一种协议,如果是本机可以省略掉主机+端口
不需要记忆,mysql文档里面会有....
Connection是一个socket,如果你系统负载很大,有些没关闭,关闭连接这个过程是非常重要的,否侧刚上线没一会,系统就会挂掉,最佳实践是这块必须写的很完美.....

释放资源:
释放ResultSet, Statement,Connection.
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放.


规范代码:

模板代码 
Connection conn = null;
Statement st=null;
ResultSet rs = null;
try {
	//获得Connection
	//创建Statement
	//处理查询结果ResultSet
} finally {
	//释放资源ResultSet, Statement,Connection
}



CRUD C-->>创建  R-->>读 U-->>更新 D-->>删除
增、删、改用Statement.executeUpdate来完成,返回整数(匹配的记录数),这类操作相对简单。
查询用Statement.executeQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果;查询相对与增、删、改要复杂一些,因为有查询结果要处理。

在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。
PreperedStatement(从Statement扩展而来)相对Statement的优点:
1.没有SQL注入的问题。
2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库