jdbc的封装(增删查改)

DBHelperjava

package com.nll.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBHelper {
//加载驱动通常来讲只加载一次
    static {
        try {
            //第一步加载驱动
            //mysql5.0+版("com.mysql.cj.jdbc.Driver")8.0+版("com.mysql.cj.jdbc.Driver")
            Class.forName("oracle.jdbc.OracleDriver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection() {
        //第二步 创建链接 咱们也封装一下没有为何 主要是太长了 本身写麻烦
        Connection conn=null;
        try {
            //mysql能够改成"jdbc:mysql://localhost:3306/(数据库名)?allowPublicKeyRetrieval=true&serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8"
            conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","scott");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    //第三步 写sql语句 对咱们来讲 sql语句只是预处理语句对象里面的一个参数而已 并且功能不同 sql语句不同
    //所以 sql语句咱们最终也就当作一个参数便可
    
    
    //增删改 都是同一个方法 executeUpdate 并且返回值也是同样
    //因此咱们封装的时候 增删改一块儿封装
    public int doUpdate(String sql,Object...params) {
        //首先获取链接
        Connection conn=getConnection();
        //肯定一个返回值
        int result=-1;
        try {
            //预处理语句对象
            PreparedStatement pstmt=conn.prepareStatement(sql);
            //参数呢,会不会有占位符?
            //由于不仅仅是增删改会员参数 咱们查询也会有参数因此咱们也封装一下
            
            doParams(pstmt,params);
            //执行sql语句
            result=pstmt.executeUpdate();
            closeAll(null,conn,pstmt);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return result;
        
    }
    public List<Map<String,String>> findAll(String sql,Object...params) {
        List<Map<String,String>> list=new ArrayList<Map<String,String>>();
        try {
        //首先获取链接
        Connection conn=getConnection();
        ResultSet resultset=null;
    
            //预处理语句对象
            PreparedStatement pstmt=conn.prepareStatement(sql);
            //参数呢,会不会有占位符?
            //由于不仅仅是增删改会员参数 咱们查询也会有参数因此咱们也封装一下
            
            doParams(pstmt,params);
            resultset=pstmt.executeQuery();
            
            //如何获得Map的键-》这个sql语句的字段
            //首先要经过结果集 获得元数据
            ResultSetMetaData rsmd=resultset.getMetaData();
            String[] columnNames=new String[rsmd.getColumnCount()];
            for (int i = 0; i < columnNames.length; i++) {
                //注意咱们这里获得的键全都是大写 所以咱们改成咱们习惯的小写
                columnNames[i]=rsmd.getColumnName(i+1).toLowerCase();
                
            }
            while(resultset.next()) {
                Map<String,String> map=new HashMap<String,String>();
                //根据列名来取值
                for(String cn:columnNames) {
                    String value=resultset.getString(cn);
                    map.put(cn, value);
                }
                //当一条取完放到list里面去
                list.add(map);
            }
            closeAll(resultset,conn,pstmt);
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
        
        
    
        
    }
    private void closeAll(ResultSet rs, Connection conn, PreparedStatement pstmt) {
        // TODO Auto-generated method stub
        
            try {
                if(rs!=null) {
                rs.close();
                }
                if(conn!=null) {
                    conn.close();
                }
                if(pstmt!=null) {
                    pstmt.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    private void doParams(PreparedStatement pstmt, Object...params) {
        //先判断 用户没有传参数过来 那咱们就不用注入参数
        if(params!=null&&params.length>0) {
            //有参数 咱们才注入参数 Object... 量词参数,本质是一个数组
            for (int i = 0; i < params.length; i++) {
                //万物皆对象
                try {
                    pstmt.setObject(i+1, params[i]);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        
        
    }
    
}

Test.javamysql

package com.nll.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class Test1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //测试jdbc的封装
        //由于咱们不是静态方法 因此先示例化
        DBHelper db=new DBHelper();
//        //写sql语句不带参数
//        String sql1="update autoincre_demo set id=id+1";
//        int result1=db.doUpdate(sql1);
//        if(result1>0) {
//            System.out.println("修改为功");
//        }else {
//            System.out.println("修改失败");
//        }
//        //写sql语句 (带参数的)
//        String sql="update autoincre_demo set NAME=?";
//        //执行
//        int result=db.doUpdate(sql,"海口");
//        if(result>0) {
//            System.out.println("修改为功");
//        }else {
//            System.out.println("修改失败");
//        }
        //查询操做
      String sql2="select * from autoincre_demo";
       List<Map<String,String>> list=db.findAll(sql2);
       for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).get("name"));
    }

       
    }

}
相关文章
相关标签/搜索