JDBC笔记

JDBC

1、JDBC概念

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

2、JDBC连接数据库实例(java代码)

package Ekko;
import java.util.*;
import java.sql.*;

//第一个jdbc程序
public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1。加载驱动
        // 2. 用户信息和url
        //3. 连接成功,数据库对象
        //4.执行sql的对象
        //5.执行sql的对象去执行sql
        //6.释放链接

        //加载驱动程序
        Class.forName("com.mysql.cj.jdbc.Driver");
        //用户信息和URl(创建数据库连接,目的是为了让驱动程序与DBMS相连)
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8";
        String username= "root";
        String password ="123456";
        Connection connection = DriverManager.getConnection(url, username, password);
     /* Statement pstm3=connection.createStatement();
        String sql2 ="select * from book";              //利用statement创建对象的表达式
        ResultSet ss=pstm3.executeQuery(sql2);
     */
        PreparedStatement pstmt = connection.prepareStatement("select * from book where book_id=?");
        PreparedStatement pstmt2=connection.prepareStatement("update book set book_name=? where book_id=?");
        System.out.println("请输入您想要查询的书本ID(1-5)");
        Scanner s=new Scanner(System.in);
        if(s.hasNextInt()) {
            int id = s.nextInt();
            pstmt.setInt(1, id);
            System.out.println("请输入需要更改的书本id以及需要更改的书名");
            pstmt2.setInt(2,id);
            pstmt2.setString(1,"万达奥迪");
        }
        ResultSet resultSet =pstmt.executeQuery();
        int x= pstmt2.executeUpdate();
        System.out.println("x的值为"+x);
        while(resultSet.next()){
            //这里同时也可以利用resultSet.getObject(1)来获取第一部分字段
            System.out.println("book_id=" + resultSet.getObject("book_id"));
            System.out.println("book_name=" + resultSet.getObject("book_name"));
            System.out.println("book_writer=" + resultSet.getObject("book_writer"));
            System.out.println("book_press=" + resultSet.getObject("book_press"));
            System.out.println("book_stock=" + resultSet.getObject("book_stock"));

        }
        //每次创建完都要记得关闭,以便节省内存!
        resultSet.close();
        
        
        pstmt.close();           /*一定要按先ResultSet结果集,后Statememnt,最后Connection的顺序关闭资源!
                                   因为Statement和ResultSet是需要连接才可以使用的,如果先关闭Connection,其他正在执行                                    的Statement就无法操作了*/
        connection.close();
    }
}

3、statement() 和 PreparedStatement()的区别

  1. statement 发送完整的sql语句到数据库,不是直接执行而是由数据库先编译,再运行。
  2. PreparedStatement 可以发送可以直接运行的sql语句到数据库,不需要再编译.能用预编译时尽量用预编译!!
  3. 如果是同构的sql语句,PreparedStatement的效率要比statement高!
  4. 使用PreparedStatement可以跨数据库使用,适合编写通用程序。

4、读取属性配置文件

在JDBC中可以利用配置文件读取需要更改的部分(如dirver,url,user,password等),连接数据库的信息统一写到配置文件中

实例:

  1. src目录下创建一个名为rsources的文件夹,用来存放配置文件,并创建一个名为db.properties的配置文件

image-20210914102008866

  1. 导入以下代码:

    #mysql connectivity configuration###########
    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
    username=root
    password=123456
    
  2. 在源码调用bundle类函数:

    ResourceBundle bundle=ResourceBundle.getBundle("resources/db");
            String driver=bundle.getString("driver");
            String url=bundle.getString("url");
            String username=bundle.getString("username");
            String password=bundle.getString("password");
    

    5、JDBC工具类的封装

前置条件:按4步骤配置完读取属性的配置文件

  1. 在代码行的同级目录下工具类包utils(名字随意),创建封装代码DButil

    image-20210914165238284

  2. 编写封装代码块:

package Ekko.utils;

import javax.resource.spi.Connector;
import java.sql.*;
import java.util.ResourceBundle;
import java.util.Stack;

/*
   数据库工具类,便于JDBC代码编写。
*/
public class DBUtil {
    /*工具类中的构造放法私有化,防止new对象,因为工具类中的方法都是静态的
        不需要new对象,直接使用”类名.“的方式调用即可。
    */
    private DBUtil() { }
    //类加载时绑定属性资源文件
    private  static ResourceBundle bundle=ResourceBundle.getBundle("resources/db");

    //注册驱动,静态代码块在类被加载时就会直接调用,非常巧!
    static {
        try {
            Class.forName(bundle.getString("driver"));
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接对象
     * @return 新的连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        String url =bundle.getString("url");
        String user =bundle.getString("user");
        String password =bundle.getString("password");
        Connection conn= DriverManager.getConnection(url,user,password);
        return  conn;
    }

    /***
     * 释放资源
     * @param conn 连接对象
     * @param stmt  数据库操作对象
     * @param rs       查询结果集
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs){
        if(conn!=null){
            try {
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

        if(stmt!=null){
            try {
                stmt.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

        if(rs!=null){
            try{
                rs.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

    }

}

  1. 测试

    package Ekko;
    
    import Ekko.utils.DBUtil;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * 测试DBUtil 工具类
     */
    public class Main {
        public static void main(String[] args) {
            Connection conn=null;
            PreparedStatement ps =null;
            ResultSet rs =null;
            try {
                conn= DBUtil.getConnection();
                ps=conn.prepareStatement("select * from book");
                rs=ps.executeQuery();
                while(rs.next()){
                    System.out.println("book_id=" + rs.getObject("book_id"));
                    System.out.println("book_name=" + rs.getObject("book_name"));
                    System.out.println("book_writer=" + rs.getObject("book_writer"));
                    System.out.println("book_press=" + rs.getObject("book_press"));
                    System.out.println("book_stock=" + rs.getObject("book_stock"));
                }
            }catch (SQLException e){
                e.printStackTrace();
            }finally{
                DBUtil.close(conn,ps,rs);
            }
        }
    }
    
    
posted @ 2021-09-15 10:19  ekkosjt  阅读(44)  评论(0编辑  收藏  举报