栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb开发中出现DataSource读取不到怎么办呢?(详细,适合初入门的程序员)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb开发中出现DataSource读取不到怎么办呢?(详细,适合初入门的程序员)

这样的问题是怎么产生的呢?其实啊也不难,来吧,跟我走一遍~

​​​​​​

目录

前言

一、druid是什么?

二、使用步骤

1、基本的JavaWeb项目的结构

1.1 创建一个JavaWeb项目

 1.2 在创建好JavaWeb项目之后,分别在创建WEB-INF中创建一个lib文件夹存放我们的jar包,和一个config文件夹存放我们的properties配置文件(这两个文件夹一定是放在WEB-INF文件夹下面,不然会出现NullPointException异常或无法读取到的情况)

 1.3 !!!重点来了!!!书写druid.properties里面的内容时,不需要分号结尾,千万不要加' ;  ',也不要有其它多余的空格!! 将下面的内容写入文件中

 2、DBUtil的代码内容:

3、测试

总结





前言

在JavaWeb开发中DBUtil的书写总会存在很多坑,一不小心就会让我们代码跑不通,明明跟案例一模一样,为什么他行我不行呢?今天遇到一个数据源读取不到的情况,拿出来和大家分享一下,希望能对遇到该类问题朋友提供一点点点帮助,话不多说!开整




一、druid是什么?

Druid是一个为大型数据集上的高性能切片和OLAP分析而设计的数据存储,是阿里巴巴旗下的开源的操作数据库的一个数据库连接池,它高性能且简单的操作使它在众多操作数据库的jar文件中占下了一席之地,那么我们该怎么在JavaWeb的项目中正确引用他呢?怎么样避免数据源读取不到的问题呢?



二、使用步骤

1、基本的JavaWeb项目的结构

1.1 创建一个JavaWeb项目

 1.2 在创建好JavaWeb项目之后,分别在创建WEB-INF中创建一个lib文件夹存放我们的jar包,和一个config文件夹存放我们的properties配置文件(这两个文件夹一定是放在WEB-INF文件夹下面,不然会出现NullPointException异常或无法读取到的情况)

 1.3 !!!重点来了!!!书写druid.properties里面的内容时,不需要分号结尾,千万不要加' ;  ',也不要有其它多余的空格!! 将下面的内容写入文件中

 2、DBUtil的代码内容:
package com.olio.Demo.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class DBUtil {

    //数据源
    static DataSource dataSource;
    static {
        //加载配置文件
        Properties properties = new Properties();
        InputStream resourceAsStream = DBUtil.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(resourceAsStream);
            //根据配置文件获取一个数据源
            dataSource = DruidDataSourceFactory.createDataSource(properties);
            //通过数据源获取连接
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection(){

        try {
            return dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    
    public static boolean executeDML(String sql,Object...params){
        try{
            //获取连接
            Connection connection = getConnection();

            //获取预处理的对象
            PreparedStatement ps = connection.prepareStatement(sql);

            //设置参数
            if(null != params){

                for (int i = 0; i < params.length; i++) {

                    //1.给占位符设置参数   2.获取参数
                    ps.setObject(i+1,params[i]);
                }
            }

            int i = ps.executeUpdate();

            return i > 0;

        }catch (SQLException sqlException){
            sqlException.printStackTrace();
        }
        return false;
    }

    
    public static  T executeDQLGetOne(String sql, Class cls , Object...params){
        List ts = executeDQL(sql,cls,params);

        if (ts != null && ts.size() > 0){
            return ts.get(0);//直接获取第一个结果
        }
        return null;
    }

    
    public  static  List executeDQL(String sql, Class cls , Object...params){

        try{
            Connection connection = getConnection();//获取连接

            //预处理sql
            PreparedStatement preparedStatement = connection.prepareStatement(sql);

            //设置参数
            if (null != params){

                for (int i = 0; i < params.length ; i++) {
                    preparedStatement.setObject(i+1,params[i]);
                }
            }

            //执行查询  得到结果集
            ResultSet resultSet = preparedStatement.executeQuery();

            //获取元素据(我们的列名)
            ResultSetmetaData metaData = resultSet.getmetaData();

            //列的总数
            int columnCount = metaData.getColumnCount();

            //用来保存我们所有的表数据
            List list = new ArrayList();
            T t;//用来保存我们一条数据

            //遍历结果集
            while(resultSet.next()){//每一行记录的遍历过程中
                t = cls.newInstance();//根据字节码文件,构建一个实体类的对象

                //获取所有的数据
                for (int i = 0; i <= columnCount ; i++) {
                    //你的查询语句有时候有别名
                    String columnLabel = metaData.getColumnLabel(i);

                    //根据列名获取我们的记录
                    Object object = resultSet.getObject(columnLabel);

                    //需要将拿到的这一列的记录,放到t对象指定的属性里面;
                    //需要拿到这个t对象的属性,然后赋值;

                    //解决方案2:如果Object是NULL没有必要设置了
                    if (null != object){
                        try{
                            Field declaredField = cls.getDeclaredField(columnLabel);;
                            declaredField.setAccessible(true);
                            declaredField.set(t,object);
                        }catch (NoSuchFieldException e){
                            //代表我们当前这个实体类里面,没有这个属性
                            e.printStackTrace();
                        }
                    }
                }
                //需要将t对象保存到list
                list.add(t);
            }

        }catch (SQLException sqlException){
            sqlException.printStackTrace();
        }catch (IllegalAccessException e){
            e.printStackTrace();
        }catch (InstantiationException e){
            e.printStackTrace();
        }
        return null;
    }
}

 (以上还包含了DML和DQL的方法),可以忽略或自己做其它的修改

3、测试

写一个Test类测试一下能不能成功获取到数据,或者获取到返回的结果,我这里测试的是登录,我把带码也一并发下,仅供借鉴

 返回结果:




总结

以上是我在做JavaWeb项目中出现的无法读取数据源,读取的数据源为null的问题,就这个问题本人也是找了很久,最后发现是在druid.properties书写上多了两个分号,导致它读取值为null。问题很小,自己要找也非常花时间,所以也发出来希望对有类似问题的朋友提供一些参考和帮助,以上就是我的全部内容啦,我也会不定期的分享一下自己在项目上遇到的问题和解决方法,希望大家一起进步!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/681593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号