| Database | Tested Driver / Version |
| -------------------------------------------- | ------------------------------------------------------------ |
-| [Apache Derby](https://db.apache.org/derby/) | [derby-10.12.1.1.jar](https://mvnrepository.com/artifact/org.apache.derby/derby) |
+| [Apache Derby](https://db.apache.org/derby/) | [derby-10.14.2.0.jar](https://mvnrepository.com/artifact/org.apache.derby/derby) |
| [H2](https://www.h2database.com/) | [h2-1.4.191.jar](https://mvnrepository.com/artifact/com.h2database/h2) |
| [HSQLDB](http://hsqldb.org/) | [hsqldb-2.3.3.jar](https://mvnrepository.com/artifact/org.hsqldb/hsqldb) |
| [MariaDB](https://mariadb.org/) | [mariadb-java-client-1.4.6.jar](https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client) |
<name>openHAB Add-ons :: Bundles :: Persistence Service :: JDBC</name>
<properties>
- <bnd.importpackage>!org.osgi.service.jdbc.*,!sun.security.*,!org.apache.lucene.*,!org.apache.logging.log4j,!waffle.windows.auth.*,!org.hibernate.*,!org.jboss.*,!org.codehaus.groovy.*,!com.codahale.metrics.*,!com.google.protobuf.*,!com.ibm.icu.*,!com.ibm.jvm.*,!com.mchange.*,!com.sun.*,!com.vividsolutions.*,!io.prometheus.*,com.mysql.jdbc;resolution:=optional,org.apache.derby.*;resolution:=optional,org.h2;resolution:=optional,org.h2.jdbcx;resolution:=optional,org.hsqldb;resolution:=optional,org.hsqldb.jdbc;resolution:=optional,org.mariadb.jdbc;resolution:=optional,org.postgresql;resolution:=optional,org.sqlite;resolution:=optional,org.sqlite.jdbc4;resolution:=optional,javassist*;resolution:=optional</bnd.importpackage>
+ <bnd.importpackage>!org.osgi.service.jdbc.*,!sun.security.*,!org.apache.lucene.*,!org.apache.logging.log4j,!waffle.windows.auth.*,!org.hibernate.*,!org.jboss.*,!org.codehaus.groovy.*,!com.codahale.metrics.*,!com.google.protobuf.*,!com.ibm.icu.*,!com.ibm.jvm.*,!com.mchange.*,!com.sun.*,!com.vividsolutions.*,!io.prometheus.*,com.mysql.*;resolution:=optional,org.apache.derby.*;resolution:=optional,org.h2.*;resolution:=optional,org.hsqldb;resolution:=optional,org.hsqldb.jdbc;resolution:=optional,org.mariadb.*;resolution:=optional,org.postgresql.*;resolution:=optional,org.sqlite;resolution:=optional,org.sqlite.jdbc4;resolution:=optional,javassist*;resolution:=optional</bnd.importpackage>
<dep.noembedding>derby,h2,hsqldb,mariadb-java-client,mysql-connector-java,postgresql,sqlite-jdbc</dep.noembedding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<yank.version>3.2.0</yank.version>
<!-- JDBC database driver versions -->
- <derby.version>10.12.1.1</derby.version>
+ <derby.version>10.14.2.0</derby.version>
<h2.version>1.4.191</h2.version>
<hsqldb.version>2.3.3</hsqldb.version>
<mariadb.version>1.4.6</mariadb.version>
<feature name="openhab-persistence-jdbc-derby" description="JDBC Persistence Apache Derby" version="${project.version}">
<configfile finalname="${openhab.conf}/services/jdbc.cfg" override="false">mvn:org.openhab.addons.features.karaf/org.openhab.addons.features.karaf.openhab-addons-external/${project.version}/cfg/jdbc</configfile>
<feature prerequisite="false" dependency="false">openhab-runtime-base</feature>
- <bundle start-level="80">mvn:org.apache.derby/derbyclient/10.12.1.1</bundle>
+ <bundle start-level="80">mvn:org.apache.derby/derby/10.14.2.0</bundle>
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.persistence.jdbc/${project.version}</bundle>
</feature>
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;
* ITEMS DAOs *
**************/
public @Nullable Integer doPingDB() {
- return Yank.queryScalar(sqlPingDB, (Class<@Nullable Integer>) Integer.class, null);
+ final @Nullable Integer result = Yank.queryScalar(sqlPingDB, Integer.class, null);
+ return result;
}
public @Nullable String doGetDB() {
- return Yank.queryScalar(sqlGetDB, (Class<@Nullable String>) String.class, null);
+ final @Nullable String result = Yank.queryScalar(sqlGetDB, String.class, null);
+ return result;
}
public boolean doIfTableExists(ItemsVO vo) {
String sql = StringUtilsExt.replaceArrayMerge(sqlIfTableExists, new String[] { "#searchTable#" },
new String[] { vo.getItemsManageTable() });
logger.debug("JDBC::doIfTableExists sql={}", sql);
- return Yank.queryScalar(sql, (Class<@Nullable String>) String.class, null) != null;
+ final @Nullable String result = Yank.queryScalar(sql, String.class, null);
+ return Objects.nonNull(result);
}
public Long doCreateNewEntryInItemsTable(ItemsVO vo) {
String sql = StringUtilsExt.replaceArrayMerge(sqlInsertItemValue,
new String[] { "#tableName#", "#tablePrimaryValue#" },
new String[] { storedVO.getTableName(), sqlTypes.get("tablePrimaryValue") });
- Object[] params = new Object[] { storedVO.getValue(), storedVO.getValue() };
+ Object[] params = { storedVO.getValue(), storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} value='{}'", sql, storedVO.getValue());
Yank.execute(sql, params);
}
String sql = StringUtilsExt.replaceArrayMerge(sqlInsertItemValue,
new String[] { "#tableName#", "#tablePrimaryValue#" }, new String[] { storedVO.getTableName(), "?" });
java.sql.Timestamp timestamp = new java.sql.Timestamp(date.toInstant().toEpochMilli());
- Object[] params = new Object[] { timestamp, storedVO.getValue(), storedVO.getValue() };
+ Object[] params = { timestamp, storedVO.getValue(), storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} timestamp={} value='{}'", sql, timestamp, storedVO.getValue());
Yank.execute(sql, params);
}
import java.time.ZoneId;
import java.util.List;
+import java.util.Objects;
import java.util.stream.Collectors;
import javax.measure.Quantity;
*/
@NonNullByDefault
public class JdbcDerbyDAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = org.apache.derby.jdbc.EmbeddedDriver.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = org.apache.derby.jdbc.EmbeddedDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcDerbyDAO.class);
/********
* INIT *
********/
public JdbcDerbyDAO() {
- super();
initSqlTypes();
initDbProps();
initSqlQueries();
private void initDbProps() {
// Properties for HikariCP
// Use driverClassName
- databaseProps.setProperty("driverClassName", "org.apache.derby.jdbc.EmbeddedDriver");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
// OR dataSourceClassName
- // databaseProps.setProperty("dataSourceClassName", "org.apache.derby.jdbc.EmbeddedDataSource");
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
databaseProps.setProperty("maximumPoolSize", "1");
databaseProps.setProperty("minimumIdle", "1");
}
**************/
@Override
public @Nullable Integer doPingDB() {
- return Yank.queryScalar(sqlPingDB, (Class<@Nullable Integer>) Integer.class, null);
+ return Yank.queryScalar(sqlPingDB, Integer.class, null);
}
@Override
String sql = StringUtilsExt.replaceArrayMerge(sqlIfTableExists, new String[] { "#searchTable#" },
new String[] { vo.getItemsManageTable().toUpperCase() });
logger.debug("JDBC::doIfTableExists sql={}", sql);
- return Yank.queryScalar(sql, (Class<@Nullable String>) String.class, null) != null;
+ final @Nullable String result = Yank.queryScalar(sql, String.class, null);
+ return Objects.nonNull(result);
}
@Override
new String[] { "#tableName#", "#dbType#", "#tablePrimaryValue#" },
new String[] { storedVO.getTableName().toUpperCase(), storedVO.getDbType(),
sqlTypes.get("tablePrimaryValue") });
- Object[] params = new Object[] { storedVO.getValue() };
+ Object[] params = { storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} value='{}'", sql, storedVO.getValue());
Yank.execute(sql, params);
}
*/
@NonNullByDefault
public class JdbcH2DAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = org.h2.Driver.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = org.h2.jdbcx.JdbcDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcH2DAO.class);
/********
* INIT *
********/
public JdbcH2DAO() {
- super();
initSqlQueries();
initSqlTypes();
initDbProps();
*/
private void initDbProps() {
// Properties for HikariCP
- databaseProps.setProperty("driverClassName", "org.h2.Driver");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
// driverClassName OR BETTER USE dataSourceClassName
- // databaseProps.setProperty("dataSourceClassName", "org.h2.jdbcx.JdbcDataSource");
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
}
/**************
String sql = StringUtilsExt.replaceArrayMerge(sqlInsertItemValue,
new String[] { "#tableName#", "#dbType#", "#tablePrimaryValue#" },
new String[] { storedVO.getTableName(), storedVO.getDbType(), sqlTypes.get("tablePrimaryValue") });
- Object[] params = new Object[] { storedVO.getValue() };
+ Object[] params = { storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} value='{}'", sql, storedVO.getValue());
Yank.execute(sql, params);
}
*/
@NonNullByDefault
public class JdbcHsqldbDAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = org.hsqldb.jdbcDriver.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = org.hsqldb.jdbc.JDBCDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcHsqldbDAO.class);
/********
* INIT *
********/
public JdbcHsqldbDAO() {
- super();
initSqlQueries();
initSqlTypes();
initDbProps();
*/
private void initDbProps() {
// Properties for HikariCP
- databaseProps.setProperty("driverClassName", "org.hsqldb.jdbcDriver");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
+ // driverClassName OR BETTER USE dataSourceClassName
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
}
/**************
**************/
@Override
public @Nullable Integer doPingDB() {
- return Yank.queryScalar(sqlPingDB, (Class<@Nullable Integer>) Integer.class, null);
+ return Yank.queryScalar(sqlPingDB, Integer.class, null);
}
@Override
new String[] { "#tableName#", "#dbType#", "#tableName#", "#tablePrimaryValue#" },
new String[] { storedVO.getTableName(), storedVO.getDbType(), storedVO.getTableName(),
sqlTypes.get("tablePrimaryValue") });
- Object[] params = new Object[] { storedVO.getValue() };
+ Object[] params = { storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} value='{}'", sql, storedVO.getValue());
Yank.execute(sql, params);
}
*/
package org.openhab.persistence.jdbc.db;
+import java.util.Objects;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.knowm.yank.Yank;
*/
@NonNullByDefault
public class JdbcMariadbDAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = org.mariadb.jdbc.Driver.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = org.mariadb.jdbc.MariaDbDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcMariadbDAO.class);
/********
* INIT *
********/
public JdbcMariadbDAO() {
- super();
initSqlTypes();
initDbProps();
initSqlQueries();
// Properties for HikariCP
// Use driverClassName
- databaseProps.setProperty("driverClassName", "org.mariadb.jdbc.Driver");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
// driverClassName OR BETTER USE dataSourceClassName
- // databaseProps.setProperty("dataSourceClassName", "org.mariadb.jdbc.MySQLDataSource");
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
databaseProps.setProperty("maximumPoolSize", "3");
databaseProps.setProperty("minimumIdle", "2");
}
**************/
@Override
public @Nullable Integer doPingDB() {
- final @Nullable Long result = Yank.queryScalar(sqlPingDB, (Class<@Nullable Long>) Long.class, null);
- return result != null ? result.intValue() : null;
+ final @Nullable Long result = Yank.queryScalar(sqlPingDB, Long.class, null);
+ return Objects.nonNull(result) ? result.intValue() : null;
}
/*************
*/
package org.openhab.persistence.jdbc.db;
+import java.util.Objects;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.knowm.yank.Yank;
*/
@NonNullByDefault
public class JdbcMysqlDAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = com.mysql.jdbc.Driver.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = com.mysql.cj.jdbc.MysqlDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcMysqlDAO.class);
/********
* INIT *
********/
public JdbcMysqlDAO() {
- super();
initSqlTypes();
initDbProps();
initSqlQueries();
// Properties for HikariCP
// Use driverClassName
- databaseProps.setProperty("driverClassName", "com.mysql.jdbc.Driver");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
// OR dataSourceClassName
- // databaseProps.setProperty("dataSourceClassName", "com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
databaseProps.setProperty("maximumPoolSize", "3");
databaseProps.setProperty("minimumIdle", "2");
}
**************/
@Override
public @Nullable Integer doPingDB() {
- final @Nullable Long result = Yank.queryScalar(sqlPingDB, (Class<@Nullable Long>) Long.class, null);
- return result != null ? result.intValue() : null;
+ final @Nullable Long result = Yank.queryScalar(sqlPingDB, Long.class, null);
+ return Objects.nonNull(result) ? result.intValue() : null;
}
/*************
*/
@NonNullByDefault
public class JdbcPostgresqlDAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = org.postgresql.Driver.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = org.postgresql.ds.PGSimpleDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcPostgresqlDAO.class);
/********
* INIT *
********/
public JdbcPostgresqlDAO() {
- super();
initSqlQueries();
initSqlTypes();
initDbProps();
// databaseProps.setProperty("dataSource.prepStmtCacheSqlLimit", "2048");
// Properties for HikariCP
- databaseProps.setProperty("driverClassName", "org.postgresql.Driver");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
// driverClassName OR BETTER USE dataSourceClassName
- // databaseProps.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource");
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
// databaseProps.setProperty("maximumPoolSize", "3");
// databaseProps.setProperty("minimumIdle", "2");
}
String sql = StringUtilsExt.replaceArrayMerge(sqlInsertItemValue,
new String[] { "#tableName#", "#dbType#", "#tablePrimaryValue#" },
new String[] { storedVO.getTableName(), storedVO.getDbType(), sqlTypes.get("tablePrimaryValue") });
- Object[] params = new Object[] { storedVO.getValue() };
+ Object[] params = { storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} value='{}'", sql, storedVO.getValue());
Yank.execute(sql, params);
}
*/
@NonNullByDefault
public class JdbcSqliteDAO extends JdbcBaseDAO {
+ private static final String DRIVER_CLASS_NAME = org.sqlite.JDBC.class.getName();
+ @SuppressWarnings("unused")
+ private static final String DATA_SOURCE_CLASS_NAME = org.sqlite.SQLiteDataSource.class.getName();
+
private final Logger logger = LoggerFactory.getLogger(JdbcSqliteDAO.class);
/********
* INIT *
********/
public JdbcSqliteDAO() {
- super();
initSqlQueries();
initSqlTypes();
initDbProps();
*/
private void initDbProps() {
// Properties for HikariCP
- databaseProps.setProperty("driverClassName", "org.sqlite.JDBC");
+ databaseProps.setProperty("driverClassName", DRIVER_CLASS_NAME);
// driverClassName OR BETTER USE dataSourceClassName
- // databaseProps.setProperty("dataSourceClassName", "org.sqlite.SQLiteDataSource");
+ // databaseProps.setProperty("dataSourceClassName", DATA_SOURCE_CLASS_NAME);
}
/**************
@Override
public @Nullable String doGetDB() {
- return Yank.queryColumn(sqlGetDB, "file", (Class<@Nullable String>) String.class, null).get(0);
+ return Yank.queryColumn(sqlGetDB, "file", String.class, null).get(0);
}
@Override
String sql = StringUtilsExt.replaceArrayMerge(sqlInsertItemValue,
new String[] { "#tableName#", "#dbType#", "#tablePrimaryValue#" },
new String[] { storedVO.getTableName(), storedVO.getDbType(), sqlTypes.get("tablePrimaryValue") });
- Object[] params = new Object[] { storedVO.getValue() };
+ Object[] params = { storedVO.getValue() };
logger.debug("JDBC::doStoreItemValue sql={} value='{}'", sql, storedVO.getValue());
Yank.execute(sql, params);
}
}
matcher.reset();
matcher.find();
- if (!matcher.group(1).equals("sqltype")) {
+ if (!"sqltype".equals(matcher.group(1))) {
continue;
}
String itemType = matcher.group(2);
if (serviceName != null) {
switch (serviceName) {
case "derby":
- warn += "\tDerby: version >= 10.11.1.1 from https://mvnrepository.com/artifact/org.apache.derby/derby\n";
+ warn += "\tDerby: version >= 10.14.2.0 from https://mvnrepository.com/artifact/org.apache.derby/derby\n";
break;
case "h2":
warn += "\tH2: version >= 1.4.189 from https://mvnrepository.com/artifact/com.h2database/h2\n";
warn += "\tHSQLDB: version >= 2.3.3 from https://mvnrepository.com/artifact/org.hsqldb/hsqldb\n";
break;
case "mariadb":
- warn += "\tMariaDB: version >= 1.2.0 from https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client\n";
+ warn += "\tMariaDB: version >= 1.4.6 from https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client\n";
break;
case "mysql":
- warn += "\tMySQL: version >= 5.1.36 from https://mvnrepository.com/artifact/mysql/mysql-connector-java\n";
+ warn += "\tMySQL: version >= 8.0.30 from https://mvnrepository.com/artifact/mysql/mysql-connector-java\n";
break;
case "postgresql":
- warn += "\tPostgreSQL:version >= 9.4.1208 from https://mvnrepository.com/artifact/org.postgresql/postgresql\n";
+ warn += "\tPostgreSQL:version >= 42.4.1 from https://mvnrepository.com/artifact/org.postgresql/postgresql\n";
break;
case "sqlite":
warn += "\tSQLite: version >= 3.16.1 from https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc\n";
--- /dev/null
+/**
+ * Copyright (c) 2010-2022 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+@org.osgi.annotation.bundle.Header(name = org.osgi.framework.Constants.DYNAMICIMPORT_PACKAGE, value = "*")
+package org.openhab.persistence.jdbc.internal;
+
+/**
+ * This dynamic import is required for loading the JDBC driver class.
+ *
+ * @author Wouter Born - Initial contribution
+ */