2010-11-27 34 views
2

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

任何想法,如何做到这一点? (我不想在应用程序内部编写特殊方法来检查,表是否存在,如果不存在,是否创建它们,是否还有其他有用的方法存在?)

P.S.我正在考虑使用Hibernate而不是简单的连接方法。有什么办法可以使用Hibernate来解决它吗?

回答

3

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

只需通过您的web应用程序的安装程序创建数据库即可。这也可以通过网络来完成。

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

+0

哦......那就是我需要的!你可以给我一些链接或使用ServletContextListener的例子在这种情况下? – Ilnur 2010-11-28 20:01:04

+0

在[这个答案]中有一个例子(http://stackoverflow.com/questions/4175726/how-do-i-load-a-java-class-not-a-servlet-when-the-tomcat-server-启动/ 4175742#4175742)。 – BalusC 2010-11-28 20:02:19

+0

是的,我明白了。但是我在ServletContextListener中获取bean的麻烦很大。如何@Autowire这个类的一些字段(例如一些字段,如:DBInitService dbInitService)。它需要,因为dataSource也是bean,所以它应该被自动装入到我的应用程序中。但是在这个监听器里面,我无法得到任何这些类。另外,我不能让听众自动装配。怎么做? – Ilnur 2010-11-28 21:45:23

1

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

2

Spring JDBC有一个standard mechanism for initializing databases

如果要初始化一个数据库,你可以提供一个DataSource bean的引用,使用初始化数据库标签的春天-JDBC命名空间:

<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:hibern吃了也可以自动生成数据库模式,下面是相关部分的参考文献:Automatic Schema Generation