网站备案背景幕布,宁波seo的公司联系方式,青岛做网站找哪家,山西网络营销seo一、概念 1. 为了能让程序操作数据库#xff0c;对数据库中的表进行操作#xff0c;每一种数据库都会提供一套连接和操作该数据库的驱动#xff0c;而且每种数据库的驱动都各不相同#xff0c;例如mysql数据库使用mysql驱动#xff0c;oracle数据库使用oracle驱动#xf… 一、概念 1. 为了能让程序操作数据库对数据库中的表进行操作每一种数据库都会提供一套连接和操作该数据库的驱动而且每种数据库的驱动都各不相同例如mysql数据库使用mysql驱动oracle数据库使用oracle驱动这样假如我们编写的程序哪一天想要换数据库那样就会很不方便因为所有连接数据库的代码都要从新编写。SUN公司为了简化。统一对数据库的操作定义了一套java操作数据库的标准或者规范这个规范就是JDBC。 2.JDBC全称为Java Data Base Connectivityjava数据库连接它主要由接口组成。我们在开发过程中只要实现它相应的接口就可以非常进行连接。 3.我们在开发JDBC应用时还需要导入相应的数据库的驱动jar包这些驱动jar包是由数据库公司自己编写的。 二、编写JDBC应用程序需要连接数据库的程序的前提准备 1.首先要确定连接的是哪个数据库实例例如在mysql中我们可以先创建一个库然后在库中新建一张表在表中插入一些数据我在这里提供一段在mysql数据库中创建一个库以及表和数据的sql语句这也是下面连接数据库后操作的库和表。 create database test ; /*创建一个名为Test的数据库*/
use test; /*使用该数据库或者说切换到该数据库*/
create table book (id int primary key auto_increment, /*列:id ,类型:int,从0开始,自动增加, 备注主键*/name varchar(40) NOT NULL, /*列:name ,类型:varchar, 备注非空*/author varchar(40)NOT NULL, /*列:author ,类型:varchar, 备注非空*/prices double NOT NULL /*列:prices ,类型:double, 备注非空*/
); /*新建一张名为book的表*/
/*插入四大名著的数据*/
insert into book(id,name,author,prices) values (null,西游记,吴承恩,25.00);
insert into book(id,name,author,prices) values (null,水浒传,施耐庵,30.00);
insert into book(id,name,author,prices) values (null,红楼梦,曹雪芹,35.00);
insert into book(id,name,author,prices) values (null,三国演义,罗贯中,40.00); 2.新建一个java项目然后把mysql的驱动jar包导入进来即添加到程序运行的库中具体的驱动jar包我们可以在数据库的安装目录下找到或者都网上自己下载相对应的数据库驱动jar包 三、连接数据库操作的步骤解析 1注册数据库驱动 虽然我们刚才在新建java项目的时候将mysql数据库的驱动jar包导入进来了但是JBDC不知道这里有一个驱动包此时我们就需要将这个驱动包交给JBDC去管理我们可以使用java.sql包下的DriverManager 工具类 提供的registerDriver(Driver driver) 方法来在JDBC中注册这个数据驱动这个registerDriver(Driver driver)方法需要一个Driver对象而这个Driver类本身是JDBC提供的一个接口我们的驱动里面已经实现了这个接口所以我们只需要写如下代码就可以实现注册数据库驱动的功能 import java.sql.DriverManager; //需要导入的是接口类包
DriverManager.registerDriver(new Driver()); 2获取(创建)数据库的连接 我们注册好数据库驱动后并没有连接上数据库以往我们不管在CMD窗口下通过可视化数据库管理工具操作数据库时我们都需要先连接数据库服务器java程序连接数据库也不例外这里的java程序就相当于客户端只有先连接上数据库服务才能对数据库进行操作 客户端与数据库所有交互都是通过connection对象完成的这个对象的常用方法 createStatement()创建向数据库发送sql的statement对象。 prepareStatement(sql) 创建向数据库发送预编译sql的 这里我们可以通过DriverManager 工具类里的getConnection(url,user,password)方法来创建数据库连接对象此方法需要传入三个参数 User: 数据库的用户名 Password:用户密码 URL:数据库服务器地址不同的数据库的URL写法不同我在这里提供三种主流数据库的URL地址写法 Oracle写法jdbc:oracle:thin:localhost:1521:sid SqlServe写法jdbc:microsoft:sqlserver://localhost:1433; DatabaseNamesid MySql写法jdbc:mysql://localhost:3306/sid Mysql的url地址的简写形式 jdbc:mysql:///sid 注后面的sid就是数据库的实例名称使用的数据库名 import java.sql.Connection; //导入的是接口类包
Connection conn DriverManager.getConnection(jdbc:mysql://localhost:3306/test, root, root); //这里使用的是一个名为test的mysql数据库用户名和密码都是root 3创建传输器对象 上面我们已经创建了数据库的连接已经连上数据库了但是如果我们想要操作该数据库我们需要用到sql语句而我们怎样使用在java程序中使用sql语句来操作数据库呢这里我们就需要一个传输器对象来传输sql语句到数据库中去执行。上文提到在Connection 类中就有一个createStatement()的方法可以创建一个传输器对象 import java.sql.Statement; //导入的是接口类包
Statement stat conn.createStatement(); 4利用传输器对象传输sql语句到数据库中执行操作将结果用结果集返回 java.sql.Statement身上有许多传输sql语句的方法其中用的最多的是 executeQuery(String sql) 用于向数据发送查询语句。 executeUpdate(String sql)用于向数据库发送insert、update或delete语句 execute(String sql)用于向数据库发送任意sql语句 import java.sql.ResultSet; //需要导入的接口类包
ResultSet rs stat.executeQuery(select * from book); //传输一条查询语句查询book表中所有的元组数据 (5) 遍历结果集并获取查询对象 Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标初始的时候游标在第一行之前调用ResultSet.next() 方法可以使游标指向具体的数据行进行调用方法获取该行的数据。 ResultSet既然用于封装执行结果的所以该对象提供的都是用于获取数据的get方法 获取指定类型的数据例如 getString(int index) getString(String columnName) ResultSet还提供了对结果集进行滚动的方法 next()移动到下一行 Previous()移动到前一行 absolute(int row)移动到指定行 beforeFirst()移动resultSet的最前面。 afterLast() 移动到resultSet的最后面。 while(rs.next()){String name rs.getString(name);System.out.println(name);
} 6关闭连接先创建的后关闭 Jdbc程序运行完后切记要释放程序在运行过程中创建的那些与数据库进行交互的对象这些对象通常是ResultSet, Statement和Connection对象。 特别是Connection对象它是非常稀有的资源用完后必须马上释放如果Connection不能及时、正确的关闭极易导致系统宕机。Connection的使用原则是尽量晚创建尽量早的释放。 rs.close();
stat.close();
conn.close(); 初期完整的源代码 1 package jdbcDemo;2 /****************************3 * 初版连接数据库程序4 **************************/5 import java.sql.Connection;6 import java.sql.DriverManager;7 import java.sql.ResultSet;8 import java.sql.SQLException;9 import java.sql.Statement;
10 //不能导入 java.sql 中的 Driver 接口要导入驱动jar包中实现该接口的类只有这要才能注册相对应的数据库驱动
11 import com.mysql.jdbc.Driver;
12 public class JDBCTest {
13 public static void main(String[] args) throws SQLException {
14 //1.注册数据库驱动
15 DriverManager.registerDriver(new Driver());
16 //2.获取数据库的连接
17 Connection conn DriverManager.getConnection(jdbc:mysql://localhost:3306/test?useSSLfalse, root, root);
18 //3.创建传输器对象
19 Statement stat conn.createStatement();
20 //4.利用传输器对象传输sql语句到数据库中执行操作将结果用结果集返回
21 ResultSet rs stat.executeQuery(select * from book);
22 //5.遍历结果集并获取查询结果
23 while(rs.next()) {
24 String name rs.getString(name);
25 System.out.println(name);
26 }
27 //6.关闭连接后开先关
28 rs.close();
29 stat.close();
30 conn.close();
31 }
32 } 数据表视图和运行结果 四、初期连接数据库程序中出现的问题 1--注册数据库驱动方法不当导致出现了两次注册程序通用性低 我们在查看Driver类的源码中可以看到如下代码从第7行代码中我们可以看到mysql在Driver类的实现中自己注册了一次而我们在程序中又注册了一次导致注册两次 我们在注册驱动时需要导入mysql驱动jar包中已经实现的Driver类这样程序就和具体的数据库绑定在一起了程序的通用性就降低了如果我们想要切换数据库还得改动源码 1 public class Driver extends NonRegisteringDriver implements java.sql.Driver {2 //3 // Register ourselves with the DriverManager4 //5 static {6 try {7 java.sql.DriverManager.registerDriver(new Driver());8 } catch (SQLException E) {9 throw new RuntimeException(Cant register driver!);
10 }
11 } 修复方法 使用Class.forname() 方法将mysql中已经实现的Driver类加载到程序中来由于Driver类在实现接口时使用的是静态代码块而静态代码块只会在类加载的时候执行一次即保证了数据库驱动只会被注册一次同时不用导入mysql驱驱动里的类包程序通用性提高 Class.forName(com.mysql.jdbc.Driver); 2--忽略了程序中可能会抛出的异常最大的问题 我们在执行程序时它的许多方法的调用都会抛出异常如果它抛出异常后没有做相应的处理catch 这个异常那么程序就会中断执行Statement对象和Connection对象就没有被关闭而我们知道Connection对象它是非常稀有的资源用完后必须马上释放如果Connection不能及时、正确的关闭极易导致系统宕机所以我们需要保证无论程序中哪一步出现了异常导致程序中断连接关闭的代码都会被执行此时我们就会想到异常处理中的finally代码块我们可以把异常向上抛出而是先 try 住然后 catch 异常最后执行 finally 代码块 修改之后我们发现每个close() 都提示有异常要处理此时我们也直接 try/catch 每个异常 修改后的源代码 1 package jdbcDemo;2 /****************************3 * 修改版连接数据库程序4 **************************/5 import java.sql.Connection;6 import java.sql.DriverManager;7 import java.sql.ResultSet;8 import java.sql.SQLException;9 import java.sql.Statement;
10
11 public class JDBCTest {
12 public static void main(String[] args) {
13 Connection conn null;
14 Statement stat null;
15 ResultSet rs null;
16 try {
17 //1.注册数据库驱动
18 Class.forName(com.mysql.jdbc.Driver);
19 //2.获取数据库的连接
20 conn DriverManager.getConnection(jdbc:mysql://localhost:3306/test?useSSLfalse, root, root);
21 //3.创建传输器对象
22 stat conn.createStatement();
23 //4.利用传输器对象传输sql语句到数据库中执行操作将结果用结果集返回
24 rs stat.executeQuery(select * from book);
25 //5.遍历结果集并获取查询结果
26 while(rs.next()) {
27 String name rs.getString(name);
28 System.out.println(name);
29 }
30 }catch(Exception e) {
31 e.printStackTrace();
32 }finally {
33 //6.关闭连接后开先关
34 try {
35 rs.close();
36 } catch (SQLException e) {
37 e.printStackTrace();
38 }
39 try {
40 stat.close();
41 } catch (SQLException e) {
42 e.printStackTrace();
43 }
44 try {
45 conn.close();
46 } catch (SQLException e) {
47 e.printStackTrace();
48 }
49 }
50 }
51 } 五、修改后程序中被忽略的异常 异常问题 1.由于我们在程序开头先声明了三个对象的引用并且都赋值为null,假如程序在执行到注册数据库这一步时就抛出了异常此时catch 到这个异常 后执行finally 代码块结果发现ResultSet 对象的引用Connection对象的引用以及Statement对象的引用都是空值调用这个对象上的方法就会抛出空指针异常 2.close()这个方法身上也有异常如果我们不做相应的异常处理那些对象还是不能被正常关闭 解决办法 1---为了防止出现空指针异常我们可以先判断哪些对象的引用是否为null,如果不为null则执行异常处理代码 2---在每个close()异常处理后在加上一个finally静态代码块将每个相应对象的引用值置为null,原理是如果程序执行到close() 方法并抛出了异常那么最后finally代码块执行给该对象的应用值置为null,由于这个对象没有任何引用指向它它就成为了垃圾对象JVM垃圾回收器就会回收这个对象资源这个对象也就关闭了 异常处理完后最终的源代码 1 package jdbcDemo;2 /****************************3 * 无异常版连接数据库程序4 **************************/5 import java.sql.Connection;6 import java.sql.DriverManager;7 import java.sql.ResultSet;8 import java.sql.SQLException;9 import java.sql.Statement;
10
11 public class JDBCTest {
12 public static void main(String[] args) {
13 Connection conn null;
14 Statement stat null;
15 ResultSet rs null;
16 try {
17 //1.注册数据库驱动
18 Class.forName(com.mysql.jdbc.Driver);
19 //2.获取数据库的连接
20 conn DriverManager.getConnection(jdbc:mysql://localhost:3306/test?useSSLfalse, root, root);
21 //3.创建传输器对象
22 stat conn.createStatement();
23 //4.利用传输器对象传输sql语句到数据库中执行操作将结果用结果集返回
24 rs stat.executeQuery(select * from book);
25 //5.遍历结果集并获取查询结果
26 while(rs.next()) {
27 String name rs.getString(name);
28 System.out.println(name);
29 }
30 }catch(Exception e) {
31 e.printStackTrace();
32 }finally {
33 //6.关闭连接后开先关
34 if(rs ! null) {
35 try {
36 rs.close();
37 } catch (SQLException e) {
38 e.printStackTrace();
39 } finally {
40 rs null;
41 }
42 }
43 if(stat ! null) {
44 try {
45 stat.close();
46 } catch (SQLException e) {
47 e.printStackTrace();
48 }finally {
49 stat null;
50 }
51 }
52 if(conn ! null) {
53 try {
54 conn.close();
55 } catch (SQLException e) {
56 e.printStackTrace();
57 }finally {
58 conn null;
59 }
60 }
61 } //--finally
62 } //--main
63 }//--class 总结 这里我只是把所有的异常处理完但是程序的通用性还不是特别高因为连接数据库用到的Driver类名、URL、user以及password 都写在程序中我们其实可以写在一个文本文件中通过对文件的读取来获得每种数据库特有的连接参数。 还有就是在实际开发过程中连接数据库的程序代码一般会写在一个工具类中我们想要对数据库中的数据进行操作时只需要调用这个工具类就可以了不用每次都写那么多代码 接下来我还会更新一篇如何将数据库的连接信息保存在文本文件中然后读取这个文件来实现连接数据库的操作同时我也会将这个程序修改为连接数据库的一个工具类 转载于:https://www.cnblogs.com/zhuyeshen/p/10968080.html