【问题标题】:How to execute raw SQL on DB (not on specific table)如何在数据库上执行原始 SQL(不在特定表上)
【发布时间】:2017-12-15 11:03:53
【问题描述】:

我在我的应用程序中使用 PostgreSQL 和 ORMlite,它在 Windows 服务器上运行。在创建所有表之前,我需要验证数据库是否存在于 Postgres 中,如果没有,我必须创建它。

我已经有了我的 SQL Raw:

  • 检查是否存在:
    final String SQL = "SELECT 1 from pg_database WHERE datname='MY_NOME_DB' ;";

  • 创建它(如果不存在):
    String SQL= "CREATE DATABASE MY_NOME_DB ; " ;

问题:如何使用 ORMLite 执行它? 我知道要执行我可以使用的原始 SQL:

myDAO.executeRaw(SQL);

但是这里它不在特定的表上,所以我不能使用它,因为我无法创建 myDAO。

【问题讨论】:

  • 我不知道 postgresql 或 ormlite 但是对于 MySQL 我可以创建一个连接不指定要使用的数据库,然后发出SHOW databases LIKE 'MY_NOME_DB' 命令。
  • Before to create all the tables, I need to verify if the database is existing in PostSql, and if not I have to create it. 不好的方法。只需创建它们。如果失败,则表已经存在,或者您不允许创建它们。数据库也一样:尝试连接它。如果失败...
  • 这是一个可怕的想法,因为这意味着您的应用程序必须使用超级用户帐户连接到服务器。这不是你应该做的。
  • 如果我在应用内使用超级用户没问题; java应用程序和数据库在同一台服务器上,应用程序是唯一访问数据库的应用程序。所以用户名和密码隐藏在java代码中......

标签: java sql postgresql ormlite


【解决方案1】:

我也同意这不是好的做法。
但是您的意图在 ormLite 中是可能的。
您可以使用原始查询任何 DAO。 DAO 在表中没有严格的界限。

参考我的示例代码。

sqls.xml :它包含原始查询。您可以定义任何原始查询。

<item name="sql_login" type="string">
    SELECT AdminPubTBL.*
    FROM PDARunPubTBL
    JOIN AdminPubTBL ON PDARunPubTBL.AdminSeqNo = AdminPubTBL.AdminSeqNo
    .....
      AND AdminPubTBL.AdminPwd = \'@adminPwd\' LIMIT 1
</item>

adminDao.java

public interface AdminDao {
    Admin login(int pdaSeqNo, int sectionSeqNo, String adminId, String adminPwd, String corpCode);

adminDaoOrmLite.java :您可以使用queryRaw 并返回到任何Java 对象。

public class AdminDaoOrmLite implements AdminDao {
    @Nullable
    private DatabaseHelper databaseHelper = null;
    @Nullable
    private Dao<Admin, Integer> adminDao = null;
    public Admin login(int pdaSeqNo, int sectionSeqNo, @NonNull String adminId, String adminPwd, String corpCode) {
        String sql = context.getResources().getString(R.string.sql_login)
                .replace("@pdaSeqNo", String.valueOf(pdaSeqNo))
                .replace("@sectionSeqNo", String.valueOf(sectionSeqNo))
                .replace("@adminId", adminId)
                .replace("@adminPwd", hashedPassword(adminPwd,corpCode));
        try {
            return adminDao.queryRaw(sql, adminDao.getRawRowMapper()).getFirstResult();
        } catch (SQLException e) {
            LOG.error(e);
        }
    }

因此,如果您想要原始查询。做common DAO,然后执行.queryRaw()

【讨论】:

  • 嗨,什么是管理员?它可能是一类Android?我不在Android上,我在PC上,所以databaseHelper也不可用...
  • pc和android的主要区别是在哪里使用jdbc或者databasehelper。 DAO 的用法是一样的。您可以只使用来自 DAO 的 jdbc 连接。 ormlite 可以从任何 DAO 执行任何原始 sql。但不推荐。
  • 如果你只想create table if not exist,你可以选择connection.executeStatement(raw)而不是DAO。您可以在programcreek.com/java-api-examples/… 中找到示例
  • 最终解决方案:在故事的最后,我通过 jdcb 驱动程序创建了一个连接,然后执行 'connection.executeStatement(raw)'
【解决方案2】:

我没有寻找它,但可能有其他(更好的)解决方案,而不是你的。

通常,将应用程序和基础架构耦合并不是一个好方法。您的 PostgreSql 是您的基础架构的一部分,您的应用程序不应该关心您的基础架构是否已设置。

更好的方法是拆分您的基础架构定义,可能使用简单的 Bash 脚本或(理想情况下)类似 Terraform 的东西,并且不要将您的应用程序与基础架构耦合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多