JDBC复习
JDBC介绍
JDBC(Java DataBase Connectivity) 是Java和数据库之间桥梁,一个规范而不是实现,能够执行SQL语句,具体的实现由不同数据库的生产厂商提供对应的实现接口(jar包),由一组Java语言编写的类和接口组成。本文针对MySQL数据库阐述。
JDBC编程:
第一个JDBC程序
-
装载JDBC驱动并初始化参数
-
建立JDBC和数据库之间的Connection来连接
-
创建Statement或者PreparedStatement接口,执行Sql语句
-
处理和显示结果
-
释放资源
简单的一张数据库表
-
导入对应的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),完成驱动的工作
-
-
建立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
-
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); } }
-
释放资源,最终代码
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的区别
相同点:二者都能够执行增加、删除、修改等操作。不同点:
-
execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
-
execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
-