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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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='张三'"));
  }
}
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
安全 Java 数据库连接
gbase8a JDBC常用特性-Kerberos认证方式连接
JDBC常用特性-Kerberos认证方式连接
|
1月前
|
Java 数据库连接 网络安全
JDBC常用特性-SSH隧道连接
JDBC常用特性-SSH隧道连接
|
1天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
5天前
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
38 7
|
5天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
54 6
|
5天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
25 5
|
5天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
20 2
|
1月前
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
229 31
|
30天前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
2月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例