• 使用JDBC连接操作数据库


    JDBC简介

    • Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成。
    • JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
    • 使用JDBC编写的程序能够自动地将SQL语句传送给相应的数据库管理系统。
    • JDBC 是个"低级"接口,也就是说,它用于直接调用 SQL 命令。在这方面它的功能极佳,并比其它的数据库连接 API 易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的 API,这种API在幕后被转换为诸如 JDBC 这样的低级接口。
    • JDBC扩展了Java的功能,由于Java语言本身的特点,使得JDBC具有简单、健壮、安全、可移植、获取方便等优势。

    JDBC中常用类和接口

    接口/类功能说明
    DriverManager 数据库驱动管理类,用于加载和卸载各种驱动程序,并建立于数据库的连接
    Connection 此接口用于连接数据库
    Statement 此接口用于执行SQL语句并将数据检索到ResultSet中
    ResultSet 结果集接口,提供检索SQL语句返回数据的各种方法
    PreparedStatement 此接口用于执行预编译的SQL语句
    CallableStatement 此接口用于执行SQL存储过程的语句

    JDBC开发步骤

    • 注册驱动
    • 建立连接
    • 创建statement
    • 执行sql,得到ResultSet
    • 查看结果
    • 释放资源

    开发第一个JDBC程序

    源码

     1 package com.jyroy.test;
     2 
     3 import java.sql.DriverManager;
     4 import java.sql.ResultSet;
     5 import java.sql.SQLException;
     6 import java.sql.Statement;
     7 
     8 import com.jyroy.util.JDBCUtil;
     9 
    10 import java.sql.Connection;
    11 import java.sql.Driver;
    12 
    13 public class MainTest {
    14 
    15     public static void main(String[] args) {
    16         Connection connection = null;
    17         Statement st = null;
    18         ResultSet rs = null;
    19         
    20         try {
    21             //1.注册驱动
    22             DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    23             
    24             //2.建立连接
    25             //方法一  参数一:协议+访问数据库,参数二:用户名,参数三:密码
    26             connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password");
    27             
    28             //方法二
    29 //            DriverManager.getConnection("jdbc:msql://localhost/student?user=root&password=password");
    30             
    31             //3.创建statement,跟数据库打交道一定需要这个对象
    32             st = connection.createStatement();
    33             
    34             //4.执行查询
    35             String sql = "select * from stu";
    36             rs = st.executeQuery(sql);
    37             
    38             //5.遍历查询每一条记录
    39             while(rs.next()) {
    40                 int id = rs.getInt("id");
    41                 String name = rs.getString("name");
    42                 int age = rs.getInt("age");
    43                 
    44                 System.out.println("id = " + id + "; name = " + name + "; age = " + age);
    45             }
    46              //进行资源释放
    47             connection.close();
    48             st.close();
    49             rs.close();
    50 
    51         } catch (SQLException e) {
    52             e.printStackTrace();
    53         }
    54     }
    55 }
    56     

    结果

    使用工具类

      借助工具类来方便JDBC的操作

    获取数据库连接

      建立数据库连接的类,里面封装好实现数据库连接的函数,方便调用实现数据库连接

      这里说两个问题:

      一:

      这里多用了一个 Class.forName("com.mysql.jdbc.Driver"); 因为

      在上面的例子中,Driver这个类里面有静态代码块(java.sql.DriverManager.registerDriver(new Driver())),我们在new的时候一开始就加载了Driver类,相当于注册了两次驱动,为了避免这个情况,使用Class.forName("com.mysql.jdbc.Driver");来进行驱动的注册。

      二:

      根据JDBC官方文档,在JDBC5之后,Class.forName(); 的注册驱动,官方已经帮我们实现了,我们不加载驱动(JDBC会自动识别使mysql还是oracl什么的,当然了,如果同时用了mysql和oracl就要写上了,这个时候就没法自动确定了),直接建立连接也是可以的,大家可以自己试一下把Class.forName();这句话注释掉,也是可以完美运行的!

     1 package com.jyroy.DBUtil;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.SQLException;
     6 
     7 public class DBUtil {
     8 
     9     private static Connection connection=null;
    10     
    11     static {
    12         try {
    13             //1.加载驱动程序
    14             Class.forName("com.mysql.jdbc.Driver");
    15             //2.获得数据库的连接
    16             connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password");
    17             
    18         } catch (ClassNotFoundException e) {
    19             e.printStackTrace();
    20         } catch (SQLException e) {
    21             e.printStackTrace();
    22         }
    23     }
    24     //将获得的数据库与java的链接返回(返回的类型为Connection)
    25     public static Connection getConnection(){
    26         return connection;
    27     }
    28 }

      我们在MainTest中调用

    1 connection = DBUtil.getConnection();

      运行之后,同样可以得到相同的查询结果

    进行资源释放

      上面的资源释放,只是简单的close掉了,更好的办法释放资源还是在finally语句块中,因此重新编写代码,使用finally语句块,我这里直接写了一个工具类,让代码更清晰一点。

        finally一般拿来做一些善后清理工作,当try块里出现错误的话,会立即跳出try块,找到匹配的错误,执行catch块里的语句,此时,可能在try块里打开的文件没关闭,连接的网络没断开,对这些浪费的内存就不能及时释放回收,因此利用finally进行一些善后工作
     1 package com.jyroy.util;
     2 
     3 import java.sql.Connection;
     4 import java.sql.ResultSet;
     5 import java.sql.SQLException;
     6 import java.sql.Statement;
     7 
     8 public class JDBCUtil {
     9     /*
    10      释放资源
    11      */
    12     
    13     public static void release(Connection connection, Statement st, ResultSet rs) {
    14         closeConn(connection);
    15         closeRs(rs);
    16         closeSt(st);
    17     }
    18     
    19     private static void closeRs(ResultSet rs) {
    20         try {
    21             if(rs!=null) {
    22                 rs.close();
    23             }
    24         } catch (SQLException e) {
    25             e.printStackTrace();
    26         }finally {
    27             rs = null;
    28         }
    29     }
    30     
    31     private static void closeSt(Statement st) {
    32         try {
    33             if(st!=null) {
    34                 st.close();
    35             }
    36         } catch (SQLException e) {
    37             e.printStackTrace();
    38         }finally {
    39             st = null;
    40         }
    41     }
    42     
    43     private static void closeConn(Connection connection) {
    44         try {
    45             if(connection!=null) {
    46                 connection.close();
    47             }
    48         } catch (SQLException e) {
    49             e.printStackTrace();
    50         }finally {
    51             connection = null;
    52         }
    53     }
    54     
    55 }

      在MainTest类中进行使用

    1 JDBCUtil.release(connection, st, rs);

    数据库的增删查改

    查询

     1 package com.jyroy.test;
     2 
     3 import java.sql.DriverManager;
     4 import java.sql.ResultSet;
     5 import java.sql.SQLException;
     6 import java.sql.Statement;
     7 
     8 import com.jyroy.DBUtil.DBUtil;
     9 import com.jyroy.util.JDBCUtil;
    10 
    11 import java.sql.Connection;
    12 import java.sql.Driver;
    13 
    14 public class MainTest {
    15 
    16     public static void main(String[] args) {
    17         
    18         Connection conn = null;
    19         Statement st = null;
    20         ResultSet rs = null;
    21         
    22         try {
    23             //1.获取连接对象
    24             conn = DBUtil.getConnection();
    25             
    26             //2.根据连接对象,得到statement
    27             st = conn.createStatement();
    28             
    29             //3.执行查询
    30             String sql = "select * from stu";
    31             rs = st.executeQuery(sql);
    32             
    33             //4.遍历输出结果
    34             while(rs.next()) {
    35                 String name = rs.getString("name");
    36                 int age = rs.getInt("age");
    37                 
    38                 System.out.println(name + " " + age);
    39             }
    40             
    41         } catch (SQLException e) {
    42             // TODO 自动生成的 catch 块
    43             e.printStackTrace();
    44         }finally {
    45             JDBCUtil.release(conn, st, rs);
    46         }
    47     }
    48 }

    插入

     1 @Test
     2     public void testInsert() {
     3         Connection conn = null;
     4         Statement st = null;
     5         
     6         try {
     7             //1.获取连接对象
     8             conn = DBUtil.getConnection();
     9             
    10             //2.根据连接对象,得到statement
    11             st = conn.createStatement();
    12             
    13             //3.执行插入
    14             String sql = "insert into stu values(null, 'xiaoming', 12)";
    15             
    16             int result = st.executeUpdate(sql);
    17             
    18             //result表示影响的行数,大于0表示添加成功,否则失败
    19             if(result > 0) {
    20                 System.out.println("添加成功");
    21             }
    22             else {
    23                 System.out.println("添加失败");
    24             }
    25             
    26         } catch (SQLException e) {
    27             // TODO 自动生成的 catch 块
    28             e.printStackTrace();
    29         }finally {
    30             JDBCUtil.release(conn, st);
    31         }
    32     }

    删除

     1 @Test
     2     public void testDelete() {
     3         Connection conn = null;
     4         Statement st = null;
     5         
     6         try {
     7             //1.获取连接对象
     8             conn = DBUtil.getConnection();
     9             
    10             //2.根据连接对象,得到statement
    11             st = conn.createStatement();
    12             
    13             //3.执行删除
    14             String sql = "delete from stu where name = 'xiaoming'";
    15             
    16             int result = st.executeUpdate(sql);
    17             
    18             //result表示影响的行数,大于0表示添加成功,否则失败
    19             if(result > 0) {
    20                 System.out.println("删除成功");
    21             }
    22             else {
    23                 System.out.println("删除失败");
    24             }
    25             
    26         } catch (SQLException e) {
    27             // TODO 自动生成的 catch 块
    28             e.printStackTrace();
    29         }finally {
    30             JDBCUtil.release(conn, st);
    31         }
    32     }

    更新

     1 @Test
     2     public void testUpdate() {
     3         Connection conn = null;
     4         Statement st = null;
     5         
     6         try {
     7             //1.获取连接对象
     8             conn = DBUtil.getConnection();
     9             
    10             //2.根据连接对象,得到statement
    11             st = conn.createStatement();
    12             
    13             //3.执行更新
    14             String sql = "update stu set age = 11 where name = 'zhangsan'";
    15             
    16             int result = st.executeUpdate(sql);
    17             
    18             //result表示影响的行数,大于0表示添加成功,否则失败
    19             if(result > 0) {
    20                 System.out.println("更新成功");
    21             }
    22             else {
    23                 System.out.println("更新失败");
    24             }
    25             
    26         } catch (SQLException e) {
    27             // TODO 自动生成的 catch 块
    28             e.printStackTrace();
    29         }finally {
    30             JDBCUtil.release(conn, st);
    31         }
    32     }
  • 相关阅读:
    Borland C++ Builder Practical learning series
    vmware打开vmx文件不能创建虚拟机的问题
    c3p0 连接数据库失败的问题
    外在 挺直背和走路的问题
    JAVAWEB tomcat服务器启动错误原因总结
    JAVAWEB 项目注册登录模块问题总结
    JAVA eclipse Maven项目红叹号解决方案
    JAVA 文件读取写入后 md5值不变的方法
    Git的安装配置(win环境)
    JAVA 静态方法和实例方法的区别 (图表)
  • 原文地址:https://www.cnblogs.com/jyroy/p/9637149.html
Copyright © 2020-2023  润新知