搜尋

首頁  >  問答  >  主體

java - 使用Springboot搭建的web應用,運行中,資料庫表可否自動產生使用?

1.先說前提:
使用spring boot搭建的spring應用;
使用了Hibernate,在pom中加入了spring-boot-starter-data-jpa;
資料庫是MySql;
開發工具是IDEA。

我以前沒有做過web開發,對資料庫也了解的也不多,所以我下面要說的,如果有不現實或實現方式不好的情況,希望大家不吝賜教,多謝! !

2.想達到的需求:
比如說,
我這個資料庫中要錄入多個學校的若干個學生的資料。
資料量可能非常大,我不想把那麼多學生資訊放在同一個表中。
我的設想是,
每一所學校一個「XX學校學生資訊表」(tbl_School_XX,例如「tbl_School_01」),然後把該校學生的資料錄入那個表中。
應用程式本身學校索引表(tbl_School_Index),這個表格中有一個索引欄位(例如index)來存各學校的表名(例如「tbl_School_01」)。
·當要輸入新的學校的學生訊息,則在新增學校時,應用程式會自動產生一個新的“XX學校學生資訊表”,應用程式會自動起好表名(例如“tbl_School_01”),用這份新表來存新學校的學生的資料。同時,這個表名也會加入學校索引表(tbl_School_Index)的索引欄位(index)。
·當要讀取學生訊息,或當要輸入現有學校的新學生資訊時,則會從學校索引表(tbl_School_Index)中找出索引欄位(index)中的資料(例如「tbl_School_01」) ,然後讀/寫表tbl_School_01。

如圖

3.我目前遇上的困難是:
(1)我知道關係型資料庫不允許表中表,所以才想出這麼一種辦法,不知道是否可行,或者說,是否恰當。
(2)當我新建一個實體類別(@Entity)時,配置好屬性和get/set方法後,運行應用,會在資料庫中產生對應的一個表,可是我不需要產生那個表,我是需要當加入學校時,動態的產生對應到那個實體類別的表。

4.其他想法

我有想過把幾個學校的所有學生的資訊放在一個表中,然後在那個表裡添加一個“學校”字段來標註該學生是哪所學校的,但是我怕當數據量變大時,這個表的使用會出各種問題。

5.我說的可能有點囉嗦,多謝各位認真看完,望能指點迷經,多謝!

仅有的幸福仅有的幸福2701 天前1366

全部回覆(1)我來回復

  • 学习ing

    学习ing2017-07-05 10:48:15

    當要輸入新的學校的學生信息,則在添加學校時,應用會自動生成一個新的“XX學校學生信息表”,應用會自動起好表名(比如“tbl_School_01”),用這個新表來存新學校的學生的資料。同時,這個表名也會加入學校索引表(tbl_School_Index)的索引欄位(index)。

    首先根據你目前的描述(目前的描述沒有涉及到一些需要跨表之類的操作)這種方式是可行的,當添加學生時,如果學校不存在,需要插入學校索引,並新建相關表然後插入學生訊息,這個可以用代碼實現(這是在不重啟應用的情況下),不重啟應用的情況下,用配置我不知道能否實現,如果有人知道,麻煩告知,謝謝。

    (2)當我新建一個實體類別(@Entity)時,配置好屬性和get/set方法後,運行應用,會在資料庫中產生對應的一個表,可是我不需要產生那個表,我需要當加入學校時,動態的產生對應到那個實體類別的表。

    你這裡說的是應用可以重啟,如果應用可以重啟,那是可以透過設定來插入數據,並且自動建表的。需要對hibernate進行配置,並把對應SQL的腳本放到resources下面就可以了。

    application.properties中hibernate的設定

    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
    spring.datasource.username=root
    spring.datasource.password=root
    
    # 1
    spring.jpa.properties.hibernate.hbm2ddl.auto=update
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    
    # 2
    spring.jpa.show-sql=true

    sql腳本存放

    回覆
    0
  • 取消回覆