1、 JDBC是什么
JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称。
2、 JDBC程序的工作原理
2.1、JDBC API
JDBC API由SUN公司提供,提供了Java应用程序与各种不同数据库交互的标准接口。如:Connection(连接)接口、Statement接口、PreparedStatement接口、ResultSet(结果集)接口等。可以使用这些JDBC接口进行各类数据库操作。
2.1.1、JDBC API的作用:与数据库建立连接、发送SQL语句、处理结果。
DriverManager类:依据数据库的不同,管理JDBC驱动。
Connection接口:负责连接数据库并担任传送数据的任务。
Statement接口:由Connection产生,负责执行SQL语句。
ResultSet接口:负责保存Statement执行后所产生的的查询结果。
2.2、JDBC Driver Manager
JDBC Driver Manager由sun公司提供,它能够管理各种不同的JDBC驱动。
2.3、JDBC驱动
JDBC驱动由各个数据库厂商提供,负责连接各种不同的数据库。如:微软公司为我们提供了专门连接SQL Server的JDBC驱动,而Oracle公司则为我们提供了专门连接Oracle的JDBC驱动,这些JDBC驱动实现了JDBC API中定义的各种接口。
2.3.1、两种常用的驱动方式
(1)、JDBC-ODBC桥连。不能提供非常好的性能,只适用于个人的开发与测试,它通过ODBC与数据库进行连接。
JDBC-ODBC桥连就是将对JDBC API的调用转换为对另一组数据库连接(即ODBC)API的调用。 JDK中已经包括了JDBC-ODBC桥连的驱动接口,所以进行JDBC-ODBC桥连时,不需要额外下载JDBC驱动程序,只需要配置ODBC数据源即可。
//驱动类的名称
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//数据库连接字符串.。xinxin数据源名称
Connection conn = DriverManager.getConnection(“jdbc:odbc:xinxin”,”sa”,”sa”);
(2)、纯Java驱动方式。直接同数据库进行连接,在生产型开发中,推荐使用纯Java驱动方式。
纯 Java驱动方式由JDBC驱动直接访问数据库,驱动程序完全由Java语言编写,运行速度快,而且具备了跨平台的特点。访问不同的数据库需要下载专用的JDBC驱动。
//SQL Server 2005的驱动连接
//数据库驱动
com.microsoft.sqlserver.jdbc.SQLServerDriver
// URL
jdbc:sqlserver://localhost:1433;databasename=company
// SQL Server 2000的驱动连接
//数据库驱动
com.microsoft.jdbc.sqlserver.SQLServerDriver
// URL
jdbc:microsoft:sqlserver://localhost:1433;databasename=company
两种常用的驱动方式示意图
2.4、JDBC程序的代码模板
开发一个JDBC应用程序,基本需要以下步骤:
(1)、把JDBC驱动类装载入Java虚拟机中,为此,可使用Class.forName()方法,此方法将给定的类加载到Java虚拟机中。如果系统中不存在给定的类,则会引发异常,异常类型为ClassNotFoundException。
Class.forName(“JDBC驱动类的名称”);
(2)、加载驱动,并与数据库建立连接。DriverManager类跟踪已注册的驱动程序,当调用getConnection()方法时,它会搜索整个驱动程序列表,直到找到一个能够连接至数据连接字符串中指定的数据库的驱动程序。加载此驱动程序之后,将使用DriverManager类的getConnection()方法建立与数据库的连接。此方法接收三个参数,分别表示URL、用户名和密码。用户名和密码是可选的。
Connection conn = DriverManager.getConnection(数据库连接字符串,数据库用户名,密码);
(3)、发送SQL语句,并得到结果集。一旦连接建立,就使用该连接创建Statement接口的实例,并将SQL语句传递给它所连接的数据库,并返回类型为ResultSet的对象,它包含执行SQL查询的结果。
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(select a,b,c from table);
(4)、处理结果。使用ResultSet对象的next()方法将光标(cursor)指向下一行。最初光标位于第一行之前,因此第一次调用next()方法将光标置于第一行上。如果到达结果集的末尾,则ResultSet的next()方法会返回false。方法getXXX提供了获取当前行中某列值的途径,列名或列号可用于标识要从中获取数据的列。例如:如果数据表中第一列的列名为a,存储类型为整型,则可以使用两种方法获取存储在该列中的值,如:int x = rs.getInt(“a”);或者:int x = rs.getInt(1);处理结果的代码示例:
while(rs.next()){
int x = rs.getInt(“a”);
String s = rs.getString(“b”);
float f = rs.getFloat(“c”);
}
JDBC程序的代码模板:
//把JDBC驱动类装载入Java虚拟机中
Class.forName(JDBC驱动类的名称);
//加载驱动,并与数据库建立连接,其中数据库连接字符串用来标识数据库
Connection conn = DriverManager.getConnection(数据库连接字符串,数据库用户名,密码);
//执行SQL语句,并得到结果集
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“select a,b,c from table”);
//处理结果
while(rs.next()){
int x = rs.getInt(“a”);
String s = rs.getString(“b”);
float f = rs.getFloat(“c”);
}
2.5、什么是JDBC URL
JDBC URL提供了一种标识数据库的方法,可以使相应的JDBC驱动程序能识别数据库并与之建立连接。
JDBC URL的标准语法由以下三个部分组成,各部分间用冒号分隔。
Jdbc:<子协议>:<子名称>
JDBC URL的三个部分可以分解如下:
其中jdbc-----代表协议。
<子协议>----驱动程序名或数据库连接机制的名称。
<子名称>----一种标识数据库的方法。
JDBC URL示例:
jdbc:odbc:news
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news
3、 Statement接口和PreparedStatement接口中的方法
ResultSet executeQuery(String sql):可以执行SQL查询并获取到ResultSet对象。
int executeUpdate(String sql):可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数。
boolean execute(String sql):这是一个最为一般的执行方法,可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet。
4、 为什么要关闭Statement对象以及数据库连接
如果不关闭Statement对象,它们会一直占用服务器资源,直到Java垃圾收集程序来回收它。作为一种好的编程风格,应在不需要Statement对象时显示地关闭它们,这将立即释放服务器资源,有助于避免潜在的内存问题。同样,使用完数据库连接后,就应关闭它,释放连接所占用的数据库资源。
5、 PreparedStatement语句
PreparedStatement接口继承自Statement接口,PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率。
PreparedStatement实例包含已编译的SQL语句,SQL语句可具有一个或多个输入参数。这些输入参数的值在SQL语句创建时未被指定,而是为每个输入参数保留一个问号(“?”)作为占位符。
PreparedStatement pstmt = con.prepareStatement(“update table set a=? where b=?”);
在执行PreparedStatement对象之前,必须设置每个输入参数的值。可通过setXXX方法来完成,其中XXX是与该参数相应的类型。例如,如果参数具有Java类型long,则使用的方法就是设置给该参数的值。例如,以下代码将第一个参数设为长整型值123456789,第二个参数设为整型值10:
pstmt.setLong(1,123456789);
pstmt.setInt(2,10);
由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象,因此,多次执行的SQL语句应被创建为PreparedStatement对象,以提高效率。
6、 格式化时间
SimpleDateFormat hmFromat = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
hmFromat.format(new Date());