Skip to content
标签
数据库
字数
1671 字
阅读时间
8 分钟

一、概述

是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。可以通过jdbc代码实现对数据库的操作。包括DDL,DML,DQL等。

1.1 主要对象

  • DriverManager:注册驱动,创建连接
  • Connection:创建的连接对象
  • Statement:操作数据库的语句对象,执行语句返回结果的对象,有三种
    • Statement:用于执行不带参数的简单SQL语句
    • PreparedStatement(从 Statement 继承):用于执行带或不带参数的预编译SQL语句;
    • CallableStatement(从PreparedStatement 继承):用于执行数据库存储过程的调用
  • ResultSet:结果集

1.2 获取结果方法

方法作用
ResultSet executeQuery(String sql)可以执行插入、删除、更新等操作,返回值是执行该操作所影 响的行数
boolean execute(String sql)可以执行任意SQL语句,然后获得一个布尔值,表示是否返回 ResultSet
int executeUpdate(String sql)执行SQL查询并获取到ResultSet对象

1.3 SQL预编译方法

java
//PreparedStatement 对象的方法
void setString (int parameterIndex, String x)
void setFloat (int parameterIndex, float x)
void setInt (int parameterIndex, int x)
void setDate (int parameterIndex, java.sql.Date x)
void setDouble (int parameterIndex, double x)
ResultSet executeQuery () //返回单结果集,通常用于SELECT语句
boolean execute () //返回布尔值,通常用于insert,update,delete语句
int executeUpdate () //返回操作影响的行数,通常用于insert,update,delete语句

1.4 ResutSet方法

方法名说 明
boolean next()将光标从当前位置向下移动一行
boolean previous()游标从当前位置向上移动一行
void close()关闭ResultSet 对象
int getInt(int colIndex)以int形式获取结果集当前行指定列号值
int getInt(String colLabel)以int形式获取结果集当前行指定列名值
float getFloat(int colIndex)以float形式获取结果集当前行指定列号值
float getFloat(String colLabel)以float形式获取结果集当前行指定列名值
String getString(int colIndex)以String 形式获取结果集当前行指定列号值
String getString(String colLabel)以String形式获取结果集当前行指定列名值

1.5 事务使用

  • 在JDBC中,事务操作缺省是自动提交,操作成功后,系统将自动调用commit()提交,否则调用rollback()回滚

  • 在JDBC中,事务操作方法都位于接口java.sql.Connection中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,

    • 倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;
    • 此时就可以在异常捕获时调用rollback()进行回滚,回复至数据初始状态
  • 事务结束的边界是commit或者rollback方法的调用

  • 使用conn.setAutoCommit(false);取消自动事务,通过 conn.commit();提交事务,通过 conn.rollback();回滚事务

二、使用示例

2.1 使用Demo

java
package com.note.technology.jdbc;

import java.sql.*;

/**
 * @Classname JdbcDemo
 * @Description TODO
 */
public class JdbcDemo {

    /**
     * @Description: 测试增删改  sql语句不同,其他相同
     * @param
     * @return: void
     * @date: 2022/04/08
     */
    public void testOperation()  {
        //使用预编译sql sql中使用? Statement使用set方法。替换?的索引从1开始
        String insertSql = "insert into user (name,age) values(?,?)";
        // 获取连接对象
        Connection connection = JdbcUtil.getConnection();
        //Statement sql使用拼接形式,需手动拼接,存在sql注入风险,执行是通过statement直接执行sql语句
//        Statement statement = connection.createStatement();
//        statement.executeUpdate(insertSql);
        PreparedStatement preparedStatement = null;
        try {
            // 操作数据库的语句对象,执行语句返回结果的对象
            preparedStatement = connection.prepareStatement(insertSql);
			// setXxx(参数1,参数2) * 参数1:?的位置编号 从1 开始 * 参数2:?的值
            preparedStatement.setString(1,"zhangsan");
            preparedStatement.setInt(2,16);
            // 返回影响的行数
            int i = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 关闭资源
            JdbcUtil.closeAll(null,preparedStatement,connection);
        }
    }

    /**
     * @Description: 测试查询功能
     * @param
     * @return: void
     * @date: 2022/04/08
     */
    public void testQuery(){
        String sql="select id,name,age from user where name= ? ";
        // 获取连接对象
        Connection connection = JdbcUtil.getConnection();
        // 查询语句的对象
        PreparedStatement stmt=null;
        // 返回结果的对象
        ResultSet rs=null;
        try {
            stmt=connection.prepareStatement(sql);
            // 对象创建之后 ,方法执行之前 ,我们需要给占位符 ? 赋值
            //sql语句中有几个问号,我们就赋值 几个
            //该方法有两个参数 ,第一个参数表示  你要设置?的索引 ,是第几个 ,第二个参数表示你要设置值的内容
            stmt.setString(1,"zhangsan");
            rs=stmt.executeQuery();
            // next true代表存在返回结果 getXXX  XXX标识数据类型。 当入参参数为String,标识列的名称,为int参数则标识列标号,从1开始
            if(rs.next()) {
                System.out.println("name:"+rs.getString("name")+",age:"+rs.getInt("age"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtil.closeAll(rs,stmt,connection);
        }
    }
    
    void testTransaction(){
        try {
            // ============开启事务==========
            conn.setAutoCommit(false);
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            //6. 处理结果
            System.out.println(count1);
            int i = 3/0;
            //5. 执行sql
            int count2 = stmt.executeUpdate(sql2);//受影响的行数
            //6. 处理结果
            System.out.println(count2);

            // ============提交事务==========
            //程序运行到此处,说明没有出现任何问题,则需求提交事务
            conn.commit();
        } catch (Exception e) {
            // ============回滚事务==========
            //程序在出现异常时会执行到这个地方,此时就需要回滚事务
            conn.rollback();
            e.printStackTrace();
        }

        //7. 释放资源
        stmt.close();
        conn.close();
    }

}

2.2 数据库连接池连接

java
// C3P0   
// 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
// 定义配置文件:名称: c3p0.properties 或者 c3p0-config.xml
//1.创建数据库连接池对象
DataSource ds  = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();

// Druid
// 导入jar包 druid-1.0.9.jar
// 义配置文件:  是properties形式的
//3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();

2.3 封装简单工具类

java
import java.sql.*;

/**
 * @Classname JdbcUtil
 * @Description TODO
 */
public class JdbcUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "1234";

    static {
        try {
            // 加载驱动
            //Class.forName(“oracle.JDBC.driver.OracleDriver”);//使用Oracle的JDBC驱动程序
			//Class.forName(“com.microsoft.JDBC.sqlserver.SQLServerDriver”);//使用SQL Server的JDBC驱动程序
			//Class.forName(“com.ibm.db2.JDBC.app.DB2Driver”);//使用DB2的JDBC驱动程序
			//Class.forName("com.mysql.JDBC.Driver");//使用MySql的JDBC驱动程
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(URL,USERNAME,PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }



    /**
     * 关闭资源
     */

    public static void  closeAll(ResultSet rs, Statement stmt, Connection conn){
        try {
            if(rs!=null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(stmt!=null) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(conn!=null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}