欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

初探SchemaExport工具使用

系統(tǒng) 1772 0

之前都是用最蠢的方法:SQL建立數(shù)據(jù)庫相關(guān)的表,然后再Java寫映射寫配置文件.....

實(shí)際上使用Hibernate自帶的工具 hbm2ddl ,建立根據(jù)你的對(duì)象建立數(shù)據(jù)庫是很愜意的一件事;)

首先當(dāng)然要建好POJO object, XML Mapping File(也可以使用工具根據(jù)POJO class建立),配置文件(hibernate.cfg.xml)

然后運(yùn)行下面的Java代碼

?

    import org.hibernate.cfg.Configuration; 
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class SchemaUtil {
    public static void main(String[] args) {

        Configuration cfg = new Configuration().configure();
        SchemaExport schemaExport= new SchemaExport(cfg);
        schemaExport.create(false, true);
    }
}

  

再看看數(shù)據(jù)庫,表是不是已經(jīng)幫你建好了,對(duì)于我這樣不熟悉數(shù)據(jù)庫的人真是太方便了

?

?

  • 引入
  • SchemaExport工具
  • SchemaUpdate工具
  • 實(shí)例分析
  • 結(jié)語

引入

我其實(shí)都是一直先編寫持久化類和映射文件,然后使用SchemaExport工具生成數(shù)據(jù)庫架構(gòu)。這樣的方式就是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)/開發(fā)(DDD,Domain Driven Design/Development)。我的理解是系統(tǒng)的設(shè)計(jì)應(yīng)該基于對(duì)象模型,主要考慮對(duì)象的設(shè)計(jì)和邏輯上,然后按照對(duì)象模型建立數(shù)據(jù)庫關(guān)系模型,這才是現(xiàn)在面向?qū)ο箝_發(fā)的步驟,并不是上一篇先設(shè)計(jì)數(shù)據(jù)庫然后再設(shè)計(jì)對(duì)象。用一幅圖可以形象的說明領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)模型

當(dāng)在設(shè)計(jì)時(shí),我們的領(lǐng)域模型需要改變,只需修改Hibernate結(jié)構(gòu)和應(yīng)用程序,不需要修改數(shù)據(jù)庫架構(gòu),只要利用SchemaExport工具重新生成數(shù)據(jù)庫架構(gòu)就可以了。但是使用數(shù)據(jù)庫只是其中一種方式,我們也可以使用XML文件來存儲(chǔ)數(shù)據(jù)。

SchemaExport工具

Hibernate的hbm2dll提供SchemaExport工具:給定一個(gè)連接字符串和映射文件,不需輸入其他東西就可以按照持久化類和映射文件自動(dòng)生成數(shù)據(jù)庫架構(gòu),現(xiàn)在SchemaExport工具還不是很強(qiáng)大,但是一般應(yīng)用足夠了,它還是一個(gè)相當(dāng)原始的API還在不斷改進(jìn)。

SchemaExport工具就是把DDL腳本輸出到標(biāo)準(zhǔn)輸出,同時(shí)/或者執(zhí)行DDL語句。SchemaExport工具提供了三個(gè)方法,分別是Drop()、Create()、Execute(),前兩個(gè)方法實(shí)質(zhì)是調(diào)用Execute()方法。通常使用Execute()方法來生成數(shù)據(jù)庫架構(gòu)的。

SchemaUpdate工具

在Hibernate2.0中新添加SchemaUpdate工具,可以用來更新數(shù)據(jù)庫架構(gòu)。但是我覺得沒有什么作用,因?yàn)樗荒蹹rop現(xiàn)有的表或列,也不能更新現(xiàn)有的列,只能添加新的表和列。如果我需要?jiǎng)h除表或者列或者修改其中列,SchemaUpdate工具就顯得無能為力了。

實(shí)例分析

知道了上面的知識(shí)就好好實(shí)戰(zhàn)一下:看看具體怎么使用呢?

1.SchemaExport工具實(shí)戰(zhàn)

通常我們使用生成數(shù)據(jù)庫架構(gòu)代碼實(shí)例像這樣:

    
      Configuration 
    
    cfg=
    
      new 
    
    
      Configuration
    
    ();
cfg.Configure();

    
      SchemaExport 
    
    export =
    
      new 
    
    
      SchemaExport
    
    (cfg);
export.Execute(....);
  

1.準(zhǔn)備工作

現(xiàn)在數(shù)據(jù)訪問測(cè)試層新建一SchemaExportFixture.cs文件用于測(cè)試生成實(shí)戰(zhàn)。聲明一個(gè)全局變量_cfg,編寫?[SetUp]方法在每個(gè)測(cè)試方法執(zhí)行之前調(diào)用:

    [
    
      TestFixture
    
    ]

    
      public class 
    
    
      SchemaExportFixture

    
    {
    
    
      private 
    
    
      Configuration 
    
    _cfg;
    [
    
      SetUp
    
    ]
    
    
      public void 
    
    SetupContext()
    {
        _cfg = 
    
      new 
    
    
      Configuration
    
    ();
        _cfg.Configure();
    }
    
    
      //測(cè)試......
    
    
}
  

2.測(cè)試Drop(script, export)方法

    [
    
      Test
    
    ]

    
      public void 
    
    DropTest()
{
    
    
      var 
    
    export = 
    
      new 
    
    
      SchemaExport
    
    (_cfg);
    export.Drop(
    
      true
    
    , 
    
      true
    
    );
}
  

Drop(script, export)方法根據(jù)持久類和映射文件執(zhí)行刪除數(shù)據(jù)庫架構(gòu)。有兩個(gè)參數(shù),第一個(gè)為True就是把DDL語句輸出到控制臺(tái),第二個(gè)為True就是根據(jù)持久類和映射文件執(zhí)行刪除數(shù)據(jù)庫架構(gòu)操作,經(jīng)過調(diào)試可以發(fā)現(xiàn)Drop(script, export)方法其實(shí)質(zhì)是執(zhí)行了Execute(script, export, true, true)方法。

3.測(cè)試Create(script, export)方法

    [
    
      Test
    
    ]

    
      public void 
    
    CreateTest()
{
    
    
      var 
    
    export = 
    
      new 
    
    
      SchemaExport
    
    (_cfg);
    export.Create(
    
      true
    
    , 
    
      true
    
    );
}
  

Create(script,export)方法根據(jù)持久類和映射文件先刪除架構(gòu)后創(chuàng)建刪除數(shù)據(jù)庫架構(gòu)。有兩個(gè)參數(shù),第一個(gè)為True就是把DDL語句輸出到控制臺(tái),第二個(gè)為True就是根據(jù)持久類和映射文件先執(zhí)行刪除再執(zhí)行創(chuàng)建操作,經(jīng)過調(diào)試可以發(fā)現(xiàn)這個(gè)方法其實(shí)質(zhì)是執(zhí)行Execute(script,export, false, true)方法。

4.測(cè)試Execute(script, export, justDrop, format)方法

    [
    
      Test
    
    ]

    
      public void 
    
    ExecuteTest()
{
    
    
      var 
    
    export = 
    
      new 
    
    
      SchemaExport
    
    (_cfg);
    export.Execute(
    
      true
    
    , 
    
      true
    
    , 
    
      false
    
    , 
    
      false
    
    );
}
  

Execute(script, export, justDrop, format)方法根據(jù)持久類和映射文件先刪除架構(gòu)后創(chuàng)建刪除數(shù)據(jù)庫架構(gòu)。有四個(gè)參數(shù),第一個(gè)為True就是把DDL語句輸出到控制臺(tái);第二個(gè)為True就是根據(jù)持久類和映射文件在數(shù)據(jù)庫中先執(zhí)行刪除再執(zhí)行創(chuàng)建操作;第三個(gè)為false表示不是僅僅執(zhí)行Drop語句還執(zhí)行創(chuàng)建操作,這個(gè)參數(shù)的不同就擴(kuò)展了上面兩個(gè)方法;第四個(gè)參數(shù)為false表示不是格式化輸出DDL語句到控制臺(tái),是在一行輸出的。

所謂格式化輸出就像這樣:

格式化輸出

一行輸出就像這樣:

一行輸出

5.測(cè)試Execute(script, export, justDrop, format, connection, exportOutput)方法

    [
    
      Test
    
    ]

    
      public void 
    
    ExecuteOutTest()
{
    
    
      var 
    
    export = 
    
      new 
    
    
      SchemaExport
    
    (_cfg);
    
    
      var 
    
    sb = 
    
      new 
    
    
      StringBuilder
    
    ();
    
    
      TextWriter 
    
    output = 
    
      new 
    
    
      StringWriter
    
    (sb);
    export.Execute(
    
      true
    
    , 
    
      false
    
    , 
    
      false
    
    , 
    
      false
    
    , 
    
      null
    
    , output);
}
  

Execute(script, export, justDrop, format, connection, exportOutput)方法根據(jù)持久類和映射文件先刪除架構(gòu)后創(chuàng)建刪除數(shù)據(jù)庫架構(gòu)。有六個(gè)參數(shù),第一個(gè)為True就是把DDL語句輸出到控制臺(tái);第二個(gè)為false就是不執(zhí)行DDL語句;第五個(gè)為自定義連接。當(dāng)export為true執(zhí)行語句時(shí)必須打開連接。該方法不關(guān)閉連接,null就是使用默認(rèn)連接,最后一個(gè)參數(shù)自定義輸出,這里我輸出到TextWriter中。

2.SchemaUpdate工具實(shí)戰(zhàn)

現(xiàn)在數(shù)據(jù)訪問測(cè)試層新建一SchemaUpdateFixture.cs文件用于測(cè)試生成實(shí)戰(zhàn)。先聲明一個(gè)全局變量_cfg:

    
      private 
    
    
      Configuration 
    
    _cfg;
  

這里我用另外一種方式配置映射文件,先定義兩個(gè)映射XML分別代表舊的和新的這樣才能體現(xiàn)測(cè)試更新數(shù)據(jù)庫架構(gòu)的意義。

舊映射XML:這里我使用Product持久化類,由于在之前我們定義了Product持久化類,這里直接模擬定義映射XML:擁有主鍵ProductId和Name字段。

    
      public const string 
    
    product_xml =
    
    
      "<?xml version='1.0' encoding='utf-8' ?>" 
    
    +
    
    
      "<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'" 
    
    +
    
    
      "                 assembly='DomainModel'" 
    
    +
    
    
      "                 namespace='DomainModel'>" 
    
    +
    
    
      "  <class name='DomainModel.Entities.Product,DomainModel'>" 
    
    +
    
    
      "    <id name='ProductId'>" 
    
    +
    
    
      "      <generator class='native'/>" 
    
    +
    
    
      "    </id>" 
    
    +
    
    
      "    <property name='Name'/>" 
    
    +
    
    
      "  </class>" 
    
    +
    
    
      "</hibernate-mapping>"
    
    ;
  

新映射XML:更新上面映射XML:主鍵ProductId(沒有改變);Name字段:添加不可為空和長度為50;另外增加了Cost字段,類型為float不可為空。

    
      public const string 
    
    newproduct_xml =
    
    
      "<?xml version='1.0' encoding='utf-8' ?>" 
    
    +
    
    
      "<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'" 
    
    +
    
    
      "                 assembly='DomainModel'" 
    
    +
    
    
      "                 namespace='DomainModel'>" 
    
    +
    
    
      "  <class name='DomainModel.Entities.Product,DomainModel'>" 
    
    +
    
    
      "    <id name='ProductId'>" 
    
    +
    
    
      "      <generator class='native'/>" 
    
    +
    
    
      "    </id>" 
    
    +
    
    
      "    <property name='Name' not-null='true' length='50' />" 
    
    +
    
    
      "    <property name='Cost' type='float' not-null='true'/>" 
    
    +
    
    
      "  </class>" 
    
    +
    
    
      "</hibernate-mapping>"
    
    ;
  

測(cè)試前利用舊映射XML創(chuàng)建數(shù)據(jù)庫架構(gòu):使用[SetUp]在測(cè)試前執(zhí)行,按照舊映射XML創(chuàng)建數(shù)據(jù)庫架構(gòu)并格式化輸出DDL語句:

    [
    
      SetUp
    
    ]

    
      public void 
    
    SetupContext()
{
    
    
      //模擬舊系統(tǒng)
    
    
    _cfg = 
    
      new 
    
    
      Configuration
    
    ();
    _cfg.Configure();
    _cfg.AddXml(product_xml);
    
    
      var 
    
    export = 
    
      new 
    
    
      SchemaExport
    
    (_cfg);
    export.Execute(
    
      true
    
    , 
    
      true
    
    , 
    
      false
    
    , 
    
      true
    
    );
}
  

測(cè)試更新數(shù)據(jù)庫架構(gòu):使用SchemaUpdate類提供的唯一的Execute(script, doUpdate)方法按照新映射XML更新數(shù)據(jù)庫架構(gòu):

    [
    
      Test
    
    ]

    
      public void 
    
    UpdateExistingDatabaseSchemaTest()
{
    _cfg = 
    
      new 
    
    
      Configuration
    
    ();
    _cfg.Configure().AddXml(newproduct_xml);
    
    
      var 
    
    update = 
    
      new 
    
    
      SchemaUpdate
    
    (_cfg);
    update.Execute(
    
      true
    
    , 
    
      true
    
    );
}
  

測(cè)試輸出結(jié)果如圖所示,如果你覺得不放心再看看數(shù)據(jù)庫Product表。

輸出結(jié)果

看到了嗎?這顯然不是我要求的,首先按照舊映射XML創(chuàng)建了數(shù)據(jù)庫架構(gòu),但是更新數(shù)據(jù)庫架構(gòu)顯得無能為力,僅僅增加了Cost字段,我想更新Name字段屬性為不可為空和長度為50,但是SchemaUpdate工具不能做到!我覺得這個(gè)類目前還沒有什么作用,期待下一個(gè)版本來完善。

結(jié)語

這篇文章通過實(shí)例介紹Hibernate中提供兩個(gè)實(shí)用工具SchemaExport工具利用持久化類和映射文件生成數(shù)據(jù)庫架構(gòu)。SchemaUpdate工具通過持久化類和映射文件更新數(shù)據(jù)庫架構(gòu)。

初探SchemaExport工具使用


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲小视频在线播放 | 在线观看欧美成人 | 看片国产| 午夜在线免费观看视频 | av一级久久 | 亚洲综合亚洲国产尤物 | 天海翼视频在线 | 久久我们这里只有精品国产4 | 成人在线精品视频 | 久久国产一区二区 | 亚洲国产精久久久久久久 | 成年人免费小视频 | 婷婷色九月综合激情丁香 | 国产亚洲一区二区三区 | 92精品国产自产在线观看48页 | 在线观看91精品国产入口 | 欧美一级在线观看视频 | 日韩精品一区二区在线播放 | 上海一级毛片 | 亚洲久草视频 | 91不卡在线 | 99精品视频在线 | 欧美激情一区二区亚洲专区 | 在线精品国内外视频 | 香蕉久久一区二区不卡无毒影院 | 91 在线观看 | 99热精品在线 | 欧美图片激情小说 | 国内精品视频九九九九 | 久久人人精品 | 热灸灸这里只有精品 | 国产一区二区三区久久久久久久久 | 欧美日韩中文 | 五月天婷婷免费观看视频在线 | 国产麻豆剧传媒精品好看的片 | 国产福利在线免费 | 国产一区二区三区免费观看 | 二区三区偷拍浴室洗澡视频 | free-porn-ok.com| 国产精品 第1页 | 亚洲欧洲精品成人久久奇米网 |