jck28 - 小柒 -数据库操作-JDBC

1,使用场景

  • JDBC是Java程序访问数据库的标准接口
  • 用于创建和数据库的连接
  • 在数据库中执行SQL或MySQL查询。
  • 查看和修改结果记录。
  • 通常用作辅助自动化测试。

2,JDBC架构

3,数据库连接关闭及语句使用

接口 使用方法
Statement(重要) 将其用于对数据库的通用访问。
Statement 接口不能接受参数。
PreparedStatement(重要) 在运行时接受输入参数。
CallableStatement 访问数据库存储过程时使用。接受运行时输入参数。

(1)单独封装连接数据库对象和关闭资源的接口

package search_utils.DBsql;
import java.sql.*;

public class DBUtil {

    private DBUtil(){ }

        //静态代码块在类加载时执行,并且只执行一次
        static {
            try{
               Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }


    //获取数据库连接对象
    public static Connection getConnetion() throws SQLException{
        //advert库
        String url = "jdbc:mysql://10.52.46.16:33066/ads_communal";
        String username = "mysql";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        return conn;
    }

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

}

(2)使用statement接口代码示例
statement语句:*

方法 使用场景
【重点】ResultSet executeQuery (String SQL) 返回一个 ResultSet 对象。当您希望获得结果集时使用此方法,就像使用 SELECT 语句一样。
boolean execute (String SQL) 如果可以检索到 ResultSet 对象,则返回布尔值 true;否则,它返回 false。使用此方法执行 SQL DDL 语句或需要使用真正动态的 SQL。
int executeUpdate (String SQL) 返回受 SQL 语句执行影响的行数。使用此方法来执行您希望影响的行数的 SQL 语句 - 例如,INSERT、UPDATE 或 DELETE 语句。
package search_utils.DBsql;
import java.sql.*;


public class sqlDemo {
    public static void main(String[] args) {
        Connection conn =null;
        Statement stmt = null;
        ResultSet rs =null;
        try{
            //连接数据库
            conn = DBUtil.getConnetion();
            //获取数据库操作对象(Statement专门执行sql语句,Statement接口不能接受参数)
            stmt = conn.createStatement();
            String sql = "select * from ads_ad_collect22 where ad_id=401070811";
            String updateSql = "insert * from ads_ad_collect22 ";

            //execute()方法 - 如果可以检索到ResultSet对象,则返回true,反之则为false
//            boolean res = stmt.execute(sql);
//            System.out.println("sql语句是否存在ResultSet对象:" + res);

            //获取结果集,executeQuery()用于执行查询语句select,返回的是一个集合,将查询结果放在ResultSet类对象中供用户使用
            //int executeUpdate()用于执行INSERT,UPDATE,DELETE语句,返回受sql语句执行影响的行数
            rs = stmt.executeQuery(sql);
            System.out.println("DB查询成功..." + "\n"+ rs);       //返回一个ResultSet对象 -  com.mysql.cj.jdbc.result.ResultSetImpl@2f01783a

            //ResultSetMetaData是用于分析结果集的元数据接口
//            ResultSetMetaData rsmd = rs.getMetaData();
//            int columnCount = rsmd.getColumnCount();
            //输出ResultSet对象
//            while(rs.next()){
//
//                for(int i=0;i<columnCount;i++){
//                    System.out.print(rs.getString(i+1) + "\t");
//                }
//                System.out.println();
//            }
//
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            DBUtil.close(conn,stmt,rs);
        }

    }
}

(2)使用 PreparedStatement接口代码示例

  • 提供的方法与Statement一致
  • 可以实现动态提供参数 ? 作为参数。
  • setXXX()方法将值绑定到参数
  • 调用executeQuery()不需要传参
package preciseTest;

import java.sql.*;

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

//        String query = "select * from litemall_cart where user_id=1 and deleted=0";
           //可以实现动态提供参数 -  ?作为参数
//        String query = "select * from litemall_cart where user_id=? and deleted=?";
        String query = "select * from ads_ad_collect22 where owner_id=1000120278";

        try {
            conn = DBUtilTest.getConnection();
            //prepareStatement接口,在运行时接受输入参数;提供的方法与Statement一致
            stmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            //可以实现动态提供参数 -  支持setXXX()方法将值绑定到参数,替代?占位符的变量内容
//            stmt.setInt(1,2);
            //可以实现动态提供参数 -  调用executeQuery()不需要传参
            rs = stmt.executeQuery();
            System.out.println("DB查询成功: " + rs);           //com.mysql.cj.jdbc.result.ResultSetImpl@484970b0
            //ResultSet查询结果集合
            //先声明获取哪一行的数据
            rs.first();
//            rs.last();
//            rs.next();
            //再声明获取哪一列的数据
            System.out.println(rs.getInt("ad_id"));             //输入列名
            System.out.println(rs.getString(2));                //输入列的索引,如果值是int类型,用getInt
            //遍历所有行的数据
            while(rs.next()){
                //打印符合要求的所有adId的数据
                System.out.println(rs.getInt("ad_id"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtilTest.close(conn,stmt,rs);
        }

    }
}