重生之夯实基础

JDBC复习

JDBC介绍

JDBC(Java DataBase Connectivity) 是Java和数据库之间桥梁,一个规范而不是实现,能够执行SQL语句,具体的实现由不同数据库的生产厂商提供对应的实现接口(jar包),由一组Java语言编写的类和接口组成。本文针对MySQL数据库阐述。

img

JDBC编程:

第一个JDBC程序

  • 装载JDBC驱动并初始化参数

  • 建立JDBC和数据库之间的Connection来连接

  • 创建Statement或者PreparedStatement接口,执行Sql语句

  • 处理和显示结果

  • 释放资源

    简单的一张数据库表

在这里插入图片描述

  1. 导入对应的JDBC驱动并初始化参数(对应的JAR包)

    • 导入对应的jar包(不同的数据库需要不同的驱动)

      下载地址:https://dev.mysql.com/downloads/connector/j/

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      初始化驱动:

      ​ 初始化驱动类com.mysql.cj.jdbc.Driver中(版本不同加上cj 或者 com.mysql.jdbc.Driver),需要捕获异常(idea自动补全 Class.forName(“com.mysql.cj.jdbc”);.try )

      	try {
                  Class.forName("com.mysql.cj.jdbc");
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
      

      Class.forName是把这个类加载到JVM中,加载的时候,会执行其中的静态初始化块(static),完成驱动的工作

  2. 建立JDBC 和 数据库之间的Connection连接

    提供对应的参数:

    	// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL  常量便于开发人员在对应位置修改一次即可
        static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/byte_demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
        // 数据库的⽤户名与密码,需要根据⾃⼰的设置 
        static final String USER = "root"; // 用户名
        static final String PASS = "root"; // 用户密码
    
    		// 注册 JDBC 驱动
                Class.forName(JDBC_DRIVER);
            // 打开链接
                System.out.println("连接数据库...");
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
    

    对DB_URL解释:

    jdbc:mysql:// 固定开头,让程序找到对应的位置

    localhost:3306 或者127.0.0.1:3306 本地的端口IP地址 和端口号(3306)

    byte_demo 对应的数据库

    serverTimezone=UTC 世界统一时间

    useUnicode=true 是指是否使用Unicode字符集,赋值为true

    characterEncoding=utf-8是指定字符编码格式为UTF8

  3. Statement或者PreparedStatement接口,执行Sql语句

    • 使用Statement接口:
      // 执⾏查询
      System.out.println(" 实例化Statement对象...");
      stmt = conn.createStatement();
      String sql;
      // 字符串拼接执行sql语句有许多问题,并不推荐使用
      sql = "insert into url_websites values(6,"+"'baidu',"+"'www.baidu.com')"
      int m = stmt.execute(sql);    
      
      // 查询语句特殊,返回结果集对象
      sql = "SELECT id, name, url FROM url_websites";
      ResultSet rs = stmt.executeQuery(sql);
      while (rs.next()) {
       // 通过字段检索
       int id = rs.getInt("id");
       String name = rs.getString("name");
       String url = rs.getString("url");
       // 输出数据
       System.out.print("ID: " + id);
       System.out.print(", 站点名称: " + name);
       System.out.print(", 站点 URL: " + url);
       System.out.print("\n");
      }
    

在这里插入图片描述

  • 使用PreparedStatement

    与Statement一样用来执行sql语句,不同在于需要根据sql语句创建prepareStatment,初次之外还能通过设置参数,指定对应的值,而不是字符串拼接。

    ? 为占位符,参数索引从1开始

            /**
    	 * 添加网址
    	 * @param courseName 课程名称
    	 */
    	public void addCourse(String url){
    		sql = "insert into url_websites(id,name,url) values (?,?,?)";
     //该语句为每个 IN 参数保留一个问号(“?”)作为占位符
    		Connection conn = null;				//和数据库取得连接
    		PreparedStatement pstmt = null;		//创建statement
    		try{
    		    conn = DbUtil.getConnection();
    		    pstmt = (PreparedStatement) conn.prepareStatement(sql);
    		    pstmt.setString(1,"6");
                 pstmt.setString(2,"baidu");
                 pstmt.setString(3,"https://www.baidu.com/");
                 pstmt.execute();
    		}catch(SQLException e){
    			e.printStackTrace();
    		}
    		finally{
    			DbUtil.close(pstmt);
    			DbUtil.close(conn);		//必须关闭
    		}
    	}
    

    对数据库中的网站修改

            /**
    	 * 修改网址
    	 * @param courseId
    	 * @param courseName
    	 */
    	public void modifyCourse(int id,String url){
    		String sql = "update url_websites set url =? where id=?";
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		try {
    			conn = DbUtil.getConnection();
    			pstmt = (PreparedStatement) conn.prepareStatement(sql);
    			pstmt.setString(1, url);  //利用Preparedstatement的set方法给占位符赋值
    			pstmt.setInt(2, id);
    			pstmt.executeUpdate();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}finally{
                if(pstmt!=null)
    			  DbUtil.close(pstmt);
    		   if(conn!=null)	
                  DbUtil.close(conn);		
    		}
    	}
    
  1. 释放资源,最终代码

    package com.tqy;
    
    import java.sql.*;
    
    public class JdbcTest {
    
        // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
        static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/byte_demo?serverTimezone=GMT%2B8";
        // 数据库的⽤户名与密码,需要根据⾃⼰的设置
        static final String USER = "root";
        static final String PASS = "root";
    
        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            PreparedStatement pstmt = null;
            try {
                // 注册 JDBC 驱动
                Class.forName(JDBC_DRIVER);
                // 打开链接
                System.out.println("连接数据库...");
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
                // 执⾏查询
                System.out.println(" 实例化Statement对象...");
    
                String sql;
                sql = "insert into url_websites(id,name,url) values (?,?,?)";
                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1,"6");
                pstmt.setString(2,"baidu");
                pstmt.setString(3,"https://www.baidu.com/");
                pstmt.execute();
    
                sql = "select * from url_websites";
                stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery(sql);
                // 展开结果集数据库
                while (rs.next()) {
                    // 通过字段检索
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    String url = rs.getString("url");
                    // 输出数据
                    System.out.print("ID: " + id);
                    System.out.print(", 站点名称: " + name);
                    System.out.print(", 站点 URL: " + url);
                    System.out.print("\n");
                }
                // 完成后关闭
                rs.close();
                stmt.close();
                pstmt.close();
                conn.close();
            } catch (SQLException se) {
                // 处理 JDBC 错误
                se.printStackTrace();
            } catch (Exception e) {
                // 处理 Class.forName 错误
                e.printStackTrace();
            } finally {
                // 必须关闭资源
                try {
                    if (stmt != null) stmt.close();
                    if(pstmt!=null) pstmt.close();
                } catch (SQLException se2) {
                }
                // 什么都不做
                try {
                    if (conn != null) conn.close();
                } catch (SQLException se) {
                    se.printStackTrace();
                }
            }
            System.out.println("谢谢使⽤!");
        }
    }
    

    execute和executeUpdate的区别
    相同点:二者都能够执行增加、删除、修改等操作。

    不同点:

    1. execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。

    2. execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值