天天看點

Spring使用記憶體資料庫

有時候為了做些測試需要建立資料庫及相關表,安裝MySQL等輕量資料庫雖然簡單但還是有點麻煩?而且用于自己臨時測試的資料庫對象一般不會被多次使用,還是浪費?記憶體資料庫結合ORM可以很好解決這個問題。

H2,Derby,HSQLDB 都是很好的記憶體資料庫,大家可以根據自己的需要選擇:

<a href="http://www.h2database.com/html/main.html" target="_blank">H2</a>

<a href="http://db.apache.org/derby" target="_blank">Derby</a>

<a href="http://hsqldb.org/" target="_blank">HSQLDB</a>

<a href="http://mysql.com/" target="_blank">MySQL</a>

Pure Java

Yes

No

Memory Mode

Encrypted Database

ODBC Driver

Fulltext Search

Multi Version Concurrency

Footprint (jar/dll size)

~1 MB

~2 MB

~4 MB

~6 MB

Spring已經對使用記憶體資料庫提供很完美的支援:

配置類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<code>@Configuration</code>

<code>public</code> <code>class</code> <code>HibernateConfiguration {</code>

<code>    </code><code>@Autowired</code>

<code>    </code><code>private</code> <code>DataSource dataSource;</code>

<code>    </code><code>@Bean</code>

<code>    </code><code>public</code> <code>AnnotationSessionFactoryBean sessionFactoryBean() {</code>

<code>        </code><code>Properties props = </code><code>new</code> <code>Properties();</code>

<code>        </code><code>//配置H2方言</code>

<code>        </code><code>props.put(</code><code>"hibernate.dialect"</code><code>, H2Dialect.</code><code>class</code><code>.getName());</code>

<code>        </code><code>props.put(</code><code>"hibernate.format_sql"</code><code>, </code><code>"true"</code><code>);</code>

<code>        </code><code>AnnotationSessionFactoryBean bean = </code><code>new</code> <code>AnnotationSessionFactoryBean();</code>

<code>        </code><code>bean.setAnnotatedClasses(</code><code>new</code> <code>Class[]{Item.</code><code>class</code><code>, Order.</code><code>class</code><code>});</code>

<code>        </code><code>bean.setHibernateProperties(props);</code>

<code>        </code><code>bean.setDataSource(</code><code>this</code><code>.dataSource);</code>

<code>        </code><code>bean.setSchemaUpdate(</code><code>true</code><code>);</code>

<code>        </code><code>return</code> <code>bean;</code>

<code>    </code><code>}</code>

<code>    </code><code>public</code> <code>HibernateTransactionManager transactionManager() {</code>

<code>        </code><code>return</code> <code>new</code> <code>HibernateTransactionManager( sessionFactoryBean().getObject() );</code>

<code>                                                   </code> 

<code>    </code><code>/**</code>

<code>     </code><code>* 設定記憶體資料庫類型,可以更改為Derby,HSQL</code>

<code>     </code><code>* @return</code>

<code>     </code><code>*/</code>

<code>    </code><code>public</code> <code>DataSource dataSource(){</code>

<code>        </code><code>EmbeddedDatabaseBuilder builder = </code><code>new</code> <code>EmbeddedDatabaseBuilder();</code>

<code>        </code><code>builder.setType(EmbeddedDatabaseType.H2);</code>

<code>        </code><code>return</code> <code>builder.build();</code>

<code>}</code>

然後我們可以寫entity類及相關測試用例:

Order Entity類:

34

35

36

37

38

39

40

41

42

43

44

45

<code>@Entity</code>

<code>@Table</code><code>(name=</code><code>"T_ORDER"</code><code>)</code>

<code>public</code> <code>class</code> <code>Order {</code>

<code>                                                 </code> 

<code>    </code><code>@Id</code>

<code>    </code><code>@GeneratedValue</code><code>(strategy=GenerationType.AUTO)</code>

<code>    </code><code>private</code> <code>Long id;</code>

<code>    </code><code>private</code> <code>String customer;</code>

<code>    </code><code>@OneToMany</code><code>(cascade=CascadeType.ALL)</code>

<code>    </code><code>@JoinColumn</code><code>(name=</code><code>"ORDER_ID"</code><code>)</code>

<code>    </code><code>private</code> <code>Collection&lt;Item&gt; items = </code><code>new</code> <code>LinkedHashSet&lt;Item&gt;();</code>

<code>     </code><code>* @return the customer</code>

<code>    </code><code>public</code> <code>String getCustomer() {</code>

<code>        </code><code>return</code> <code>customer;</code>

<code>     </code><code>* @param customer the customer to set</code>

<code>    </code><code>public</code> <code>void</code> <code>setCustomer(String customer) {</code>

<code>        </code><code>this</code><code>.customer = customer;</code>

<code>     </code><code>* @return the items</code>

<code>    </code><code>public</code> <code>Collection&lt;Item&gt; getItems() {</code>

<code>        </code><code>return</code> <code>items;</code>

<code>     </code><code>* @param items the items to set</code>

<code>    </code><code>public</code> <code>void</code> <code>setItems(Collection&lt;Item&gt; items) {</code>

<code>        </code><code>this</code><code>.items = items;</code>

<code>     </code><code>* @return the id</code>

<code>    </code><code>public</code> <code>Long getId() {</code>

<code>        </code><code>return</code> <code>id;</code>

Item Entity類

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

<code>public</code> <code>class</code> <code>Item {</code>

<code>    </code><code>@GeneratedValue</code><code>(strategy = GenerationType.AUTO)</code>

<code>    </code><code>@ManyToOne</code>

<code>    </code><code>private</code> <code>Order order;</code>

<code>    </code><code>private</code> <code>String product;</code>

<code>    </code><code>private</code> <code>double</code> <code>price;</code>

<code>    </code><code>private</code> <code>int</code> <code>quantity;</code>

<code>     </code><code>* @return the order</code>

<code>    </code><code>public</code> <code>Order getOrder() {</code>

<code>        </code><code>return</code> <code>order;</code>

<code>     </code><code>* @return the product</code>

<code>    </code><code>public</code> <code>String getProduct() {</code>

<code>        </code><code>return</code> <code>product;</code>

<code>     </code><code>* @param product</code>

<code>     </code><code>*            the product to set</code>

<code>    </code><code>public</code> <code>void</code> <code>setProduct(String product) {</code>

<code>        </code><code>this</code><code>.product = product;</code>

<code>     </code><code>* @return the price</code>

<code>    </code><code>public</code> <code>double</code> <code>getPrice() {</code>

<code>        </code><code>return</code> <code>price;</code>

<code>     </code><code>* @param price</code>

<code>     </code><code>*            the price to set</code>

<code>    </code><code>public</code> <code>void</code> <code>setPrice(</code><code>double</code> <code>price) {</code>

<code>        </code><code>this</code><code>.price = price;</code>

<code>     </code><code>* @return the quantity</code>

<code>    </code><code>public</code> <code>int</code> <code>getQuantity() {</code>

<code>        </code><code>return</code> <code>quantity;</code>

<code>     </code><code>* @param quantity</code>

<code>     </code><code>*            the quantity to set</code>

<code>    </code><code>public</code> <code>void</code> <code>setQuantity(</code><code>int</code> <code>quantity) {</code>

<code>        </code><code>this</code><code>.quantity = quantity;</code>

Junit測試類

<code>@ContextConfiguration</code>

<code>@RunWith</code><code>(SpringJUnit4ClassRunner.</code><code>class</code><code>)</code>

<code>public</code> <code>class</code> <code>OrderPersistenceTests {</code>

<code>    </code><code>private</code> <code>SessionFactory sessionFactory;</code>

<code>    </code><code>@Test</code>

<code>    </code><code>@Transactional</code>

<code>    </code><code>public</code> <code>void</code> <code>testSaveOrderWithItems() </code><code>throws</code> <code>Exception {</code>

<code>        </code><code>Session session = sessionFactory.getCurrentSession();</code>

<code>        </code><code>Order order = </code><code>new</code> <code>Order();</code>

<code>        </code><code>order.getItems().add(</code><code>new</code> <code>Item());</code>

<code>        </code><code>session.save(order);</code>

<code>        </code><code>session.flush();</code>

<code>        </code><code>assertNotNull(order.getId());</code>

<code>    </code><code>public</code> <code>void</code> <code>testSaveAndGet() </code><code>throws</code> <code>Exception {</code>

<code>        </code><code>// Otherwise the query returns the existing order (and we didn't set the</code>

<code>        </code><code>// parent in the item)...</code>

<code>        </code><code>session.clear();</code>

<code>        </code><code>Order other = (Order) session.get(Order.</code><code>class</code><code>, order.getId());</code>

<code>        </code><code>assertEquals(</code><code>1</code><code>, other.getItems().size());</code>

<code>        </code><code>assertEquals(other, other.getItems().iterator().next().getOrder());</code>

<code>    </code><code>public</code> <code>void</code> <code>testSaveAndFind() </code><code>throws</code> <code>Exception {</code>

<code>        </code><code>Item item = </code><code>new</code> <code>Item();</code>

<code>        </code><code>item.setProduct(</code><code>"foo"</code><code>);</code>

<code>        </code><code>order.getItems().add(item);</code>

<code>        </code><code>Order other = (Order) session</code>

<code>                </code><code>.createQuery( </code><code>"select o from Order o join o.items i where i.product=:product"</code><code>)</code>

<code>                </code><code>.setString(</code><code>"product"</code><code>, </code><code>"foo"</code><code>).uniqueResult();</code>

整個項目已經打包,大家可以詳閱,也可以直接參考Spring的示例項目,基本一樣。

<a href="http://down.51cto.com/data/2363898" target="_blank">附件:http://down.51cto.com/data/2363898</a>

     本文轉自sarchitect 51CTO部落格,原文連結:http://blog.51cto.com/stevex/1343060,如需轉載請自行聯系原作者