【问题标题】:JDBC Create tableJDBC 创建表
【发布时间】:2011-05-16 16:18:42
【问题描述】:

我的 Web 应用程序是用 Spring Web-MVC 编写的,它使用 JDBC 来处理数据。我想让我的应用程序在最终用户第一次运行它时自动创建表(和模式)(但加载创建的模式,当它再次运行时)。我使用 HSQLDB 作为数据库引擎。

任何想法,怎么做? (我不想在应用程序内部编写特殊方法来检查表是否存在,如果不存在,则创建它们。是否存在更有用的方法?)

附:我正在考虑使用 Hibernate 而不是简单的连接方法。有没有办法使用 Hibernate 解决它?

【问题讨论】:

    标签: java spring jdbc spring-mvc hsqldb


    【解决方案1】:

    我不想在应用程序内部编写特殊方法来检查表是否存在,如果不存在,则创建它们。有没有更有用的方法呢?

    只需通过 Web 应用程序的安装程序创建数据库。这也可以基于网络完成。

    另一种方法是实现ServletContextListener,它检查数据库并在必要时创建表。 ServletContextListener 在应用程序启动期间只执行一次,因此您不需要在每次请求时都检查它。

    【讨论】:

    • 哦...这就是我需要的!你能给我一些在这种情况下使用 ServletContextListener 的链接或示例吗?
    • this answer中有一个例子。
    • 是的,我明白了。但是我在 ServletContextListener 中获取 bean 时遇到了很大的麻烦。如何@Autowire 此类的某些字段(例如某些字段,例如:DBInitService dbInitService)。它需要,因为 dataSource 也是 bean,所以它应该自动连接到我的应用程序。但是在这个 Listener 里面我不能得到任何这些类。另外,我不能让听众自动连线。怎么办?
    【解决方案2】:

    Spring JDBC 有一个standard mechanism for initializing databases

    如果要初始化数据库并且可以提供对 DataSource bean 的引用,请使用 spring-jdbc 命名空间中的 initialize-database 标签:

    <jdbc:initialize-database data-source="dataSource">`
      <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
      <jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
    </jdbc:initialize-database>
    

    您也可以使用系统属性打开或关闭此功能:

    <jdbc:initialize-database data-source="dataSource"
        enabled="#{systemProperties.INITIALIZE_DATABASE}">
      <jdbc:script location="..."/>
    </jdbc:initialize-database>
    

    关于使用hibernate:hibernate也可以自动生成数据库schema,相关部分参考这里:Automatic Schema Generation

    【讨论】:

    • 如果我使用这个属性:,它会重新创建模式,如果它已经存在?
    • @Ilnur 有两种处理方法。 a) 防御性地编写 SQL 代码,例如CREATE SCHEMA IF NOT EXISTS b) 在预定义的位置创建一个文件(例如%HOME%/.yourapp/.schemagen)检查该文件是否存在(例如使用SpEL:static.springsource.org/spring/docs/3.0.x/…
    【解决方案3】:

    我刚刚开始创建基于 Spring 的应用程序。我正在使用 JPA + Hibernate 来实现数据库访问层。这种方式的一个好的副作用是它的行为与您所描述的完全一样,即数据库是在应用程序启动时自动创建的。非常方便。我什至没有为这个项目写过一行 SQL,而且我有带有索引、外键和主键等的数据库。这太棒了,我建议你也这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 2020-04-18
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多