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在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
随机推荐
- 用eclipse 玩转cocos 2dx开发
开始研究cocos2dx,mark一下这个的配置步骤 1 下载eclipse 2 下载android sdk,配置sdk路径,添加环境变量 3 安装adt 4 下载android ndk,配 ...
- OpenNebula学习第三节之虚拟机管理
一.背景 已经安装好OpenNebula-Front-end 已经安装好OpenNebula Node 已经把Node注册到Front-end 二.目标 看过第一.二节的同学们可能已经知道我的整个环境 ...
- Node js : Best way to define entity class
If you start to use a DB like mongo, you might be better off creating objects with mongoose but th ...
- 有用的java工具
1.Jsoup html页面解析 2.FastJson java中json处理工具,类似于gson 3.jodd 类似于apache commons的一些常用工具集 4.Selenium IDE we ...
- [Spring boot] Autowired by name, by @Primary or by @Qualifier
In the example we have currently: @Component public class BinarySearchImpl { @Autowired private Sort ...
- Javascript 的模块化编程及加载模块【转载+整理】
http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 本文内容 引入 模块化 最初写法 对象写法 立即执行函数写法 放大模式 宽放 ...
- PyMongo基本使用
PyMongo基本使用 引用PyMongo >>> import pymongo 创建连接Connection >>> import pymongo >& ...
- SSH连接linux时,长时间不操作就断开的解决方案
转自:http://www.cnblogs.com/jifeng/archive/2011/06/25/2090118.html 修改/etc/ssh/sshd_config文件,找到 ClientA ...
- Solidworks如何在零件表面贴图
在要增加图片的表面上右击,然后选择修改这个面的颜色(可以是曲面) 切换到高级,然后选择一个图片 你可以缩放图片的大小,从而决定图片的重复次数 如果图片上下或者左右颠倒了,可以在映射里面勾选 ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...