jdbc的封装(增删查改)

DBHelper

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.java

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"));
    }

       
    }

}

 

posted @ 2020-04-18 19:45  小嗨皮皮  阅读(269)  评论(3编辑  收藏  举报