我们编写程序的目的是为了处理数据,数据的存储方式有很多种,例如数据可以存放在text文本中。当然如果我们做程序开发主要还是存放在数据库中。
如果我们让java程序读取数据库中的数据以及用java程序向数据库中写入数据,这里就要用到JDBC的知识。
JDBC 是 SUN 制定的一套用 Java 连接数据库执行 SQL 语句的标准,它还是个技术,通过它,我们就可以连接各种不同的数据库。一般称它为 Java Database Connectivity (Java 数据库连接)。
使用 JDBC
一、项目引用驱动 JAR 包
从各个数据库厂商官网下载获取 jar 包,将得到的驱动程序 jar 包导入到项目中,用于连接数据库的使用。
二、加载驱动程序
调用 Class.forName()加载驱动程序。
- try {
Class.forName("实现java.sql.Driver
接口的一个类DriverName");
}
catch (ClassNotFoundException e) {
System.out.println("驱动程序类没有找到");
e.printStackTrace();
}
要点:
1. Class.forName()通过类名点方法名调用,说明是 static 方法。
范中唯一的 Java 类
2.此方法会报一个编译时异常 ClassNotFoundException。编译时异常必须处理,否则程序 无法编译。
3. 当只输入 Class.forName("DriverName");保存时,编译器一定报错,这时使通过快捷键,表示给出错误的解决方案,有两个:一个是抛出异常;一个
是要在内部加 try,catch 做异常处理。
三、得到连接对象 ConNECTIN
如果把我们的应用程序比作一个商店,那数据库就是存储这个商店商品的仓库,现在需 要从仓库中取货物到商店或者把商店的货物放入仓库,首先需要建立一个连接,即修一条路,
此路就为 Connection。
通过 DriverManager.getConnection()方法得到连接对象。
try {
String url = "ip+port+dbName";
Class.forName
("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.
getConnection(url, "sa", "");
System.out.println("驱动程序加载完毕");
}
catch
(ClassNotFoundException e) {
System.out.println("驱动程序类没有找到");
e.printStackTrace();
}
catch
(SQLException e) {
System.out.println("发生了sql异常");
e.printStackTrace();
}
要点:
1. DriverManager 在 JDBC 规范中是类而不是接口,它是一个服务类,用于管理 JDBC 驱动 程序,提供 getConnection 方法建立应用程序与数据库连接。
2. DriverManager.getConnection()是个静态方法,通过类名点方法名调用。
3. DriverManager 在 java.sql 包里,当我们调用 sql 包里任何一个类(包括接口)的任何一个方法时都会报一个编译时异常 SQLException。我们使用快捷键给出错误解决方案,我们看到给出三个方案:
⑴ 通过 main 方法向外抛异常;
⑵ 一个 try 块后跟多个 catch 块;
⑶ 使用嵌套的 try-catch 块。我们使用第二种解决方案。
4. 方法参数 URL:统一资源定位符。如:jdbc:sqlserver://ip:1433;databaseName=dbName
第一部分 jdbc:表示使用的是 jdbc 驱动程序;
第二部分: sqlserver 表示连接的数据库种类;
第三部分:ip 地址,在网络上通过 ip 地址来定位唯一一台计算机,这个 ip 可以是内网的 ip,还可以是公网的,同时如果连接的数据库在本机,我们使用 localhost 或者 127.0.0.1 表示。
第四部分:1433即为端口号,又称为服务号,又称为监听号,这个主机能装好几种据库软件,比如 SqlServer, mysql, oracle 。
我们连接数据库需要通过端口号, SqlSever 为 1433,mysql 为 3306,oracle 为 1521;
最后:databaseName,数据库名称。某个数据库软件中还有很多个数据库,比如
studentManager,crm 等,那你要连接哪一个数据库,这个通过数据库名称来决定。
连接 sqlserver 的完整实例:
String url = "jdbc:sqlserver://192.168.1.21:1433;databaseName=friendManager";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("驱动程序加载完毕");
Connection con = DriverManager.getConnection(url, "sa", "");
System.out.println("开通路 con = " + con);
}
catch (ClassNotFoundException e) {
System.out.println("驱动程序类没有找到");
e.printStackTrace();
}
catch (SQLException e) {
System.out.println("发生了sql异常");
e.printStackTrace();
}
四、创建 STATEMENT 对象
上面我们已经建立了一条从商店到仓库的路,那运送货物还需要一辆车,现在我们需要创建辆车 Statement
Statement sta = con.createStatement();
System.out.println("得到货车 sta = " + sta);
五、执行 SQL 语句
使用汽车从商店往仓库拉货或者从仓库往商店拉货。Statement 提供了两个方法
executeUpdate(sql)与 executeQuery(sql)负责,前者 executeUpdate(sql)用来执行
insert,update,delete 语句,后者执行 select 语句。这里先看 executeUpdate 方法。
String sql = "insert into student (stuName, age ,address, email)
values('xingxing', 18, '玉祥门', 'shudaizi@163.com')";
int row = sta.executeUpdate(sql);
if (row == 1) {
System.out.println("save success");
} else { System.out.println("save error");
}
要点:
1. executeUpdate()用来执行 insert,update,delete 语句。
2. 返回的类型为 int,表示 sql 语句影响的行数。这里执行 insert 语句,新增了 1 行,即 sql 语句影响 1 行,返回 1。
六、关闭资源
六、关闭资源
Statement,Connection 都是大对象,最后我们使用完要关闭它以释放资源,并且 ,我们知道 finally 块不管有没有异常发生都是最后执行,且一定执行。
要点:
1. Connection 与 Statement 对象设为全局变量,否则在 finally 块中无法拿到其引用。主题: 云点软件工程师实训教程_JAVASEDBC 页面 10 / 24安金智信息技术有限公司 、、、、、、、2.sta.close()方法与 con.close()方法会报异常,必须做异常处理。调用 sql 包里任何一个类(包括接口)的任何一个方法时都会报一个编译异常SQLException。
3. 在上面的关闭资源的代码中还存在这样的缺陷,如果在创建 con 后创建 sta 之前发生异常,也就是 Statement 对象还没创建,那么程序运行会进入 catch 快,最后 finally 再调用它的 close()方法,就会报空指针异常。解决方法是在最后执行 finally 时,判断 sta 对象是否为空,如为空则关闭资源,否则不做任何处理,包括 con 也一样。如下
String url = "jdbc:sqlserver://192.168.1.21:1433;databaseName=studentManager";
Connection con = null;
Statement sta = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("驱动程序加载完毕");
con = DriverManager.getConnection(url, "sa", "");
System.out.println("开通路 con = " + con);
sta = con.createStatement();
System.out.println("得到货车 sta = " + sta);
String sql = "insert into student (stuName, age ,address, email)
values('wangwang', 12, '玉祥门', 'shudaizi@163.com')";
int row = sta.executeUpdate(sql);
if (row == 1) {
System.out.println("save success");
}
else {
System.out.println("save error");
}
}
catch (ClassNotFoundException e) {
System.out.println("驱动程序类没有找到");
e.printStackTrace();
}
catch (SQLException e) {
System.out.println("发生了sql异常");
e.printStackTrace();
} finally {
try {
if (sta != null) {
sta.close();
sta = null;
}
if
(con != null) {
con.close();
con = null;
}
}
catch (Exception e) {
System.out.println("关闭资源时发生异常");
}
}



