【问题标题】:Does any embedded DB support JSON datatype?是否有任何嵌入式数据库支持 JSON 数据类型?
【发布时间】:2016-01-05 02:59:15
【问题描述】:

我正在开发一个使用 postgresql 作为数据库的基于 Spring 的 Web 应用程序。我在 postgresql 中使用 JSON 数据类型。我已经为实体配置了休眠自定义用户类型以支持 JSON 数据类型。

现在我想使用任何嵌入式数据库测试我的 DAO 对象。是否有任何支持 JSON 数据类型的嵌入式数据库,可以在 Spring 应用程序中使用。

【问题讨论】:

  • 使用与生产环境不同的 DBMS 进行测试通常不是一个好主意。
  • H2、HSQLDB 或任何其他内存数据库等数据库是否支持 JSON 类型?
  • 我实际上正在尝试通过使用自定义脚本对这种类型进行存根来解决它:DROP TYPE json IF EXISTS; CREATE TYPE json AS text; for HSQLDB。它没有解决任何问题,但至少创建了模式。我现在遇到的问题是插入一行的异常。

标签: spring hibernate


【解决方案1】:

当您使用特定于数据库的功能时 - 如 PostgreSQL 中的 JSON 支持,为了安全起见,您必须使用相同类型的数据库进行测试。在您的情况下,您想测试您的 DAO 对象:

  • 假设 PostgreSQL 安装在本地主机上,并确保所有运行测试的环境都是这种情况
  • 甚至更好 - 尝试使用 otj-pg-embedded 下载并启动 PostgreSQL 以进行 JUnit 测试(我没有在实际项目中使用它)

更新

如果您能够在测试环境中运行 Docker 而不是嵌入式数据库,请通过 TestContainers 使用真正的 Postgres

【讨论】:

  • 我可以使用 Postgres,但作为单元测试的一部分,我应该在像 H2 这样的内存数据库中使用。在 H2 中有 PosgreSQL 兼容模式,但它没有 JSON 类型。所以我假设,唯一的选择是使用 POSTGRES 本身。谢谢。
【解决方案2】:
            package miniCodePrjPkg;

            import java.util.List;
            import java.util.Map;

            import org.apache.commons.dbutils.QueryRunner;
            import org.apache.commons.dbutils.handlers.MapListHandler;

            import java.sql.Connection;
            import java.sql.DriverManager;
            import java.sql.SQLException;
            import java.sql.Statement;

            import com.fasterxml.jackson.core.JsonProcessingException;
            import com.fasterxml.jackson.databind.ObjectMapper;
            import com.google.common.collect.ImmutableList;
            import com.google.common.collect.ImmutableMap;
            import com.google.common.collect.Lists;
            import com.google.common.collect.Maps;

            //import com.wix.mysql.EmbeddedMysql;
            //
            //import static com.wix.mysql.EmbeddedMysql.anEmbeddedMysql;
            //import static com.wix.mysql.ScriptResolver.classPathScript;
            //import static com.wix.mysql.distribution.Version.v5_7_latest;

            public class DslQueryCollList {
                public static void main(String[] args) throws Exception {

                    // apache comm coll cant ,only array is ok..cant json_object eff
                    // Map m=Maps.
                    Map myMap = Maps.newHashMap(ImmutableMap.of("name", 999999999, "age", 22));
                    Map myMap2 = Maps.newHashMap(ImmutableMap.of("name", 8888888, "age", 33));

                    List li = new ImmutableList.Builder().add(myMap).add(myMap2).build();
                    System.out.println(li);
                    // /db/xx.sql
            //   EmbeddedMysql mysqld = anEmbeddedMysql(v5_7_latest)
            //              .addSchema("aschema", classPathScript("iniListCache.sql"))
            //              .start();

                    // this just start..and u need a cliednt as common to conn..looks trouble than
                    // sqlite
                    String sql = " json_extract(jsonfld,'$.age')>30";

                    List<Map<String, Object>> query = queryList(sql, li);
                    System.out.println(query);
                    // run.query(conn, sql, rsh)
                }

                private static List<Map<String, Object>> queryList(String sql_query, List li)
                
                        throws ClassNotFoundException, SQLException, JsonProcessingException {
                sql_query="SELECT * FROM sys_data where "+sql_query;
                
                    String sql = null;
                    Class.forName("org.sqlite.JDBC");

                    Connection c = DriverManager.getConnection("jdbc:sqlite:test.db");
                    Statement stmt = c.createStatement();

                    String sql2 = "drop TABLE sys_data ";
                    exeUpdateSafe(stmt, sql2);
                    sql2 = "CREATE TABLE sys_data (jsonfld json  )";
                    exeUpdateSafe(stmt, sql2);

                    // insert into facts values(json_object("mascot", "Our mascot is a dolphin name
                    // sakila"));
                    //
                    for (Object object : li) {
                        String jsonstr = new ObjectMapper().writeValueAsString(object);
                        sql = "insert into sys_data values('" + jsonstr + "');";
                        // sql = "insert into sys_data values('{\"id\":\"19\", \"name\":\"Lida\"}');";
                        exeUpdateSafe(stmt, sql);

                    }

                    //sql = "SELECT json_extract(jsonfld,'$.name') as name1 FROM sys_data limit 1;";
                //  System.out.println(sql);
                    QueryRunner run = new QueryRunner();
                    // maphandler scare_handler
                    System.out.println(sql_query);
                    List<Map<String, Object>> query = run.query(c, sql_query, new MapListHandler());
                    System.out.println(query);
                    List li9=Lists.newArrayList();
                    for (Map<String, Object> map : query) {
                        li9.add(map.get("jsonfld"));
                    }
                    return li9;
                }

                private static void exeUpdateSafe(Statement stmt, String sql2) throws SQLException {
                    try {
                        System.out.println(sql2);
                        System.out.println(stmt.executeUpdate(sql2));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }

            }

【讨论】:

  • 欢迎来到 Stack Overflow!请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:stackoverflow.com/help/how-to-answer。谢谢!
猜你喜欢
  • 2012-01-30
  • 2021-11-18
  • 2011-05-12
  • 2018-05-17
  • 1970-01-01
  • 2012-02-28
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多