Spring使用内存数据库
有时候为了做些测试需要创建数据库及相关表,安装MySQL等轻量数据库虽然简单但还是有点麻烦?而且用于自己临时测试的数据库对象一般不会被多次使用,还是浪费?内存数据库结合ORM可以很好解决这个问题。
H2,Derby,HSQLDB 都是很好的内存数据库,大家可以根据自己的需要选择:
H2 | Derby | HSQLDB | MySQL | PostgreSQL | |
---|---|---|---|---|---|
Pure Java | Yes | Yes | Yes | No | No |
Memory Mode | Yes | Yes | Yes | No | No |
Encrypted Database | Yes | Yes | Yes | No | No |
ODBC Driver | Yes | No | No | Yes | Yes |
Fulltext Search | Yes | No | No | Yes | Yes |
Multi Version Concurrency | Yes | No | Yes | Yes | Yes |
Footprint (jar/dll size) | ~1 MB | ~2 MB | ~1 MB | ~4 MB | ~6 MB |
Spring已经对使用内存数据库提供很完美的支持:
配置类:
- @Configuration
- public class HibernateConfiguration {
- @Autowired
- private DataSource dataSource;
- @Bean
- public AnnotationSessionFactoryBean sessionFactoryBean() {
- Properties props = new Properties();
- //配置H2方言
- props.put("hibernate.dialect", H2Dialect.class.getName());
- props.put("hibernate.format_sql", "true");
- AnnotationSessionFactoryBean bean = new AnnotationSessionFactoryBean();
- bean.setAnnotatedClasses(new Class[]{Item.class, Order.class});
- bean.setHibernateProperties(props);
- bean.setDataSource(this.dataSource);
- bean.setSchemaUpdate(true);
- return bean;
- }
- @Bean
- public HibernateTransactionManager transactionManager() {
- return new HibernateTransactionManager( sessionFactoryBean().getObject() );
- }
- /**
- * 设置内存数据库类型,可以更改为Derby,HSQL
- * @return
- */
- @Bean
- public DataSource dataSource(){
- EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
- builder.setType(EmbeddedDatabaseType.H2);
- return builder.build();
- }
然后我们可以写entity类及相关测试用例:
Order Entity类:
- @Entity
- @Table(name="T_ORDER")
- public class Order {
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- private Long id;
- private String customer;
- @OneToMany(cascade=CascadeType.ALL)
- @JoinColumn(name="ORDER_ID")
- private Collection<Item> items = new LinkedHashSet<Item>();
- /**
- * @return the customer
- */
- public String getCustomer() {
- return customer;
- }
- /**
- * @param customer the customer to set
- */
- public void setCustomer(String customer) {
- this.customer = customer;
- }
- /**
- * @return the items
- */
- public Collection<Item> getItems() {
- return items;
- }
- /**
- * @param items the items to set
- */
- public void setItems(Collection<Item> items) {
- this.items = items;
- }
- /**
- * @return the id
- */
- public Long getId() {
- return id;
- }
- }
Item Entity类
- @Entity
- public class Item {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Long id;
- @ManyToOne
- private Order order;
- private String product;
- private double price;
- private int quantity;
- /**
- * @return the order
- */
- public Order getOrder() {
- return order;
- }
- /**
- * @return the product
- */
- public String getProduct() {
- return product;
- }
- /**
- * @param product
- * the product to set
- */
- public void setProduct(String product) {
- this.product = product;
- }
- /**
- * @return the price
- */
- public double getPrice() {
- return price;
- }
- /**
- * @param price
- * the price to set
- */
- public void setPrice(double price) {
- this.price = price;
- }
- /**
- * @return the quantity
- */
- public int getQuantity() {
- return quantity;
- }
- /**
- * @param quantity
- * the quantity to set
- */
- public void setQuantity(int quantity) {
- this.quantity = quantity;
- }
- /**
- * @return the id
- */
- public Long getId() {
- return id;
- }
- }
Junit测试类
- @ContextConfiguration
- @RunWith(SpringJUnit4ClassRunner.class)
- public class OrderPersistenceTests {
- @Autowired
- private SessionFactory sessionFactory;
- @Test
- @Transactional
- public void testSaveOrderWithItems() throws Exception {
- Session session = sessionFactory.getCurrentSession();
- Order order = new Order();
- order.getItems().add(new Item());
- session.save(order);
- session.flush();
- assertNotNull(order.getId());
- }
- @Test
- @Transactional
- public void testSaveAndGet() throws Exception {
- Session session = sessionFactory.getCurrentSession();
- Order order = new Order();
- order.getItems().add(new Item());
- session.save(order);
- session.flush();
- // Otherwise the query returns the existing order (and we didn't set the
- // parent in the item)...
- session.clear();
- Order other = (Order) session.get(Order.class, order.getId());
- assertEquals(1, other.getItems().size());
- assertEquals(other, other.getItems().iterator().next().getOrder());
- }
- @Test
- @Transactional
- public void testSaveAndFind() throws Exception {
- Session session = sessionFactory.getCurrentSession();
- Order order = new Order();
- Item item = new Item();
- item.setProduct("foo");
- order.getItems().add(item);
- session.save(order);
- session.flush();
- // Otherwise the query returns the existing order (and we didn't set the
- // parent in the item)...
- session.clear();
- Order other = (Order) session
- .createQuery( "select o from Order o join o.items i where i.product=:product")
- .setString("product", "foo").uniqueResult();
- assertEquals(1, other.getItems().size());
- assertEquals(other, other.getItems().iterator().next().getOrder());
- }
- }
Spring使用内存数据库的更多相关文章
- Spring使用内存数据库二
在上篇<Spring 使用内存数据库>中我们使用Hibernate作为ORM的框架,直接调用Hibernate的API进行相关的持久化操作,但在实际项目中,可能会由于公司规定等原因要求统一 ...
- 从Spring看Web项目开发
之前简单介绍过Spring框架,本文换个角度重新诠释Spring.使用Java语言开发的项目,几乎都绕不过Spring,那么Spring到底是啥,为何被如此广泛的应用,下面从以下两个问题出发来剖析Sp ...
- 基于mockito做有效的单元测试
概述 本文讲解的主要是有效和单元的思想,并不是说如何编写单元测试,用于改善和提高开发效率.编码风格.编码可读性和单测效率,不盲目追求覆盖率. 背景 现在很多单元测试只是利用@Test注解把代码或者整个 ...
- 2018-08-20 中文代码之Spring Boot集成H2内存数据库
续前文: 中文代码之Spring Boot添加基本日志, 源码库地址相同. 鉴于此项目中的数据总量不大(即使万条词条也在1MB之内), 当前选择轻量级而且配置简单易于部署的H2内存数据库比较合理. 此 ...
- 中文代码之Spring Boot集成H2内存数据库
续前文: 中文代码之Spring Boot添加基本日志, 源码库地址相同. 鉴于此项目中的数据总量不大(即使万条词条也在1MB之内), 当前选择轻量级而且配置简单易于部署的H2内存数据库比较合理. 此 ...
- 在Spring Boot中使用内存数据库
文章目录 H2数据库 HSQLDB Apache Derby SQLite 在Spring Boot中使用内存数据库 所谓内存数据库就是可以在内存中运行的数据库,不需要将数据存储在文件系统中,但是相对 ...
- 在Spring Boot使用H2内存数据库
文章目录 添加依赖配置 数据库配置 添加初始数据 访问H2数据库 在Spring Boot使用H2内存数据库 在之前的文章中我们有提到在Spring Boot中使用H2内存数据库方便开发和测试.本文我 ...
- Java Spring mvc 操作 Redis 及 Redis 集群
本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
随机推荐
- Ios开发之协议protocol
Protocol是ios开发中的一个难点也是一个重点,要想使用好,或者理解好它,可能需要时间的累积.今天我们就通过一个例子来简单的看一下,怎么样使用protocol. 我们今天用的例子就是模拟电脑插入 ...
- iOS runtime探究(三): 从runtime開始理解OC的属性property
你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639303 本文主要解说runtime相关知识, ...
- 性能测试vs负载测试vs压力测试
下面我们主要介绍性能测试.负载测试和压力测试. 效率作为ISO 9126内部和外部质量的重要质量属性之一,其含义是在规定条件下,相对于所用的资源的数量,软件产品可提供适当性能的能力.资源可能包括其他软 ...
- Provider Pattern for Beginners in .net
Download ProviderPattern.zip Introduction Provider pattern allows the developers to create pluggable ...
- VC++ MFC应用程序项目文件2.cpp
//GameServer.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "GameServer.h" #de ...
- VS2017专业版使用最新版Qt5.9.2教程
VS2017专业版使用最新版Qt5.9.2教程(最新教材) 最近三天一直在安装Qt5.9.2,为了能够在自己专业版的VS2017上面使用?可以算是花费了不少的功夫.但是一路上并不是很顺利,就在刚才,终 ...
- JS调试必备的5个debug技巧_javascript技巧
JS调试必备的debug调试javascript技巧 1. debugger; 我以前也说过,你可以在JavaScript代码中加入一句debugger;来手工造成一个断点效果.需要带有条件的断点吗? ...
- 转载:Unicode和Utf-8有何区别 转载自知乎 原文作者不详
作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- 在CentOS 7上安装Kafka
简介 Kafka 是一种高吞吐的分布式发布订阅消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被广泛用于大规模消息数据处理应用. ...
- android studio中为项目添加依赖包的方法
右键项目,Open Module Settings 打开后选择Dependencies选项卡,点最右边的加号: 选择Libriay dependencies,从下拉列表里面选择就可以了.