使用PreparedStatement连接数据库并将数据返回成List<Map>

需要获取除配置的数据库外手动配置数据库去获取数据,当然手动创建JDBC连接多少需要了解一下,结合文章和自己的理解,记录一下,方便后续借鉴

最基础的JDBC连接我就不再阐述了,这里简单介绍一下连接和取数,首先创建连接工具类:

public class ConnectUtilsSec {
    private String driverName;
    private String dbURL;
    private String userName;
    private String userPwd;

    public ConnectUtilsSec(){
    }

    public ConnectUtilsSec(String driverName, String dbURL, String userName, String userPwd){
        this.driverName = driverName;
        this.dbURL = dbURL;
        this.userName = userName;
        this.userPwd = userPwd;
    }

    public  Connection getConnection()
    {
        Connection conn = null;
        try
        {
            // 加载JDBC驱动
            Class.forName(this.driverName);
            // 获取连接
            conn = DriverManager.getConnection(this.dbURL, this.userName, this.userPwd);
            return conn;
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public String getDriverName() {
        return driverName;
    }

    public void setDriverName(String driverName) {
        this.driverName = driverName;
    }

    public String getDbURL() {
        return dbURL;
    }

    public void setDbURL(String dbURL) {
        this.dbURL = dbURL;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
}

然后根据数据库的类型处理驱动及相关属性


 		String driverName = "";//驱动属性
        String dbURL = "";//驱动属性
        String ipadd = “”;//数据库所在服务器地址
        String dataName =  “”;//具体数据库
        String userName = “”;//连接用户名
        String userPwd = “”;//连接密码
        
 switch (“数据库类型”){//多数据库方法通用化,这里暂且介绍ORCLE、SQLSERVER、PG的驱动属性,结尾有链接可以查看更多
            case "ORCLE":
                driverName = "oracle.jdbc.driver.OracleDriver";
                dbURL = "jdbc:oracle:thin:@"+ipadd+":1521:orcl";
                break;
            case "SQLSERVER":
                driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
                dbURL = "jdbc:microsoft:sqlserver://"+ipadd+":1433;DatabaseName="+dataName;
                break;
            case "PG":
                driverName = "org.postgresql.Driver";
                dbURL = "jdbc:postgresql://"+ipadd+"/"+dataName;
                break;
            default:
                break;
        }

接下来根据配置的连接信息,创建连接,获取数据。

 //日志打印
 private Logger logger = LoggerFactory.getLogger(this.getClass());
 try {
//创建连接类
 ConnectUtilsSec connectUtilsSec = new ConnectUtilsSec(driverName,dbURL,userName,userPwd);
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        //设置参数
        String para= "para";
          //构建sql
            String sql = "select * from usertable where id = ? ";
            //获取连接
            conn = connectUtilsSec.getConnection();
            if(null == conn){
                
                throw new RuntimeException(“数据库连接失败”);
            }
            ps = conn.prepareStatement(sql);
            //设置sql中问号索引参数,防sql注入
            ps.setString(1,para);
            //获取参数
            rs = ps.executeQuery();
            /*如果想执行删除或者新增则使用 ps.executeUpdate();返回的是行数
              记得设置事务, conn .setAutoCommit(false); 
              成功则提交 conn .commit(); 
              失败则回滚 conn .rollback();  */
            ArrayList<HashMap> arrayList = new ArrayList<>();
            从返回的rs里取数并放入map存入list
             while(rs.next()) {
             	//创建map对象,如果是实体类可以创建实体类并依次设值
                HashMap <String,Object> map = new HashMap<>();
                //根据sql取数,列名获取值
				String  id= rs.getString("id");
                map.put("id", id);
                String  name= rs.getString("name");
                map.put("name", name);
                arrayList.add(map);
            }
			//关闭连接 循环使用的话需要每一次循环都关闭,不然内存急速增长,造成OUT OF MEMORY ERROR异常

			rs.close();
            ps.close();
            conn.close();

          

        } catch (Exception e) {
         	//异常处理
         	logger.error(e.getMessage());
        }finally {
            try {
                if (rs != null)
                    rs.close();
                if (ps != null)
                    ps.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
              //异常处理
              logger.error(e.getMessage());
            }
        }

其实这个封装的工具类是个残次品,可以说是没作用,在这里显得多此一举,一开始的目的是为了后续增删改查等一系列的方法通用,后来发现用不到就不作多余补充了,暂且先这样吧,另外再记录一个比SimpleDateFormat好用且线程安全的日期类

		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
		//将2021-03-18 字符串改成 yyyyMMdd的日期格式
		LocalDate date = LocalDate.parse(2021-03-18, formatter);
		//将20210318 的日期格式改成 yyyy-MM-dd的字符串
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String  dateString = date.format(fmt);

作此记录以便后续用到再借鉴,如有不对或者有误的地方烦请各位大神指出,以免误导他人。
最后相关数据库的连接驱动信息链接如下:
链接: 数据库的连接驱动.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值