JDBC学习1

2022-03-26  本文已影响0人  张氏小毛驴

一.JDBC基本概念

JDBC,全拼为:Java DataBase Connectivity ,是一种Java程序访问数据库的标准接口。

当使用Java程序访问数据库时,Java代码并不是直接就去操作数据库的,而是通过JDBC接口去访问,JDBC接口再通过JDBC驱动来实现真正的数据库访问。

在Java中,JDBC接口是JDK自带的,可以直接调用,但是具体的JDBC驱动是根据不同的数据库厂商来提供的,其实也是java语言编写的,是一个jar包,在我们使用的时候导入相关的数据库驱动jar包就好了。(目的就在于同一套Java代码处理访问数据库的代码,但可以访问各种不同的数据库,根据数据库驱动去实现)

Java与数据库驱动和数据库之间的关系,如下:
JDBC.png

好处:

  1. 使用同一套java代码,针对不同的数据库,不需要重新开发。
  2. 不受限于底层数据库,即使换一个其他数据库,java代码基本不变。

总结:

在开发时,只需完成对JDBC接口的调用,底层的数据库具体操作不需要我们去实现,由驱动完成。

二.JDBC开发主要步骤

先记录开发步骤,后面再详细学习各个对象。

  1. 导入驱动jar抱

    比如mysql,需要导入mysql-connector-java-5.1.37-bin.jar

    在idea中的导入的步骤:

    • 复制jar包到项目的lib文件夹下
    • 右键lib文件夹 --> Add As Library
  2. 注册驱动

  3. 获取数据库连接对象 Connection

  4. 定义sql语句

  5. 获取执行sql语句的对象 Statement/PreparedStatement

  6. 执行sql,接收返回结果

  7. 处理结果

  8. 释放资源

有两种执行sql语句的对象:Statement和PreparedStatement版本(以后都是用PreparedStatement,区别下面再解释)

Statement版本:

public class JDBCDemo2 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement state = null;
        try {
            // 1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 获取数据库连接对象Conn
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
            // 3. 定义sql语句
            String sql = "insert into student3 values(15,'亚瑟',28,'男','深圳',80,85)";
            // 4. 获取执行sql对象
            state = conn.createStatement();
            // 5. 执行sql
            int count = state.executeUpdate(sql);
            if (count > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("执行失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 6. 释放资源
            if (state != null) {
                try {
                    state.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

PreparedStatement版本

public class JDBCDemo12 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstate = null;
        ResultSet rs = null;

        try {
            // 1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 获取数据库连接对象Connection
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
            // 3. 定义sql语句
            String sql = "select * from user where id = ?";
            // 4. 获取sql执行对象
            pstate = conn.prepareStatement(sql);
            pstate.setInt(1,2);
            // 5. 执行sql
            rs = pstate.executeQuery();
            // 6. 处理结果
            if (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String password = rs.getString("password");

                System.out.println("id = " + id + ",name = " + name + ",password = " + password);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (pstate != null) {
                try {
                    pstate.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

三.JDBC各个对象的详解

四.实现自己的JDBC工具类:JDBCUtils

在真正编写代码之后,我们发现每一次操作数据库,都要经历上述的至少7,8个步骤,步骤很繁琐,而且重复度很高,所以为了方便使用以及简化书写,可以把JDBC的相关操作抽取出来,作为一个工具类,提供相关方法供调用。

步骤:
  1. 整合注册驱动部分,驱动的注册只需要注册一次即可,不需要每一次都注册。

    可以使用静态代码块,在第一次加载类时调用一次。

  2. 整合一个获取连接对象的方法

    数据库用户名,密码等信息可以通过配置文件获取,使用Properties集合类。

  3. 整合一个释放资源的方法

    针对不同操作,查询操作需要释放ResultSet,可以使用重载方法的方式提供同名的方法。

public class JDBCUtil {
    private static String url;
    private static String root;
    private static String password;
    private static String driver;

    /*配置文件的读取,只需要读取一次即可,使用静态代码块*/
    static {
        // 读取资源文件,获取值

        // 1. 创建Properties集合类
        Properties pro = new Properties();
        // 获取src路径下的文件的方式 -- ClassLoader 类加载器
        ClassLoader classLoader = JDBCUtil.class.getClassLoader();
        URL res = classLoader.getResource("jdbc.properties");
        String path = res.getPath();
        // 2. 加载文件
        try {
            pro.load(new FileInputStream(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 3. 获取数据,赋值
        url = pro.getProperty("url");
        root = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");
        // 4. 注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /* 获取连接对象 */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, root, password);
    }

    public static void close(ResultSet rs, Statement state, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Statement state, Connection conn) {
        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读