文档章节

Spring Data的CrudRepository使用及其遇到的问题和解决方法

王孟君
 王孟君
发布于 2017/02/08 11:37
字数 2884
阅读 1997
收藏 0

Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。

目的

本篇博文的主要目的是使用Spring Data Redis的CrudRepository接口,完成对Redis的基本操作,如保存、删除、查看是否存在、查询全部、分页查询等。

环境准备

添加依赖

本文采用是Maven工程来构建工程,所包括的依赖有spring-data-redis,详细信息如下:

		<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.8.0.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
		</dependency>

Redis配置类

package com.xxx.springdata.redis.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;

@Configuration
@ComponentScan("com.xxx.springdata")
@PropertySource("classpath:redis.properties")
@EnableRedisRepositories("com.xxx.springdata")
public class RedisAppConfig {

	@Value("${redis.host}")
	private String redisHost;

	@Value("${redis.port}")
	private int redisPort;

	@Bean
	public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
		return new PropertySourcesPlaceholderConfigurer();
	}

	@Bean
	JedisConnectionFactory jedisConnectionFactory() {
		JedisConnectionFactory factory = new JedisConnectionFactory();
		factory.setHostName(redisHost);
		factory.setPort(redisPort);
		factory.setUsePool(true);
		return factory;
	}

	@Bean
	RedisTemplate<?, ?> redisTemplate() {
		RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
		template.setConnectionFactory(jedisConnectionFactory());
		return template;
	}

	@Bean
	CacheManager cacheManager() {
		return new RedisCacheManager(redisTemplate());
	}
}

其中redis.hostredis.port来源于src/main/resources目录下的redis.properties文件

redis.host=172.xx.xx.xx
redis.port=6379

Book类

本文使用Book类来完成Spring Data Redis的操作,Book类包含id, name, isbn 以及authors, 分别表示Book Id, 书名,ISBN以及书本作者,其它信息如出版信息等都不在这个示例中。

	/** Book ID */
	private Long id;

	/** 书名 */
	private String name;

	/** ISBN */
	private String isbn;

	/** 作者 */
	private List<String> authors;

详细的代码如下:

package com.xxx.springdata.redis.entity;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

@RedisHash("books")
public class Book implements Serializable {

	private static final long serialVersionUID = 4665407921597036726L;

	/** Book ID */
	@Id
	private Long id;

	/** 书名 */
	@Indexed
	private String name;

	/** ISBN */
	private String isbn;

	/** 作者 */
	private List<String> authors;

	public Book() {
	}

	public Book(Long id, String name, String isbn, List<String> authors) {
		this.id = id;
		this.name = name;
		this.isbn = isbn;
		this.authors = authors;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the isbn
	 */
	public String getIsbn() {
		return isbn;
	}

	/**
	 * @param isbn
	 *            the isbn to set
	 */
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	/**
	 * @return the authors
	 */
	public List<String> getAuthors() {
		return authors;
	}

	/**
	 * @param authors
	 *            the authors to set
	 */
	public void setAuthors(List<String> authors) {
		this.authors = authors;
	}

	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", isbn=" + isbn + ", authors=" + authors + "]";
	}

}

BookRepository

本文开始就说明了本文的目的:

使用Spring Data Redis的CrudRepository接口,完成对Redis的基本操作,如保存、删除、查看是否存在、查询全部、分页查询等。

所以,在编写BookRepository接口之前,我们先来看一下org.springframework.data.repository包下的CrudRepository已经为我们提供了哪些方法,其源代码如下:

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {

	/**
	 * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
	 * entity instance completely.
	 * 
	 * @param entity
	 * @return the saved entity
	 */
	<S extends T> S save(S entity);

	/**
	 * Saves all given entities.
	 * 
	 * @param entities
	 * @return the saved entities
	 * @throws IllegalArgumentException in case the given entity is {@literal null}.
	 */
	<S extends T> Iterable<S> save(Iterable<S> entities);

	/**
	 * Retrieves an entity by its id.
	 * 
	 * @param id must not be {@literal null}.
	 * @return the entity with the given id or {@literal null} if none found
	 * @throws IllegalArgumentException if {@code id} is {@literal null}
	 */
	T findOne(ID id);

	/**
	 * Returns whether an entity with the given id exists.
	 * 
	 * @param id must not be {@literal null}.
	 * @return true if an entity with the given id exists, {@literal false} otherwise
	 * @throws IllegalArgumentException if {@code id} is {@literal null}
	 */
	boolean exists(ID id);

	/**
	 * Returns all instances of the type.
	 * 
	 * @return all entities
	 */
	Iterable<T> findAll();

	/**
	 * Returns all instances of the type with the given IDs.
	 * 
	 * @param ids
	 * @return
	 */
	Iterable<T> findAll(Iterable<ID> ids);

	/**
	 * Returns the number of entities available.
	 * 
	 * @return the number of entities
	 */
	long count();

	/**
	 * Deletes the entity with the given id.
	 * 
	 * @param id must not be {@literal null}.
	 * @throws IllegalArgumentException in case the given {@code id} is {@literal null}
	 */
	void delete(ID id);

	/**
	 * Deletes a given entity.
	 * 
	 * @param entity
	 * @throws IllegalArgumentException in case the given entity is {@literal null}.
	 */
	void delete(T entity);

	/**
	 * Deletes the given entities.
	 * 
	 * @param entities
	 * @throws IllegalArgumentException in case the given {@link Iterable} is {@literal null}.
	 */
	void delete(Iterable<? extends T> entities);

	/**
	 * Deletes all entities managed by the repository.
	 */
	void deleteAll();
}

从上述CrudRepository接口的源码中,我们可以看到它已经提供了诸如save(),delete(),findOne(),findAll(),count()等基本的方法。

我们主要简单地继承CrudRepository接口,就能拥有其定义的基本方法,如:


public interface BookRepository extends CrudRepository<Book, Long> {
	
}

经过上述简单的定义,BookRepository 就可以拥有count(), delete(), findAll() ~~~等等的方法,大大简化了代码。BookRepository实例拥有的方法如下图所示:

因为要测试分页的功能,所以在BookRepository中添加了一个根据书名分页查询的方法:

Page<Book> findBookByName(String name, Pageable page);

package com.xxx.springdata.redis.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;

import com.xxx.springdata.redis.entity.Book;

public interface BookRepository extends CrudRepository<Book, Long> {
	
	Page<Book> findBookByName(String name, Pageable page);
}

BookService

因为只是个示例,BookService直接就使用实现了,而不是采用接口和实现分开的方式来做。

package com.xxx.springdata.redis.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import com.xxx.springdata.redis.entity.Book;
import com.xxx.springdata.redis.repository.BookRepository;

@Service
public class BookService {

	@Autowired
	private BookRepository bookRepository;

	public void save(Book book) {
		bookRepository.save(book);
	}

	public void deleteById(Long id) {
		bookRepository.delete(id);
	}

	public void saveByBatch(List<Book> books) {
		bookRepository.save(books);
	}

	public Book findOne(Long id) {
		return bookRepository.findOne(id);
	}

	public Page<Book> findBookByName(String name, int pageNo, int pageSize) {
		return bookRepository.findBookByName(name, new PageRequest(pageNo - 1, pageSize));
	}

	public Iterable<Book> findAll() {
		return bookRepository.findAll();
	}
	
	
	public long count() {
		return bookRepository.count();
	}
	
	
}

从上述代码中,我们可以看出:

只要在BookService中自动注入 (使用@Autowired注解) BookRepository,就可以根据bookRepository 实例完成基本的业务方法操作。

准备好这些之后,我们就可以开启我们的示例编写了~~~Let's Go~~

示例

获取BookService实例

ApplicationContext context = new AnnotationConfigApplicationContext(RedisAppConfig.class);
		BookService bookService = context.getBean(BookService.class);

单个保存

	    /**
		 * 保存Book
		 */
		Book book = new Book();
		book.setId(10001L);
		book.setAuthors(Arrays.asList("Eric", "Joan"));
		book.setIsbn("abc-123-def-456789");
		book.setName("Redis Examples");
		bookService.save(book);

根据ID查询

		/**
		 * 根据Id查询
		 */
		// Book [id=10001, name=Redis Examples, isbn=abc-123-def-456789,
		// authors=[Eric, Joan]]
		Book selectBookFromRedis = bookService.findOne(book.getId());
		System.out.println(selectBookFromRedis);

根据ID删除

		/**
		 * 删除
		 */
		System.out.println("删除单个Book");
		bookService.deleteById(book.getId());

批量保存

		Book book2 = new Book();
		book2.setId(10002L);
		book2.setAuthors(Arrays.asList("Eric", "Joan"));
		book2.setIsbn("abc-123-def-456789");
		book2.setName("Redis Examples");
		
		System.out.println("批量保存");
		bookService.saveByBatch(Arrays.asList(book, book2));

获取全部


		/**
		 * 获取所有Books
		 */
		System.out.println("获取所有Books");
		Iterable<Book> iterableAllBooks = bookService.findAll();
		Iterator<Book> iterAllBooks = iterableAllBooks.iterator();
		while(iterAllBooks.hasNext()) {
			Book item = iterAllBooks.next();
			System.out.println(item);
		}

分页

本文使用按照名字查询到的结果来分页,分页的实现包含如下几个步骤:

  • 步骤一

在BookRepository定义一个方法,其中使用Pagable作为参数,如:

public interface BookRepository extends CrudRepository<Book, Long> {
	
	Page<Book> findBookByName(String name, Pageable page);
}
  • 步骤二

在BookService中,实现分页代码,包含传递的页码(pageNo)以及每页查询的数字,如:

​

	public Page<Book> findBookByName(String name, int pageNo, int pageSize) {
		return bookRepository.findBookByName(name, new PageRequest(pageNo - 1, pageSize));
	}

​

说明:

因为PageRequest中的page下标是从0开始的,所以这边使用了pageNo-1,其中,

org.springframework.data.domain包下的PageRequest构造函数如下:

	/**
	 * Creates a new {@link PageRequest}. Pages are zero indexed, thus providing 0 for {@code page} will return the first
	 * page.
	 * 
	 * @param page zero-based page index.
	 * @param size the size of the page to be returned.
	 */
	public PageRequest(int page, int size) {
		this(page, size, null);
	}
  • 步骤三

使用BookService实例完成相应的测试代码。

		/**
		 * 分页
		 */
		/**
		 * 第一页
		 */
		System.out.println("第一页的内容");
		Page<Book> page1Books = bookService.findBookByName("Redis Examples", 1, 1);

		Iterator<Book> iter1 = page1Books.iterator();
		while (iter1.hasNext()) {
			Book item = iter1.next();
			System.out.println(item);
		}
		
		/**
		 * 第二页
		 */
		System.out.println("第二页的内容");
		Page<Book> page2Books = bookService.findBookByName("Redis Examples", 2, 1);
		Iterator<Book> iter2 = page2Books.iterator();
		while (iter2.hasNext()) {
			Book item = iter2.next();
			System.out.println(item);
		}

count

		/**
		 * 获取存储的Book总数
		 */
		long count = bookService.count();
		System.out.println("Count is " +  count);

完整示例

完整的RedisExample.java代码如下:

package com.xxx.springdata.example;

import java.util.Arrays;
import java.util.Iterator;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.domain.Page;

import com.xxx.springdata.redis.config.RedisAppConfig;
import com.xxx.springdata.redis.entity.Book;
import com.xxx.springdata.redis.service.BookService;

public class RedisExample {

	public static void main(String[] args) {

		ApplicationContext context = new AnnotationConfigApplicationContext(RedisAppConfig.class);
		BookService bookService = context.getBean(BookService.class);

		/**
		 * 保存Book
		 */
		Book book = new Book();
		book.setId(10001L);
		book.setAuthors(Arrays.asList("Eric", "Joan"));
		book.setIsbn("abc-123-def-456789");
		book.setName("Redis Examples");
		bookService.save(book);

		/**
		 * 根据Id查询
		 */
		// Book [id=10001, name=Redis Examples, isbn=abc-123-def-456789,
		// authors=[Eric, Joan]]
		Book selectBookFromRedis = bookService.findOne(book.getId());
		System.out.println(selectBookFromRedis);

		/**
		 * 删除
		 */
		System.out.println("删除单个Book");
		bookService.deleteById(book.getId());

		Book book2 = new Book();
		book2.setId(10002L);
		book2.setAuthors(Arrays.asList("Eric", "Joan"));
		book2.setIsbn("abc-123-def-456789");
		book2.setName("Redis Examples");
		
		System.out.println("批量保存");
		bookService.saveByBatch(Arrays.asList(book, book2));
		

		/**
		 * 获取所有Books
		 */
		System.out.println("获取所有Books");
		Iterable<Book> iterableAllBooks = bookService.findAll();
		Iterator<Book> iterAllBooks = iterableAllBooks.iterator();
		while(iterAllBooks.hasNext()) {
			Book item = iterAllBooks.next();
			System.out.println(item);
		}
		
		/**
		 * 分页
		 */
		/**
		 * 第一页
		 */
		System.out.println("第一页的内容");
		Page<Book> page1Books = bookService.findBookByName("Redis Examples", 1, 1);

		Iterator<Book> iter1 = page1Books.iterator();
		while (iter1.hasNext()) {
			Book item = iter1.next();
			System.out.println(item);
		}
		
		/**
		 * 第二页
		 */
		System.out.println("第二页的内容");
		Page<Book> page2Books = bookService.findBookByName("Redis Examples", 2, 1);
		Iterator<Book> iter2 = page2Books.iterator();
		while (iter2.hasNext()) {
			Book item = iter2.next();
			System.out.println(item);
		}
		
		/**
		 * 获取存储的Book总数
		 */
		long count = bookService.count();
		System.out.println("Count is " +  count);
		
	}

}

控制台输出如下内容:

Book [id=10001, name=Redis Examples, isbn=abc-123-def-456789, authors=[Eric, Joan]]
删除单个Book
批量保存
获取所有Books
Book [id=10001, name=Redis Examples, isbn=abc-123-def-456789, authors=[Eric, Joan]]
Book [id=10002, name=Redis Examples, isbn=abc-123-def-456789, authors=[Eric, Joan]]
第一页的内容
Book [id=10001, name=Redis Examples, isbn=abc-123-def-456789, authors=[Eric, Joan]]
第二页的内容
Book [id=10002, name=Redis Examples, isbn=abc-123-def-456789, authors=[Eric, Joan]]
Count is 2

可以通过Redis Desktop Manager工具来查看Redis中存储的内容,如id为10001的book信息如:

至此,使用Spring Data Redis 的 CrudRepository完成基本的操作示例就完成了。

但是,在使用的过程中也遇到了一些问题,在这里也将遇到的几个问题和相应的解决方案记录下来,可以为可能碰到类似问题的读者提供一个参考。

问题及解决

问题一

最开始的时候,Book.java的内容如下:

package com.xxx.springdata.redis.entity;

import java.io.Serializable;
import java.util.List;

public class Book implements Serializable {

	private static final long serialVersionUID = 4665407921597036726L;

	/** Book ID */
	private Long id;

	/** 书名 */
	private String name;

	/** ISBN */
	private String isbn;

	/** 作者 */
	private List<String> authors;

	public Book() {
	}

	public Book(Long id, String name, String isbn, List<String> authors) {
		this.id = id;
		this.name = name;
		this.isbn = isbn;
		this.authors = authors;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the isbn
	 */
	public String getIsbn() {
		return isbn;
	}

	/**
	 * @param isbn
	 *            the isbn to set
	 */
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	/**
	 * @return the authors
	 */
	public List<String> getAuthors() {
		return authors;
	}

	/**
	 * @param authors
	 *            the authors to set
	 */
	public void setAuthors(List<String> authors) {
		this.authors = authors;
	}

	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", isbn=" + isbn + ", authors=" + authors + "]";
	}

}

尝试保存Book到Redis的时候报错:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.springdata.redis.repository.BookRepository' available: 

详细异常信息如下:

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookService': Unsatisfied dependency expressed through field 'bookRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.springdata.redis.repository.BookRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
	at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
	at com.xxx.springdata.example.RedisExample.main(RedisExample.java:18)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.springdata.redis.repository.BookRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
	... 14 more

解决方法

光看异常信息,可能会误解为哪里配置有误,导致BookRepository自动注入失败,其实不然。

解决该问题,我们可以为Book添加@RedisHash注解即可。

其中,RedisHash注解为org.springframework.data.redis.core.RedisHash

@RedisHash("books")
public class Book implements Serializable {

问题二

按照书名查询的分页结果,没有任何返回信息。

解决方法

为Book类中的name属性添加一个@Indexed注解即可。

其中,Indexed注解为 org.springframework.data.redis.core.index.Indexed

	/** 书名 */
	@Indexed
	private String name;

小结

至此,使用Spring Data Redis的CrudRepository的简单示例就完成了~~~

结合使用中遇到的问题,我们可以通过如下几个步骤,来确保使用Spring Data Redis的正确姿势

配置Redis中使用@EnableRedisRepositories

实体类使用@RedisHash等注解

如果需要按照某个属性,如本例的name,来完成查询,使用@Indexed注解标识

可以使用@Id来表示唯一属性

大家如有什么问题或者建议,一起来分享吧~~~

© 著作权归作者所有

下一篇: LeetCode(1) Two Sum
王孟君

王孟君

粉丝 227
博文 94
码字总数 221044
作品 0
杭州
高级程序员
私信 提问
Spring Data(一)概念和仓库的定义

Spring Data(一)概念和仓库的定义 Spring Data的主要任务是为数据访问提供一个相似的、一致的、基于Spring的编程模型,同时又保留着下面各个数据存储的特征。它使得使用数据访问技术非常的...

小忽悠
2018/06/21
0
0
spring data jpa CrudRepository 方法调用错误如何解决?

spring data jpa 的CrudRepository源码如下 : 我定义了一个基础BaseRepository接口 继承自JpaRepository (而JpaRepository 继承了CrudRepository): 然后我定义一个抽象类,想分别调用这两...

sucanber
2016/02/22
1K
1
spring 提示 No property delete found for type Contact

问题描述: dao定义如下: public interface ContactDao extends Repository 参照CrudRepository的方法(void delete(Iterable entities);)添加了个方法如下: void delete(List contacts)......

岽茗
2015/07/13
2.4K
8
PagingAndSortingRepository

PagingAndSortingRepository AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案, 下面就对Spring Data相关知识作一个较为详细的描述。 1.Spring Data所解决的问题 Spri...

风中帆
2015/03/07
6.7K
1
让spring-data-jpa解放你的DAO

第一次写oschina空间。先试试水,写得有点乱,改天再整理下。 最近项目用Spring-data-jpa,确实很方便。如果你也曾经被重复无聊的dao代码雷到的话,就可以考虑将ORM framework换成spring-da...

pengzai
2013/05/08
4.9K
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部