JDBC技术
文章目录
1.1 JDBC简介
JDBC实质上是商标,全称为 Java DataBase Connectivity(java 数据库连接)。
JDBC还是一个技术,可以通过它连接不同的数据库如Oracle, MySql,SQLSever等,执行如insert, delete, update, select等DML(数据库操作语言),create, table, drop等DDL(数据库定义语言),并且支持调用储存过程等。
JDBC还是一个规范,标准。它是SUN制定的一套Java连接数据库执行SQL语句的规范。
JDBC的规范更具体的说是类和接口的集合。
1.2 JDBC规范
1.2.1 ODBC,OLEDB,ADO
微软的ODBC规范。全称为:Open DataBase Connectivity(开放数据库连接),它是微软连接数据库执行sql语句的规范,之后对规范升级后命名为OLEDB,全称为:Object Link and embed(对象连接与嵌入),之后应各大数据库厂商的要求又做了规范的实现,叫ADO,全称为:ActiveX Data Objects(ActiveX数据对象)。
1.2.2 JDBC规范
java出现后,使用java连接数据库执行SQL语句,SUN公司没有采用微软的ODBC规范,而是发明了自己新的规范,于是JDBC规范就此诞生。
JDBC和ODBC的区别是:SUN没有提供相应的连接数据库的实现,而是需要厂商自行完成。
1.2.3三者的关系
规范制定者:SUN公司。制定得到连接执行SQL语句的规范,就是接口的集合。
规范实现者:各大数据库厂商。学习规范,具体说就是实现接口的功能,把实现类打包成一个jar包。
规范使用者:应用程序员。学习接口以及实现类方法的含义,使用者在相应的数据库官网下载jar包连接数据库。
1.2.4 JDBC接口和类
与JDBC相关的接口和类都在java.sql包中
名称 | 类型 | 说明 |
---|---|---|
Driver | 接口 | 表示驱动程序类 |
Connection | 接口 | 连接数据库 |
Statement | 接口 | 执行SQL语句将数据检索到ResultSet中 |
ResultSet | 接口 | 数据库结果集数据表,由select(DML)产生 |
PreparedStatement | 接口 | 执行预编译SQL语句 |
DriverManager | 类 | 驱动程序管理器,通过它得到连接对象 |
CallableStatement | 接口 | 执行储存过程 |
1.3 JDBC的使用
1.3.1 项目引入驱动程序jar包
将官网下载好的jar包导入到项目中。
在当前的项目建立一个文件夹,将jar包放入其中,再导入,这样拷贝项目的时候会连同jar包一起拷贝。
以idea为例打开File -> project Structure …(如图操作) -> java -> 打开之前存放jar包的文件夹将驱动程序导入 。这里我们之前导入过名字叫“sqljdbc4”
1.3.2 加载驱动程序
使用Class.forName()加载驱动程序。
try {
Class.forName("实现java.sql.Driver接口的一个类DriverName");
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
1.DriverName根据连接数据库种类的不同加载的驱动类不同,不管是哪个类都实现了java.sql.Driver的接口。如sqlsever的驱动类名为: com.microsoft.sqlserver.jdbc.SQLServerDriver。
2.Class.forName(“driverName”)的两个功能:第一,把驱动程序加载到内存里;第二,把当前加载的驱动程序自动去DriverManager那注册。
1.3.3得到连接对象connection
如果把应用程序比作商店的话那么数据库就是储存商品的仓库,现在我们需要把货物运输到商店,首先就需要建立一条连接通道,通过DriverManager.getConnection()方法得到连接对象。
//DriverManager会返回Connection接口的一个实现类SqlSeverConnection
//gerConnection方法会new一个SqlSeverConnection类的一个对象,返回这个对象用外面的接口来使用这个实例
//声明接口创建对象
try{
String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName = PAS";
Connection con = DriverManager.getConnection(url, "sa","sa");
}catch (SQLException e) {
e.printStackTrace();
}
当我们调用sql包中任何方法和类的时候都会报一个编译时异常SQLException。
url:为统一资源定位符
jdbc:sqlsever://ip:1433;dataBaseName = dbName
jdbc:表示的是JDBC驱动程序
sqlsever:表示的是连接数据库的种类
ip:表示的是计算机的身份证,如果连接的数据库是本机,我们使用localhost或者127.0.0.1表示。
1433:端口号(port),又称为服务号,监听号,如果这个主机装了好几种数据库,连接哪个数据库就使用对应的port,sqlsever为1433,mysql为3306,oracle为1521。
databaseName: 数据库的名称,使用的是哪个数据库就用其相应的名字。
几种url的写法:
数据库类别 | url |
---|---|
mysql | jdbc:mysql://ip:3306/dbName |
Oracel | jdbc:oracle:thin:@ip:1521:dbName |
sqlsever2005 | jdbc:sqlsever://ip:1433;dataBaseName = dbName |
1.3.4 创建Statement对象
之前创建好通道这会我们还需要一辆车Statement
Statement sta = con.createStatement();
1.3.5 执行SQL语句(executeUpdate)
从仓库拉货的Statement提供了两个方法:
executeUpdate(sql)用来执行insert, update, delete语句。
executeQuert(sql)用来执行select语句。
其中executeUpdate为int类型,
int row = sta.executeUpdate(sql);
if(rows == 1){
System.out.println(rows);//打印影响的行数
System.out.println("OPRATION SUCCESSFUL");
}else {
System.out.println("OPRATION DEFAULT");
}
1.3.6 资源的关闭
因为Statement,Connection都是大对象,最后我们使用完需要关闭以释放资源,finally块不管有没有异常都会最后执行,因此用finally块释放资源。
Connection con = null;
Statement sta = null;
try {
……………………
……………………
省略代码
……………………
……………………
} finally {
try {
if (sta != null) {
sta.close();
sta = null;
}
if (con != null) {
con.close();
con = null;
}
} catch (Exception e) {
System.out.println("关闭资源时发生异常");
}
}
创建资源和关闭资源的顺序是相反的。
如果在创建con后在创建sta之前发生异常,也就是Statement还没有创建对象,那么程序会进入catch块,最后finally块会调用sta.close()报空指针异常,因此必须加入空判断然后执行。