【问题标题】:Storing properties within database using Commons Configuration使用 Commons Configuration 在数据库中存储属性
【发布时间】:2016-09-19 12:01:53
【问题描述】:

我想在数据库表中存储一些属性。我正在使用 Apache Commons Configuration 2.1。我找到了this,但我无法让它工作......

我已经用谷歌搜索了,但除了我上面写的链接之外,我没有找到任何文档或示例。

(编辑:代码现已修复)

这是数据库结构(postgresql):

-- Table: public.propcalendars

-- DROP TABLE public.propcalendars;

CREATE TABLE public.propcalendars
(
  name character varying NOT NULL,
  key character varying NOT NULL,
  value character varying,
  CONSTRAINT pk PRIMARY KEY (name, key)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.propcalendars
  OWNER TO postgres;

并存储以下数据:

name            key     value
diasemana       SV2     0000010
fechafinal      SV2     31/08
fechainicial    SV2     01/07

这是我的代码:

public class PropertiesConfiguration {

    /*
     * Atributos
     */
    private static PropertiesConfiguration INSTANCE = null;

    private DatabaseConfiguration configFechaInicioAnual;
    private DatabaseConfiguration configFechaFinAnual;
    private DatabaseConfiguration configDiasSemana;

    /*
     * Métodos
     */
    private PropertiesConfiguration() throws ConfigurationException {
        configure();
    }

    private void configure() throws ConfigurationException {

        PGSimpleDataSource postgres = new PGSimpleDataSource();
        postgres.setServerName("ip");
        postgres.setDatabaseName("database");
        postgres.setPortNumber(5433);
        postgres.setUser("user");
        postgres.setPassword("***");
        postgres.setCurrentSchema("public");

        BasicConfigurationBuilder<DatabaseConfiguration> builder = new BasicConfigurationBuilder<DatabaseConfiguration>(DatabaseConfiguration.class);
        builder.configure(
            new Parameters()
            .database()
            .setDataSource(postgres)
            .setTable("propcalendars")
            .setKeyColumn("key")
            .setValueColumn("value")
            .setConfigurationNameColumn("name")
            .setConfigurationName("fechainicial")
        );

        configFechaInicioAnual = new DatabaseConfiguration();
        configFechaInicioAnual.setDataSource(postgres);
        configFechaInicioAnual.setKeyColumn("key");
        configFechaInicioAnual.setValueColumn("value");
        configFechaInicioAnual.setConfigurationName("fechainicial");

    }

    public static PropertiesConfiguration getInstance() throws ConfigurationException{
        if(INSTANCE == null){
            INSTANCE = new PropertiesConfiguration();
        }
        return INSTANCE;
    }

    public DatosCalendario getInfoCalendario(String pClaveCalendario, String pInfoCalendario){
        DatosCalendario dc = new DatosCalendario();
        dc.descripcion  = pInfoCalendario;
        dc.inicio       = configFechaInicioAnual.getString(pClaveCalendario);
        dc.fin          = "";//configFechaInicioAnual.getString(pClaveCalendario);
        dc.diasSemana   = 1;//configFechaInicioAnual.getInt(pClaveCalendario);

        return dc;
    }

    public class DatosCalendario{
        public String descripcion;
        public String inicio;
        public String fin;
        public Integer diasSemana;

        @Override
        public String toString(){
            return " DatosCalendario [ descripcion=" + descripcion + ", inicio=" + inicio + ", fin=" + fin + ", diasSemana=" + diasSemana + "]";
        }

    }

}

这是使用“fechainial”获取“SV2”时引发的异常:

java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'null WHERE key ='SV2'' 附近使用正确的语法 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:686) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2041) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1827) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 com.mysql.cj.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1930) ~[mysql-connector-java-6.0.3.jar:6.0.3] 在 org.apache.commons.configuration2.DatabaseConfiguration$JdbcOperation.openResultSet(DatabaseConfiguration.java:847) ~[commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.DatabaseConfiguration$1.performOperation(DatabaseConfiguration.java:333) ~[commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.DatabaseConfiguration$JdbcOperation.execute(DatabaseConfiguration.java:742) [commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.DatabaseConfiguration.getPropertyInternal(DatabaseConfiguration.java:359) [commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.AbstractConfiguration.getProperty(AbstractConfiguration.java:992) [commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.AbstractConfiguration.getAndConvertProperty(AbstractConfiguration.java:1749) [commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.AbstractConfiguration.convert(AbstractConfiguration.java:1785) [commons-configuration2-2.1.jar:2.1] 在 org.apache.commons.configuration2.AbstractConfiguration.getString(AbstractConfiguration.java:1344) [commons-configuration2-2.1.jar:2.1] 在 com.ingartek.gtfs.bizkaibus.configuration.PropertiesConfiguration.getInfoCalendario(PropertiesConfiguration.java:83) [classes/:?] 在 com.ingartek.gtfs.bizkaibus.main.GenerarGtfs.main(GenerarGtfs.java:43) [classes/:?] 13:55:15.120 [main] 调试 com.ingartek.gtfs.bizkaibus.main.GenerarGtfs - DatosCalendario [descripcion=Sabados verano Julio Agosto, inicio=null, fin=, diasSemana=1]

我做错了什么?有人可以提供额外的教程或文档吗?

解决方案

正如@Thilo 告诉我的,解决方案是使用不包含“连字符”(“-”)的表名。不幸的是,它只在 PostgreSQL 和 MySQL 中工作,我遇到了一个异常:

java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'key ='SV2' AND name='fechainicial'' 附近使用正确的语法

【问题讨论】:

  • 尝试使用不带连字符的表名。
  • 我现在试试
  • 是的!它工作,也使用postgresql。谢谢老哥!

标签: java mysql postgresql apache-commons-config


【解决方案1】:

我在使用mysql时遇到了同样的问题

经过我们的几次调试,我通过将 KeyColumn 名称从“key”重命名为“code”来解决它。您可以使用其他列名,但不能使用“键”

【讨论】:

  • 感谢发布!
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2018-11-08
相关资源
最近更新 更多