java中级阶段 - 连接数据库(JDBC、Dao)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: JDBC、Dao

1.JDBC基本使用

导读补充

1.1.JDBC是什么?

java DataBase Connectivity (Java语言连接数据库)

1.2.JDBC的本质是什么?

JDBC是sun公司制定的一套接口(interface)

接口都有调用者和实现者。

面向接口调用、面向接口写实现类,这都属于面向接口编程

  • 为什么要面向接口编程?
  • 解耦合:降低程序的耦合度,提高程序的扩展力。
  • 多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)

3.png

1.3.JDBC七步走

package com.Li.JDBCs;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * @Description: JDBC七步走
 * @auther:Li Ya Hui
 * @Time:2021年5月20日下午3:41:38
 */
public class Test {
  public static void main(String[] args) throws ClassNotFoundException, SQLException{
    //连库四要素
    String driverName =  "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/class2021change?useUnicode=true&characterEncoding=utf-8";
    String userName = "root";
    String Password = "root";
    String sql_query = "select * from student";
    //1.加载驱动
    Class.forName(driverName);
    //2.指定URL/用户名+密码
    Connection conn = DriverManager.getConnection(url, userName, Password);
    //3.获取链接
    if(!conn.isClosed()) 
    {
      System.out.println("连接成功了");
      //4.创建stmt对象
      Statement stmt = conn.createStatement();
      //5.执行sql语句
      ResultSet rs = stmt.executeQuery(sql_query);
      //6.循环结果集对象 
      while (rs.next()) {
System.out.println(rs.getString("sno")+"\t"+rs.getString("sname")+"\t"+rs.getInt("sage")+"\t"+rs.getString("ssex"));
      }
      //7.关闭连接
      rs.close();
      stmt.close();
      conn.close();
    }
  }
}

2.Dao

把jdbc的七步走 以及增删改查操作封装成自己的类

package com.Li.dao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Description:  利用JDBC重构获取一个Dao工具
 * @auther:Li Ya Hui
 * @Time:2021年5月20日下午6:40:12
 */
public class Dao {
  //连库四要素
  private String driverName =  "com.mysql.jdbc.Driver";
  private String url = "jdbc:mysql://localhost:3306/class2021change?useUnicode=true&characterEncoding=utf-8";
  private String userName = "root";
  private String Password = "root";
  /**
   * @return 1.获取链接
   * @throws ClassNotFoundException
   * @throws SQLException
   */
  private  Connection getConnection() throws ClassNotFoundException, SQLException {
    //1.加载驱动
    Class.forName(driverName);
    //2.指定URL/用户名+密码
    Connection conn = DriverManager.getConnection(url, userName, Password);
    return conn;
  }
  /**
   * @desc 2.释放连接
   * @param conn
   * @param stmt
   * @param rs
   * @throws SQLException
   */
  private  void releaseConnection(Connection conn, Statement stmt, ResultSet rs) throws SQLException {
    //7.关闭连接
    if (rs!=null) {
      rs.close();
    }
    if (stmt!=null)
    {
      stmt.close();     
    }
    if(conn!=null&!conn.isClosed()) 
    {     
      conn.close();
    }
    System.out.println("releaseConnection");
  }
  //ps:我们对数据库的操作,可以最终归纳为四个动作:增删改查
  /**
   * @desc 3.查询全部
   * @param sql
   * @return
   * @throws ClassNotFoundException
   * @throws SQLException
   */
  public List<Map< String , Object >> executeQueryForList(String sql) throws ClassNotFoundException, SQLException{
    System.out.println("查询全部sql语句"+sql);
    Connection conn = this.getConnection();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    List<Map<String ,Object>> list = rsToList(rs);
    this.releaseConnection(conn, stmt, rs);
    return list;
  }
  /**
   * //5.查询单条记录
   * @param sql
   * @return
   * @throws ClassNotFoundException
   * @throws SQLException
   */
  public Map<String, Object> executeQueryForMap(String sql) throws ClassNotFoundException, SQLException{
    System.out.println("查询一条信息");
    Connection conn = null ;
    Statement stmt = null;
    ResultSet rs = null;
    List<Map<String, Object>> list;
    try {
      conn = this.getConnection();
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);
      list = this.rsToList(rs);
      if(!list.isEmpty()) {
        return list.get(0);
      }
    } 
    //释放资源
    finally {
      this.releaseConnection(conn, stmt, rs);
    }
    return null;
  }
  /**
   * @desc 6.查询一共有多少条
   * @param sql
   * @return
   * @throws SQLException
   * @throws ClassNotFoundException
   */
  public int executeQueryForCount(String sql) throws SQLException, ClassNotFoundException 
  {
    System.out.println("查询一共有多少条的sql:"+sql);
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
      conn = this.getConnection();
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);
      if(rs.next()) 
      {
        System.out.println("ss");
        return rs.getInt(1);
      }
    }finally {
      releaseConnection(conn, stmt, rs);
    }
    return 0;
  }
  /**
   * @desc 7.执行添加、删除、修改操作
   * @param sql
   * @return
   * @throws ClassNotFoundException
   * @throws SQLException
   */
  public int  executeUpdate(String sql) throws ClassNotFoundException, SQLException 
  {
    System.out.println("执行添加、修改、删除、等操作的sql"+sql);
    Connection conn = this.getConnection();
    Statement stmt = conn.createStatement();
    //执行sql语句
    int count = stmt.executeUpdate(sql);
    this.releaseConnection(conn, stmt);
    return 0;
  }
  /**
   * @desc 关闭连接
   * @param conn
   * @param stmt
   * @throws SQLException 
   */
  private void releaseConnection(Connection conn, Statement stmt) throws SQLException {
    if (stmt!=null)
    {
      stmt.close();     
    }
    if(conn!=null&!conn.isClosed()) 
    {     
      conn.close();
    }
    System.out.println("releaseConnection");
  }
  /**
   * 4.将rs结果集转变为List 
   * @param rs
   * @return
   * @throws SQLException
   */
  private List<Map<String, Object>> rsToList(ResultSet rs) throws SQLException {
    List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
    System.out.println("表中有:"+rs.getMetaData().getColumnCount()+"列");
    while (rs.next()) //控制循环行
    {
      //创建一个map 收集数据
      Map<String, Object> colsMap = new HashMap<String, Object>();
      //根据
      for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
        switch (rs.getMetaData().getColumnType(i)) {
        case Types.VARCHAR:
          colsMap.put(rs.getMetaData().getColumnName(i), rs.getString(i));
          break;
        case Types.INTEGER:
          colsMap.put(rs.getMetaData().getColumnName(i), rs.getInt(i));
          break;
        case Types.BLOB://二进制  图片类型
          InputStream in = rs.getBinaryStream(i);
          colsMap.put(rs.getMetaData().getColumnName(i), in);
          break;
        default:
          colsMap.put(rs.getMetaData().getColumnName(i), rs.getString(i));
          break;
        }
      }
      rows.add(colsMap);
    }
    return rows;
  }
  public static void main(String[] args) throws Exception{
    Dao dao = new Dao();
        //执行查询表
    System.out.println(dao.executeQueryForList("select * from student"));
    //执行单条记录
    System.out.println(dao.executeQueryForMap("select * from student where sno='s001' "));
    //执行查询条数
    System.out.println(dao.executeQueryForCount("select count(*) from student  "));
    //执行修改
    System.out.println(dao.executeUpdate("update student set sname='李亚辉' where sname='张三'"));
  }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
34 5
|
21天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
35 3
|
21天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
40 2
|
21天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
43 2
|
21天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
|
1月前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
146 1
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
86 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
37 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
47 0
|
3月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
56 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
下一篇
无影云桌面