JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。

1、跨平台运行:这是继承了Java语言的“一次编译,到处运行”的特点;

2、不受数据库供应商的限制:巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发人员通过SQL调用数据库和处理结果,而不需要考虑数据库的提供商;另一个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利用JDBC API创建Java程序和数据源之间的桥梁。应用程序只需要编写一次,便可以移到各种驱动程序上运行。Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就可以被识别,就可以正常工作。所以JDBC不受数据库供应商的限制。

JDBC API可以作为连接Java应用程序与各种关系数据库的纽带,在带来方便的同时也有负面影响,以下是JDBC的优、缺点。优点如下:

  • 操作便捷:JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数;
  • 可移植性强:JDBC支持不同的关系数据库,所以可以使同一个应用程序支持多个数据库的访问,只要加载相应的驱动程序即可;
  • 通用性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;
  • 面向对象:可以将常用的JDBC数据库连接封装成一个类,在使用的时候直接调用即可。

  缺点如下:

  • 访问数据记录的速度受到一定程度的影响;
  • 更改数据源困难:JDBC可支持多种数据库,各种数据库之间的操作必有不同,这就给更改数据源带来了很大的麻烦

二、JDBC连接数据库的流程及其原理

1、在开发环境中加载指定数据库的驱动程序。例如,接下来的实验中,使用的数据库是MySQL,所以需要去下载MySQL支持JDBC的驱动程序(最新的是:mysql-connector-java-5.1.18-bin.jar);而开发环境是MyEclipse,将下载得到的驱动程序加载进开发环境中(具体示例的时候会讲解如何加载)。

2、在Java程序中加载驱动程序。在Java程序中,可以通过 “Class.forName(“指定数据库的驱动程序”)” 方式来加载添加到开发环境中的驱动程序,例如加载MySQL的数据驱动程序的代码为:  Class.forName(“com.mysql.jdbc.Driver”)

3、创建数据连接对象:通过DriverManager类创建数据库连接对象Connection。DriverManager类作用于Java程序和JDBC驱动程序之间,用于检查所加载的驱动程序是否可以建立连接,然后通过它的getConnection方法,根据数据库的URL、用户名和密码,创建一个JDBC Connection 对象。如:Connection connection =  DriverManager.geiConnection(“连接数据库的URL", "用户名", "密码”)。其中,URL=协议名+IP地址(域名)+端口+数据库名称;用户名和密码是指登录数据库时所使用的用户名和密码。具体示例创建MySQL的数据库连接代码如下:

Connection connectMySQL  =  DriverManager.geiConnection(“jdbc:mysql://localhost:3306/myuser","root" ,"root" );

4、创建Statement对象:Statement 类的主要是用于执行静态 SQL 语句并返回它所生成结果的对象。通过Connection 对象的 createStatement()方法可以创建一个Statement对象。例如:Statement statament = connection.createStatement(); 具体示例创建Statement对象代码如下:

Statement statamentMySQL =connectMySQL.createStatement();

5、调用Statement对象的相关方法执行相对应的 SQL 语句:通过execuUpdate()方法用来数据的更新,包括插入和删除等操作,例如向staff表中插入一条数据的代码:

statement.excuteUpdate( "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ;

通过调用Statement对象的executeQuery()方法进行数据的查询,而查询结果会得到 ResulSet对象,ResulSet表示执行查询数据库后返回的数据的集合,ResulSet对象具有可以指向当前数据行的指针。通过该对象的next()方法,使得指针指向下一行,然后将数据以列号或者字段名取出。如果当next()方法返回null,则表示下一行中没有数据存在。使用示例代码如下:

ResultSet resultSel = statement.executeQuery( "select * from staff" );

6、关闭数据库连接:使用完数据库或者不需要访问数据库时,通过Connection的close() 方法及时关闭数据连接。

代码demo

  1. <pre name="code" class="java">package chp07;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. public class JDBC_Test {
  8. // 创建静态全局变量
  9. static Connection conn;
  10. static Statement st;
  11. public static void main(String[] args) {
  12. insert();   //插入添加记录
  13. update();   //更新记录数据
  14. delete();   //删除记录
  15. query();    //查询记录并显示
  16. }
  17. /* 插入数据记录,并输出插入的数据记录数*/
  18. public static void insert() {
  19. conn = getConnection(); // 首先要获取连接,即连接到数据库
  20. try {
  21. String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"
  22. + " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')";  // 插入数据的sql语句
  23. st = (Statement) conn.createStatement();    // 创建用于执行静态sql语句的Statement对象
  24. int count = st.executeUpdate(sql);  // 执行插入操作的sql语句,并返回插入数据的个数
  25. System.out.println("向staff表中插入 " + count + " 条数据"); //输出插入操作的处理结果
  26. conn.close();   //关闭数据库连接
  27. } catch (SQLException e) {
  28. System.out.println("插入数据失败" + e.getMessage());
  29. }
  30. }
  31. /* 更新符合要求的记录,并返回更新的记录数目*/
  32. public static void update() {
  33. conn = getConnection(); //同样先要获取连接,即连接到数据库
  34. try {
  35. String sql = "update staff set wage='2200' where name = 'lucy'";// 更新数据的sql语句
  36. st = (Statement) conn.createStatement();    //创建用于执行静态sql语句的Statement对象,st属局部变量
  37. int count = st.executeUpdate(sql);// 执行更新操作的sql语句,返回更新数据的个数
  38. System.out.println("staff表中更新 " + count + " 条数据");      //输出更新操作的处理结果
  39. conn.close();   //关闭数据库连接
  40. } catch (SQLException e) {
  41. System.out.println("更新数据失败");
  42. }
  43. }
  44. /* 查询数据库,输出符合要求的记录的情况*/
  45. public static void query() {
  46. conn = getConnection(); //同样先要获取连接,即连接到数据库
  47. try {
  48. String sql = "select * from staff";     // 查询数据的sql语句
  49. st = (Statement) conn.createStatement();    //创建用于执行静态sql语句的Statement对象,st属局部变量
  50. ResultSet rs = st.executeQuery(sql);    //执行sql查询语句,返回查询数据的结果集
  51. System.out.println("最后的查询结果为:");
  52. while (rs.next()) { // 判断是否还有下一个数据
  53. // 根据字段名获取相应的值
  54. String name = rs.getString("name");
  55. int age = rs.getInt("age");
  56. String sex = rs.getString("sex");
  57. String address = rs.getString("address");
  58. String depart = rs.getString("depart");
  59. String worklen = rs.getString("worklen");
  60. String wage = rs.getString("wage");
  61. //输出查到的记录的各个字段的值
  62. System.out.println(name + " " + age + " " + sex + " " + address
  63. + " " + depart + " " + worklen + " " + wage);
  64. }
  65. conn.close();   //关闭数据库连接
  66. } catch (SQLException e) {
  67. System.out.println("查询数据失败");
  68. }
  69. }
  70. /* 删除符合要求的记录,输出情况*/
  71. public static void delete() {
  72. conn = getConnection(); //同样先要获取连接,即连接到数据库
  73. try {
  74. String sql = "delete from staff  where name = 'lili'";// 删除数据的sql语句
  75. st = (Statement) conn.createStatement();    //创建用于执行静态sql语句的Statement对象,st属局部变量
  76. int count = st.executeUpdate(sql);// 执行sql删除语句,返回删除数据的数量
  77. System.out.println("staff表中删除 " + count + " 条数据\n");    //输出删除操作的处理结果
  78. conn.close();   //关闭数据库连接
  79. } catch (SQLException e) {
  80. System.out.println("删除数据失败");
  81. }
  82. }
  83. /* 获取数据库连接的函数*/
  84. public static Connection getConnection() {
  85. Connection con = null;  //创建用于连接数据库的Connection对象
  86. try {
  87. Class.forName("com.mysql.jdbc.Driver");// 加载Mysql数据驱动
  88. con = DriverManager.getConnection(
  89. "jdbc:mysql://localhost:3306/myuser", "root", "root");// 创建数据连接
  90. } catch (Exception e) {
  91. System.out.println("数据库连接失败" + e.getMessage());
  92. }
  93. return con; //返回所建立的数据库连接
  94. }
  95. }

最新文章

  1. Python与PHP通过XMLRPC进行通信
  2. 报错:org.hibernate.AssertionFailure: null id in com.tt.hibernate.entities.News entry (don&#39;t flush the Session after an exception occurs)
  3. linux 学习 软件工具
  4. ORACLE--分区表数据清理
  5. Android照相机模块编程 照片颠倒问题及查询摄像头参数问题的解决
  6. 阿里云linux服务器安装Phalcon-----&quot;phalcon Volt directory can&#39;t be written&quot; &quot;gcc: internal compiler error: Killed (program cc1)&quot;
  7. Object类介绍
  8. Min and Max
  9. Android™ 1.5 android.R.drawable Icon Resources
  10. LeetCode(37)-Minimum Depth of Binary Tree
  11. JQuery官方学习资料(译):选择元素
  12. Mybatis学习总结(六)——高级映射(一对一,一对多,多对多)
  13. Linux内核分析——第三章 进程管理
  14. 简单解决“ORA-27100: shared memory realm already exists”的问题
  15. Five Great .NET Framework 4.5 Features (五大特性)
  16. FireDAC探索 (二)
  17. VMware vCenter Server 6.5.0 U1g
  18. yum安装 指定安装目录
  19. asp.net中label控件设置字体大小
  20. oracle导入TXT文件

热门文章

  1. unity ugui image更换图片
  2. Http请求头缓存设置方法
  3. 服务端相关知识学习(一)之什么是zookeeper
  4. VC++ warning C4819 的解决方法(转)
  5. 微信小程序子传父
  6. mybatis批量更新表setting parameters 错误
  7. golang实现RSA加密解密
  8. Delphi TIdUDPServer组件
  9. 在values中添加colors.xml
  10. Java语言基础(13)