jdbc相关内容

1.什么是 jdbc?

jdbc 是连接和操作数据库的一种标准 API。

2.jdbc的主要作用

第一个是数据库的连接,第二个是执行 SQL 语句,第三个处理查询结果,第四个事务管理,第五个跨数据库兼容

3.jdbc开发的步骤

a.加载驱动使用DriverManager类
b. 获取连接,返回Connection接口,说明连接上数据库的服务器
执行SQL语句
编写SQL语句
c.获取能执行SQL语句的对象(Statement接口)
d. 如果执行的查询的语句,返回的结果,封装ResultSet接口中,遍历该接口
e. 释放资源(调用close()方法)

4.分别介绍jdbc的开发步骤

DriverManager****类(驱动)

DriverManager是JDBC中管理数据库驱动的核心类,主要负责管理各种数据库驱动的实现类。 它的主要作用有两个: 第一个是加载驱动,通过registerDriver(Driver driver)方法来注册驱动,但直接传入new Driver()这种方式有缺点,一方面会让代码过度依赖具体的驱动实现类,不利于更换数据库;另一方面还会导致驱动的jar包被加载两次。

所以更好的做法Class.forName("com.mysql.jdbc.Driver")这种方式,它会加载驱动类并自动完成注册,避免了上述问题。 第二个是获取数据库连接,通过getConnection(String url, String user, String password)方法实现。

这个方法需要三个参数: 第一个是数据库URL,格式是jdbc:mysql://localhost:3306/数据库名,其中jdbc是主协议,mysql是子协议,localhost是主机名,3306是默认端口号。如果是访问本地数据库,localhost:3306可以省略,简写为jdbc:mysql:数据库名 - 第二个是数据库用户名,通常是root - 第三个是数据库密码

简单来说,DriverManager就是用来管理驱动,并通过加载驱动和获取连接这两个主要功能,让Java程序能够和数据库建立连接。

再结合后面提到的内容总结一下:DriverManager主要负责管理驱动,通过Class.forName("com.mysql.jdbc.Driver")加载驱动,通过getConnection("jdbc:mysql:///day07","root","密码")获取连接;而Connection是连接接口,Statement是能执行SQL语句的接口。

Connection 接口

代表与数据库的连接,是很珍贵的资源,用完必须释放。主要作用有:

  1. 获取执行 SQL 的对象:
    • 通过createStatement()得到 Statement 对象
    • 通过prepareStatement(String sql)得到 PreparedStatement 对象(更安全,能防 SQL 注入)
  2. 管理事务:
    • setAutoCommit(boolean)开启事务
    • commit()提交事务
    • rollback()回滚事务

Statement 接口

是执行 SQL 语句的对象,主要功能:

  1. 执行 SQL:
    • executeQuery(String sql):执行查询语句,返回结果集
    • executeUpdate(String sql):执行增删改语句,返回影响行数
  2. 批处理操作:
    • addBatch(String sql):添加 SQL 到批处理
    • clearBatch():清空批处理
    • executeBatch():执行批处理

ResultSet 接口

封装了查询语句的结果,特点是:

  • 用表格形式存储查询结果
  • 内部有个游标,默认在第一行数据前
  • 调用next()方法移动游标,只能向下移动
  • 获取数据时,根据字段类型调用对应方法:
    • 整数类型用getInt(),字符串用getString()
    • 可以用字段索引(从 1 开始)或字段名获取,常用字段名方式
    • getObject()可获取任意类型,需要自己强转

资源释放

所有连接相关的对象必须释放,标准做法是:

在 finally 代码块中释放,确保一定会执行,例如:

java

复制代码
if(conn != null){
  try {
    conn.close();
  } catch (SQLException e) {
    e.printStackTrace();
  }
  conn = null;
}

5.具体程序

向上提取的思想

复制代码
package cn.qcby.demo1;

import com.mysql.jdbc.Driver;

import java.sql.*;

/**
 * JDBC的入门程序
 * 需求:把数据库中所有的数据全部查询出来,显示到控制台
 */
public class JdbcTest1 {

    public static void main(String[] args) {
        // 数据库连接
        Connection conn = null;
        // 能执行SQL语句的对象
        Statement stmt = null;
        // 查询数据,把数据封装到该结果集中,表格
        ResultSet rs = null;
        try {
            // 加载驱动类
            DriverManager.registerDriver(new Driver());
            //Class.forName("com.mysql.jdbc.Driver");
            // 获取到连接 1数据库连接地址(需要编写协议) 2用户名 3密码
            // Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
            // 获取到连接,localhost:3306可以省略不写的,访问本地mysql服务器
            conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "root");
            // 执行SQL语句
            // 编写SQL语句
            String sql = "select * from t_user";
            // 有能执行SQL语句的对象 Statement对象,能执行SQL语句   sql注入问题  不能
            stmt = conn.createStatement();
            //conn.prepareStatement()
            // 执行SQL语句,数据封装到结果集中
            rs = stmt.executeQuery(sql);
            // 遍历rs结果集
            while(rs.next()){
                // 获取到数据就OK
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String password = rs.getString("password");
                String email = rs.getString("email");
                // 做打印
                System.out.println(id+"-"+username+"-"+password+"-"+email);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 总是会执行的,释放的顺序相反
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

package cn.qcby.demo1;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 演示增删改的操作
 */
public class JdbcTest2 {

    public static void main(String[] args) {
        // 测试保存
        new JdbcTest2().testInsert();
        // 测试修改
        // new JdbcTest2().testUpdate();
        // 测试删除
        // new JdbcTest2().testDelete();
    }

    /**
     * 新增数据
     */
    public void testInsert(){
        // 连接
        Connection conn = null;
        // 执行SQL语句
        Statement stmt = null;
        try {
            // 注册驱动
            // DriverManager.registerDriver(new Driver());

            // 注册驱动,切换一种写法,反射代码。加载com.mysql.jdbc.Driver类,只要该类一加载,static代码块就会执行(注册驱动)
            // 编写的是字符串,把com.mysql.jdbc.Driver编写到一个配置文件中去
            Class.forName("com.mysql.jdbc.Driver");

            // 获取链接
            conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");
            // 编写SQL语句
            String sql = "insert into t_user values (null,'fff','111','ddd@126.com')";
            // 获取到stmt对象
            stmt = conn.createStatement();
            // 执行SQL语句,执行增删改的操作
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 修改数据
     */
    public void testUpdate(){
        // 连接
        Connection conn = null;
        // 执行SQL语句
        Statement stmt = null;
        try {
            // 注册驱动
            DriverManager.registerDriver(new Driver());
            // 获取链接
            conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");
            // 编写SQL语句
            String sql = "update t_user set username = 'eee' where id = 4";
            // 获取到stmt对象
            stmt = conn.createStatement();
            // 执行SQL语句,执行增删改的操作
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 删除数据
     */
    public void testDelete(){
        // 连接
        Connection conn = null;
        // 执行SQL语句
        Statement stmt = null;
        try {
            // 注册驱动
            DriverManager.registerDriver(new Driver());
            // 获取链接
            conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");
            // 编写SQL语句
            String sql = "delete from t_user where id = 4";
            // 获取到stmt对象
            stmt = conn.createStatement();
            // 执行SQL语句,执行增删改的操作
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}