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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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
目录
相关文章
|
4天前
|
前端开发 关系型数据库 MySQL
【前端学java】MySQL数据库的本地安装
【8月更文挑战第12天】MySQL数据库的本地安装
20 3
|
4天前
|
SQL Java 关系型数据库
【前端学java】JDBC快速入门
【8月更文挑战第12天】JDBC快速入门
11 2
【前端学java】JDBC快速入门
|
5天前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
1天前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
7 1
|
1天前
|
关系型数据库 MySQL 数据库
成功解决:Navicat 连接虚拟机Docker中的mysql数据库失败(仅限某些特殊情况)
这篇文章介绍了在Ubuntu环境中使用Docker部署Flask项目的方法,包括创建测试项目、设置数据库、构建Flask和Nginx镜像以及容器编排,其中使用了MySQL 5.7作为数据库,Flask 2.0.2作为Web框架,Gunicorn 20.1.0作为应用服务器,Nginx 1.21.4作为反向代理,并解决了Navicat连接Docker中的MySQL数据库失败的问题。
|
5天前
|
数据库 知识图谱
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库
12 0
|
5天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
2月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
1月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
35 0
|
SQL 关系型数据库 MySQL
Java连接MySQL改成连接SQL Server数据库
Java连接MySQL改成连接SQL Server数据库
168 0