JDBC连接数据库步骤及基本操作示例详解

 更新时间:2023年11月23日 11:30:13   作者:bug生产者  
这篇文章主要为大家介绍了JDBC连接数据库步骤及基本操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

JDBC基本操作

create table user(
    id int primary key auto_increment,
    name varchar(50)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8;

JDBC概念

JDBC是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口,定义了用来访问数据库的标准的Java类库

连接步骤

  • 加载驱动
  • 进行数据库连接
// 驱动
private static final String DRIVER = "com.mysql.jdbc.Driver";
// 地址
private static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
private static final String USER_NAME = "root";
// 密码
private static final String PSW = "123456";
/**
 *  获取连接
 */
public static Connection getConnection(){
  Connection conn = null;
  try {
    // 加载驱动
    Class.forName(DRIVER);
    // 数据库连接
    conn = DriverManager.getConnection(URL,USER_NAME,PSW);
  } catch (ClassNotFoundException e) {
    System.out.println("加载驱动失败,请检查是否引入Jar包或者驱动名称是否正确");
    throw new RuntimeException("加载驱动失败,请检查是否引入Jar包或者驱动名称是否正确",e);
  } catch (SQLException throwables) {
    System.out.println("连接数据库失败,请检查数据库地址,用户名,密码是否正确");
    throw new RuntimeException("连接数据库失败,请检查数据库地址,用户名,密码是否正确",throwables);
  }
  return conn;
}
/**
* 关闭连接
* @param conn
*/
public static void close(Connection conn){
  if(conn != null){
    try {
      conn.close();
    } catch (SQLException throwables) {
      throwables.printStackTrace();
    }
  }
}

注意:为什么需要使用Class.forName()来加载数据库驱动

是因为在每个Driver中都包含有一个静态代码块,实际调用的是DriverManager.registerDriver(new Driver());方法

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

DriverManager

该类进行数据库驱动的管理,可以注册多个数据库驱动,根据url来动态的选择不同的数据库连接。

操作数据库

Statement接口

使用Statement接口来操作静态的SQL语句

executeUpdate方法

添加

/**
* 插入操作
* @param sql
*/
public static void doInsert(String sql){
  Connection conn = getConnection();
  Statement statement = null;
  try {
    statement = conn.createStatement();
    int result = statement.executeUpdate(sql);
    System.out.println(sql+"执行成功,插入"+result+"条数据");
  } catch (SQLException e) {
    throw new RuntimeException("执行失败",e);
  } finally {
    if(statement != null){
      try {
        statement.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
    close(conn);
  }
}

修改

/**
     * 修改操作
     * @param sql
     */
    public static void doUpdate(String sql){
        Connection conn = getConnection();
        Statement statement = null;
        try {
            statement = conn.createStatement();
            int result = statement.executeUpdate(sql);
            System.out.println(sql+"执行成功,修改"+result+"条数据");
        } catch (SQLException e) {
            throw new RuntimeException("执行失败",e);
        } finally {
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
          close(conn);
        }
    }

删除

/**
     * 删除操作
     * @param sql
     */
    public static void doDelete(String sql){
        Connection conn = getConnection();
        Statement statement = null;
        try {
            statement = conn.createStatement();
            int result = statement.executeUpdate(sql);
            System.out.println(sql+"执行成功,删除"+result+"条数据");
        } catch (SQLException e) {
            throw new RuntimeException("执行失败",e);
        } finally {
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
          close(conn);
        }
    }

PreparedStatement接口

该接口为Statement的子接口,属于预处理操作,可以传入带有占位符的SQL,然后再进行补充占位符,索引值从1开始。

可以有效地禁止SQL注入

executeUpdate方法

插入

public static void doPreparedInsert(String name){
  Connection conn = getConnection();
  PreparedStatement statement = null;
  try {
    String sql = "insert into user (name) values (?)";
    statement = conn.prepareStatement(sql);
    statement.setString(1,name);
    int result = statement.executeUpdate();
    System.out.println(sql+"执行成功,插入"+result+"条数据");
  } catch (SQLException e) {
    throw new RuntimeException("执行失败",e);
  } finally {
    if(statement != null){
      try {
        statement.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
    close(conn);
  }
}

在创建preparedStatement对象时,有一个重载方法

// 第二个参数表示一个是否返回自增主键的一个biaoshi
// Statement.RETURN_GENERATED_KEYS
// Statement.NO_GENERATED_KEYS
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)

在使用该PreparedStatement执行插入操作时,可以使用statement.getGeneratedKeys()来返回一个新生成主键的ResultSet对象,结果集中只有一列GENERATED_KEY,存放的新生成的主键值

更新

与插入类似

删除

与插入类似

结果集

在查询数据时,返回的是一个二维的结果集,使用ResultSet来遍历结果集

public static void doQuery(){
  String sql = "select * from user";
  Connection conn = getConnection();
  PreparedStatement statement = null;
  ResultSet resultSet = null;
  try {
    statement = conn.prepareStatement(sql);
    resultSet = statement.executeQuery();
    // resultSet.next 方法  将光标向前移动一行,最初为第一行之前,第一次调用使得第一行为当前行
    while (resultSet.next()){
      int id = resultSet.getInt("id");
      String name = resultSet.getString("name");
      System.out.println("查询到id为"+id+",name为"+name+"的记录");
    }
  } catch (SQLException throwables) {
    throwables.printStackTrace();
  } finally {
    if(resultSet != null){
      try {
        resultSet.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
    close(conn,statement);
  }
}

批量操作

public static void doBatchInsert(String sql){
  Connection conn = getConnection();
  PreparedStatement statement = null;
  try {
    statement = conn.prepareStatement(sql);
    for(int i = 0;i<1000;i++){
      statement.setString(1,"张三"+i);
      // 积攒sql
      statement.addBatch();
    }
    // 执行sql
    statement.executeBatch();
    // 清除积攒的sql
    statement.clearBatch();
  } catch (SQLException throwables) {
    throwables.printStackTrace();
  } finally {
    close(conn,statement);
  }

}

以上就是JDBC连接数据库步骤及基本操作示例详解的详细内容,更多关于JDBC连接基本操作的资料请关注脚本之家其它相关文章!

相关文章

  • Spring Boot 优雅整合多数据源

    Spring Boot 优雅整合多数据源

    这篇文章主要介绍了Spring Boot 优雅整合多数据源,多数据源就是在一个单一应用中涉及到了两个及以上的数据库,更多相关内容需要的小伙伴可以参考下面文章介绍
    2022-05-05
  • java方法重写(重点讲),方法重载问题

    java方法重写(重点讲),方法重载问题

    这篇文章主要介绍了java方法重写(重点讲),方法重载问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java接收ios文件上传的示例代码

    java接收ios文件上传的示例代码

    这篇文章主要为大家详细介绍了java接收ios文件上传的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 常用Java排序算法详解

    常用Java排序算法详解

    本文主要介绍了java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆排序进行原理分析与实例介绍,具有很好的参考价值。下面就跟着小编一起来看下吧
    2016-12-12
  • java日志门面之JCL和SLF4J详解

    java日志门面之JCL和SLF4J详解

    这篇文章主要给大家介绍了关于java日志门面之JCL和SLF4J的相关资料,在系统开发过程中日志框架的选择与更换是一大挑战,日志门面的概念,如JCL和SLF4J,允许开发者面向接口编程,文中介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • java 文件上传到读取文件内容的实例

    java 文件上传到读取文件内容的实例

    今天小编就为大家分享一篇java 文件上传到读取文件内容的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java集合中的CopyOnWriteArrayList使用详解

    Java集合中的CopyOnWriteArrayList使用详解

    这篇文章主要介绍了Java集合中的CopyOnWriteArrayList使用详解,CopyOnWriteArrayList是ArrayList的线程安全版本,从他的名字可以推测,CopyOnWriteArrayList是在有写操作的时候会copy一份数据,然后写完再设置成新的数据,需要的朋友可以参考下
    2023-12-12
  • SpringBoot实现定时任务动态管理示例

    SpringBoot实现定时任务动态管理示例

    这篇文章主要为大家介绍了SpringBoot实现定时任务动态管理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • SpringSecurity构建基于JWT的登录认证实现

    SpringSecurity构建基于JWT的登录认证实现

    这篇文章主要介绍了SpringSecurity构建基于JWT的登录认证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java创建对象的几种方法

    Java创建对象的几种方法

    这篇文章主要为大家详细介绍了Java创建对象的几种方法,使用new创建、使用object.clone()创建、使用反序列化创建等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论