JDBC快速上手使用详解

    xiaoxiao2025-04-17  14

    一、概念

    1、JDBC(Java Data Base Connectivity,Java数据库连接)   是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 2、数据库驱动   我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。

    二、JDBC由两层构成

    三、步骤

    ①加载JDBC驱动程序②建立数据库连接Connection③创建执行SQL的语句Statement④处理执行结果ResultSet⑤释放资源

    使用后依次关闭对象及连接:ResultSet → Statement → Connection

    四、常用接口

    1、Driver接口

    Driver接口由数据库厂家提供,对于Java开发者而言,只需要使用Driver接口就可以了。 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。

    驱动:就是各个厂商实现Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件。

    装载mysql驱动:Class.forName(“com.mysql.jdbc.Driver”);

    装载oracle驱动:Class.forName(“com.jdbc.driver.OracleDriver”);

    查阅API文档:

    2、Connection接口

    Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

    连接MySql数据库:Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”);

    连接Oracle数据库:Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@host:port:database”, “user”, “password”);

    连接SqlServer数据库:Connection conn = DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port; DatabaseName=database”, “user”, “password”);

    常用方法: close()----- 关闭该数据库连接 commit()------ 提交所有更改内容(事务)并释放该Connection对象锁定的资源 createStatement()-----基于本Connection对象,创建Statement对象 getAutoCommit()-----获取当前是否是自动提交模式 getMetaData()---- 获取本连接相关的数据库元数据 isClosed()----- 返回当前连接对象是否已经被关闭 preparedStatement()------ 基于本连接对象,创建PreparedStatement对象 rollback()----- 取消本轮事务中前面已经提交的更改(回滚) setAutoCommmit(boolean autoCommit)------- 设置事务是否自动提交 prepareCall(sql)--------创建执行存储过程的callableStatement对象。

    3.Statement接口

    用于执行静态SQL语句并返回它所生成结果的对象。

    三种Statement类: ①Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。 ②PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。 ③CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

    常用Statement方法: execute(String sql):运行语句,返回是否有结果集 executeQuery(String sql):运行select语句,返回ResultSet结果集。 executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。 addBatch(String sql) :把多条sql语句放到一个批处理中。 executeBatch():向数据库发送一批sql语句执行。

    4.ResultSet接口

    表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。常用方法: close() ---------------- 关闭ResultSet对象 getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。 getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。 getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。 getlnt(int collndex) ---------------- 以int形式获取结果集当前行指定列号值 getlnt(String colLabel) ---------------- 以int形式获取结果集当前行指定列名值 getFloat(String collndex) ---------------- 以float形式获取结果集当前行指定列名值 getFloat(String colLabel) ---------------- 以float形式获取结果集当前行指定列名值 getString(int collndex) ---------------- 以String形式获取结果集当前行指定列号值 getString(String colLable) ---------------- 以String形式获取结果集当前指定列名值 next():移动到下一行 Previous():移动到前一行 absolute(int row):移动到指定行 beforeFirst():移动resultSet的最前面。 afterLast() :移动到resultSet的最后面。

    五、细节

    1、注册驱动 (只进行一次)

    记得进行异常处理

    Class.forName("com.MySQL.jdbc.Driver");

    2、建立连接

    Connection conn = DriverManager.getConnection(url, user, password);

    URL的格式:(第三行) MySql:jdbc:mysql://localhost:xxx/xxx

    六、例子一

    简单的顺序输出表

    /** * 顺序查询 */ package com.study.mysql.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test1 { public static Connection conn; public static Statement sql; public static ResultSet rs; public static final String url = "jdbc:mysql://localhost:3306/ming"; public static final String user = "root"; public static final String password = "******"; public Connection getConnection() {// 将连接数据库的方法放在一起 try { Class.forName("com.mysql.jdbc.Driver");//注册驱动 } catch (ClassNotFoundException e) { e.printStackTrace(); } try { conn = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } return conn;// 返回Connection对象 } public static void main(String[] args) { Test1 t = new Test1(); t.getConnection();// 连接数据库 try { sql = conn.createStatement();//实例化Statement对象 //执行sql语句 rs = sql.executeQuery("select * from test_02;"); while(rs.next()) {//如果当前语句不是最后一条,则进行循环(最后一条则返回false) String id = rs.getString("id");//获取列名是id的字段值 String name = rs.getString("name");//获取列名是name的字段值 String sex = rs.getString("sex");//获取列名是sex的字段值 String birthday = rs.getString("birthday");//获取列名是birthday的字段值 System.out.print( " | " + "编号:" + id + " | "); System.out.print(" 姓名:" + name+ " | "); System.out.print(" 性别:" + sex+ " | "); System.out.println(" 出生日期:" + birthday+ " | "); } }catch(Exception e) { e.printStackTrace(); } } }

    七、例子二

    CURD(增删改查)操作

    /** * 简单的CURD */ package com.study.mysql.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Test5 { public static Connection conn; public static PreparedStatement sql;// 声明预处理对象 public static java.sql.ResultSet rs;// 声明结果集对象 public static final String url = "jdbc:mysql://localhost:3306/ming"; public static final String user = "root"; public static final String password = "******"; public Connection getConnection() {// 连接数据库 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { conn = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } return conn;// 返回Connection对象 } public void shutConn() {// 关闭连接 // 关闭连接,释放资源 if (rs != null) {// 查询结果集 try { rs.close(); } catch (Exception e) { e.printStackTrace(); } rs = null; } if (sql != null) {// sql语句 try { sql.close(); } catch (Exception e) { e.printStackTrace(); } } if (conn != null) {// 连接 try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { Test5 t = new Test5(); t.getConnection();// 获取连接 try { sql = conn.prepareStatement("select * from test_02"); rs = sql.executeQuery(); System.out.println("------------------执行CURD前的数据------------------"); while (rs.next()) { String id = rs.getString("id");// 获取列名是id的字段值 String name = rs.getString("name");// 获取列名是name的字段值 String sex = rs.getString("sex");// 获取列名是sex的字段值 String birthday = rs.getString("birthday");// 获取列名是birthday的字段值 System.out.print(" | " + "编号:" + id + " | "); System.out.print(" 姓名:" + name + " | "); System.out.print(" 性别:" + sex + " | "); System.out.println(" 出生日期:" + birthday + " | "); } // 预处理添加数据 sql = conn.prepareStatement("insert into test_02 values(?,?,?,?)"); sql.setInt(1, 5); sql.setString(2, "张一"); sql.setString(3, "女"); sql.setString(4, "2012-08-08"); sql.executeUpdate(); // 预处理更新数据 sql = conn.prepareStatement("update test_02 set birthday = ? where id = ?"); sql.setString(1, "2018-8-27"); sql.setInt(2, 3); sql.executeUpdate(); // 预处理删除数据 sql = conn.prepareStatement("delete from test_02 where id = ? "); sql.setInt(1, 1); sql.executeUpdate(); System.out.println("------------------执行CURD后的数据------------------"); // 查询修改后的数据 sql = conn.prepareStatement("select * from test_02"); rs = sql.executeQuery(); while (rs.next()) { String id = rs.getString("id");// 获取列名是id的字段值 String name = rs.getString("name");// 获取列名是name的字段值 String sex = rs.getString("sex");// 获取列名是sex的字段值 String birthday = rs.getString("birthday");// 获取列名是birthday的字段值 System.out.print(" | " + "编号:" + id + " | "); System.out.print(" 姓名:" + name + " | "); System.out.print(" 性别:" + sex + " | "); System.out.println(" 出生日期:" + birthday + " | "); } } catch (Exception e) { e.printStackTrace(); } t.shutConn();// 关闭连接 } }

    最新回复(0)