SpringData概述
- 格式:docx
- 大小:26.69 KB
- 文档页数:5
mongotemplate.find分页查询语句1. 引言1.1 概述MongoDB是一种广泛使用的NoSQL数据库,在实际开发中,数据查询和分页查询是非常常见的操作。
mongotemplate.find()方法是Spring Data MongoDB提供的一个用于执行查询操作的方法,它允许我们根据指定的条件从集合中获取文档。
本篇文章将重点介绍mongotemplate.find分页查询语句的使用方法。
通过本文,读者将了解到如何使用该方法进行分页查询,并掌握一些优化技巧和注意事项。
1.2 文章结构本文将按照以下结构展开对mongotemplate.find分页查询语句进行详细介绍:- 第2部分:mongotemplate.find分页查询语句的背景知识。
我们将首先介绍MongoDB和Spring Data MongoDB以及mongotemplate这些基础概念,为后续内容打下基础。
- 第3部分:分页查询的基本原理与实现方式。
我们会解释什么是分页查询、其作用以及不同实现方式之间的比较与选择,此外还会详细讲解mongotemplate.find分页查询方法的使用步骤。
- 第4部分:mongotemplate.find分页查询语句的具体使用方法。
我们将具体介绍该方法的参数设置与结果控制选项说明,并给出示例代码演示和解析,同时分享一些分页查询语句的优化技巧和注意事项。
- 第5部分:结论。
我们将总结本文的要点,并提出一些具有参考价值的结论,以帮助读者更好地理解和应用mongotemplate.find分页查询语句。
1.3 目的通过本文,希望读者能够全面了解mongotemplate.find分页查询语句的使用方法及其背后的原理。
无论是初学者还是有经验的开发人员,都可以从本文中获取相关知识并加以运用。
最终,读者将能够熟练使用mongotemplate.find方法来实现高效、精确的分页查询功能,并在实际项目中取得更好的效果。
通过JPA注解映射视图的实体类jpa视图⽆主键@Query注解的⽤法(SpringData。
这⾥主要说⼀下怎么⽤jpa映射⼀个视图的实体类,其实跟表映射⼀样,就是需要添加⼀个空的主键id标识package com.cf.bus.core.rs.template.domain;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "v_sc_template") // 这个是视图名称public class SupplyChainTemplate {@Id // 添加⼀个空的id标识,因为jpa在映射实体是需要⼀个id,这个必须@Column(name = "name")private String name;@Column(name = "industry")private String industry;@Column(name = "com_type")private String comType;@Column(name = "remarks")private String remarks;public String getName() {return name;}public void setName(String name) { = name;}public String getIndustry() {return industry;}public void setIndustry(String industry) {this.industry = industry;}public String getComType() {return comType;}public void setComType(String comType) {Type = comType;}public String getRemarks() {return remarks;}public void setRemarks(String remarks) {this.remarks = remarks;}}@id⼀定要有,否则会报构建entityManagerFactory异常。
Spring Data JPA最近项目中使用了Spring Data JPA这套基于持久化层的一套查询规范( 即基于ORM和JPA )。
今天自己整理一下这套“框架”的使用说明JPA:JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
使用Spring Data Jpa要引入相应的jar 文件。
使用此规范只要实现几个重要的接口即可,首先看下这几个接口的关系那了解了接口之后该如何使用呢:public interface JPATests extends JpaRepository<T, ID> {}//如上面代码:jpaTests 是我自己创建的一个接口,该接口继承了JpaRepository<T,ID> 该接口引用泛型,T指该接口实现的实体类,ID是主键的类型。
不用编写任何代码即可使用jpa带来的敏捷开发,对我们开发人员来说无疑是欣喜若狂。
那这个接口都实现了哪些方法呢?你可以去Spring Data Jpa的源码中看,该接口有个实现里面就是它方法的实现逻辑算法:下面我贴出代码:@Transactional(readOnly = true)public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>,JpaSpecificationExecutor<T> {private final JpaEntityInformation<T, ?> entityInformation;private final EntityManager em;private final PersistenceProvider provider;private LockMetadataProvider lockMetadataProvider;/*** Creates a new {@link SimpleJpaRepository}to manage objects of the given {@link JpaEntityInformation}.** @param entityInformation must not be {@literal null}.* @param entityManager must not be {@literal null}.*/public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {Assert.notNull(entityInformation);Assert.notNull(entityManager);this.entityInformation = entityInformation;this.em = entityManager;this.provider =PersistenceProvider.fromEntityManager(entityManager);}/*** Creates a new {@link SimpleJpaRepository}to manage objects of the given domain type.** @param domainClass must not be {@literal null}.* @param em must not be {@literal null}.*/public SimpleJpaRepository(Class<T> domainClass, EntityManager em) {this(JpaEntityInformationSupport.getMetadata(domainClass, em), em);}/*** Configures a custom {@link LockMetadataProvider} to be used to detect {@link LockModeType}s to be applied to* queries.** @param lockMetadataProvider*/public void setLockMetadataProvider(LockMetadataProvider lockMetadataProvider) {this.lockMetadataProvider = lockMetadataProvider;}private Class<T> getDomainClass() {return entityInformation.getJavaType();}private String getDeleteAllQueryString() {return getQueryString(DELETE_ALL_QUERY_STRING, entityInformation.getEntityName());}private String getCountQueryString() {String countQuery = String.format(COUNT_QUERY_STRING, provider.getCountQueryPlaceholder(), "%s");return getQueryString(countQuery,entityInformation.getEntityName());}/** (non-Javadoc)* @seeorg.springframework.data.repository.CrudRepository#delete(java.io.Se rializable)*/@Transactionalpublic void delete(ID id) {Assert.notNull(id, "The given id must not be null!");if (!exists(id)) {throw newEmptyResultDataAccessException(String.format("No %s entity with id %s exists!",entityInformation.getJavaType(), id), 1);}delete(findOne(id));}/** (non-Javadoc)* @seeorg.springframework.data.repository.CrudRepository#delete(ng. Object)*/@Transactionalpublic void delete(T entity) {Assert.notNull(entity, "The entity must not be null!");em.remove(em.contains(entity) ? entity : em.merge(entity));}/** (non-Javadoc)* @seeorg.springframework.data.repository.CrudRepository#delete(ng. Iterable)*/@Transactionalpublic void delete(Iterable<? extends T> entities) {Assert.notNull(entities, "The given Iterable of entities not be null!");for (T entity : entities) {delete(entity);}}/** @seeorg.springframework.data.jpa.repository.JpaRepository#deleteInBatch( ng.Iterable)*/@Transactionalpublic void deleteInBatch(Iterable<T> entities) {Assert.notNull(entities, "The given Iterable of entities not be null!");if (!entities.iterator().hasNext()) {return;}applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, entityInformation.getEntityName()), entities, em).executeUpdate();}/** (non-Javadoc)* @see org.springframework.data.repository.Repository#deleteAll() */@Transactionalpublic void deleteAll() {for (T element : findAll()) {delete(element);}}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaRepository#deleteAllInBat ch()*/@Transactionalpublic void deleteAllInBatch() {em.createQuery(getDeleteAllQueryString()).executeUpdate();}/*** @see*org.springframework.data.repository.Repository#readById(java.io.Seri alizable* )*/public T findOne(ID id) {Assert.notNull(id, "The given id must not be null!");return em.find(getDomainClass(), id);}/** (non-Javadoc)* @seeorg.springframework.data.repository.CrudRepository#exists(java.io.Se rializable)*/public boolean exists(ID id) {Assert.notNull(id, "The given id must not be null!");if (entityInformation.getIdAttribute() != null) {String placeholder = provider.getCountQueryPlaceholder();String entityName = entityInformation.getEntityName();Iterable<String> idAttributeNames =entityInformation.getIdAttributeNames();String existsQuery =QueryUtils.getExistsQueryString(entityName, placeholder, idAttributeNames);TypedQuery<Long> query = em.createQuery(existsQuery, Long.class);if (entityInformation.hasCompositeId()) {for (String idAttributeName : idAttributeNames) {query.setParameter(idAttributeName, entityInformation.getCompositeIdAttributeValue(id, idAttributeName));}} else {query.setParameter(idAttributeNames.iterator().next(),id);}return query.getSingleResult() == 1L;} else {return findOne(id) != null;}}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaRepository#findAll() */public List<T> findAll() {return getQuery(null, (Sort) null).getResultList();}/** (non-Javadoc)* @seeorg.springframework.data.repository.CrudRepository#findAll(ID[]) */public List<T> findAll(Iterable<ID> ids) {return getQuery(new Specification<T>() {public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {Path<?> path =root.get(entityInformation.getIdAttribute());return path.in(cb.parameter(Iterable.class, "ids"));}}, (Sort) null).setParameter("ids", ids).getResultList();}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaRepository#findAll(org.sp ringframework.data.domain.Sort)*/public List<T> findAll(Sort sort) {return getQuery(null, sort).getResultList();}/** (non-Javadoc)* @seeorg.springframework.data.repository.PagingAndSortingRepository#findA ll(org.springframework.data.domain.Pageable)*/public Page<T> findAll(Pageable pageable) {if (null == pageable) {return new PageImpl<T>(findAll());}return findAll(null, pageable);}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaSpecificationExecutor#fin dOne(org.springframework.data.jpa.domain.Specification) */public T findOne(Specification<T> spec) {try {return getQuery(spec, (Sort) null).getSingleResult();} catch (NoResultException e) {return null;}}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaSpecificationExecutor#fin dAll(org.springframework.data.jpa.domain.Specification) */public List<T> findAll(Specification<T> spec) {return getQuery(spec, (Sort) null).getResultList();}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaSpecificationExecutor#fin dAll(org.springframework.data.jpa.domain.Specification,org.springframework.data.domain.Pageable)*/public Page<T> findAll(Specification<T> spec, Pageable pageable) {TypedQuery<T> query = getQuery(spec, pageable);return pageable == null? new PageImpl<T>(query.getResultList()) : readPage(query, pageable, spec);}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaSpecificationExecutor#fin dAll(org.springframework.data.jpa.domain.Specification,org.springframework.data.domain.Sort)*/public List<T> findAll(Specification<T> spec, Sort sort) {return getQuery(spec, sort).getResultList();}/** (non-Javadoc)* @see org.springframework.data.repository.CrudRepository#count() */public long count() {return em.createQuery(getCountQueryString(),Long.class).getSingleResult();}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaSpecificationExecutor#cou nt(org.springframework.data.jpa.domain.Specification)*/public long count(Specification<T> spec) {return getCountQuery(spec).getSingleResult();}/** (non-Javadoc)* @seeorg.springframework.data.repository.CrudRepository#save(ng.Ob ject)*/@Transactionalpublic <S extends T> S save(S entity) {if (entityInformation.isNew(entity)) {em.persist(entity);return entity;} else {return em.merge(entity);}}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaRepository#saveAndFlush(j ng.Object)*/@Transactionalpublic T saveAndFlush(T entity) {T result = save(entity);flush();return result;}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaRepository#save(ng .Iterable)*/@Transactionalpublic <S extends T> List<S> save(Iterable<S> entities) { List<S> result = new ArrayList<S>();if (entities == null) {return result;}for (S entity : entities) {result.add(save(entity));}return result;}/** (non-Javadoc)* @seeorg.springframework.data.jpa.repository.JpaRepository#flush() */@Transactionalpublic void flush() {em.flush();}/*** Reads the given {@link TypedQuery} into a {@link Page} applying the given {@link Pageable} and* {@link Specification}.** @param query must not be {@literal null}.* @param spec can be {@literal null}.* @param pageable can be {@literal null}.* @return*/private Page<T> readPage(TypedQuery<T> query, Pageable pageable, Specification<T> spec) {query.setFirstResult(pageable.getOffset());query.setMaxResults(pageable.getPageSize());Long total = QueryUtils.executeCountQuery(getCountQuery(spec));List<T> content = total > pageable.getOffset() ?query.getResultList() : Collections.<T> emptyList();return new PageImpl<T>(content, pageable, total);}/*** Creates a new {@link TypedQuery} from the given {@link Specification}.** @param spec can be {@literal null}.* @param pageable can be {@literal null}.* @return*/private TypedQuery<T> getQuery(Specification<T> spec, Pageable pageable) {Sort sort = pageable == null ? null : pageable.getSort();return getQuery(spec, sort);}/*** Creates a {@link TypedQuery}for the given {@link Specification} and {@link Sort}.** @param spec can be {@literal null}.* @param sort can be {@literal null}.* @return*/private TypedQuery<T> getQuery(Specification<T> spec, Sort sort) {CriteriaBuilder builder = em.getCriteriaBuilder();CriteriaQuery<T> query = builder.createQuery(getDomainClass());Root<T> root = applySpecificationToCriteria(spec, query);query.select(root);if (sort != null) {query.orderBy(toOrders(sort, root, builder));}return applyLockMode(em.createQuery(query));}/*** Creates a new count query for the given {@link Specification}.** @param spec can be {@literal null}.* @return*/private TypedQuery<Long> getCountQuery(Specification<T> spec) {CriteriaBuilder builder = em.getCriteriaBuilder();CriteriaQuery<Long> query = builder.createQuery(Long.class);Root<T> root = applySpecificationToCriteria(spec, query);if (query.isDistinct()) {query.select(builder.countDistinct(root));} else {query.select(builder.count(root));}return em.createQuery(query);}/*** Applies the given {@link Specification} to the given {@link CriteriaQuery}.** @param spec can be {@literal null}.* @param query must not be {@literal null}.* @return*/private <S> Root<T> applySpecificationToCriteria(Specification<T> spec, CriteriaQuery<S> query) {Assert.notNull(query);Root<T> root = query.from(getDomainClass());if (spec == null) {return root;}CriteriaBuilder builder = em.getCriteriaBuilder();Predicate predicate = spec.toPredicate(root, query, builder);if (predicate != null) {query.where(predicate);}return root;}private TypedQuery<T> applyLockMode(TypedQuery<T> query) {LockModeType type = lockMetadataProvider == null ? null : lockMetadataProvider.getLockModeType();return type == null ? query : query.setLockMode(type);}}当然除了这些jpa自己的实现,我们也可以自己来实现一些复杂的逻辑算法:JpaRepository支持接口规范方法名查询:根据方法名,jpa会自动封装SQL语句,进行数据库操作,但使用时要注意两个问题:1.方法名需要在接口中命名;2.必须符合一定的命名规范这些资料可以去网上找:很多。
springdata+redis配置详解springdata设计初衷是位简化数据类型和数据的持久化存储,它并不局限是关系型数据库还是nosql数据库,都提供了简化的数据库连接,让数据获取变得更加的简单。
所有这些的实现有统⼀的api提供。
本⽂主要设置spring-data-redis的相关配置特性:1.RedisTemplate:⾼度封装的,⾃动连接池管理类;2.对数据类型进⾏了归类,封装了操作接⼝类: a) ValueOperations:key-value操作 b) setOperations:set的相关操作 c) ZsetOperations: d) HashOperations:hash数据类型操作 e) ListOperations:list数据类型操作3.对事务进⾏封装,通过容器进⾏控制。
4.序列化机制,提供各种序列化策略选择。
集成配置详解: 1.提供简单封装保存查询操作接⼝,以及实现类。
1public interface RedisCommand {23public void save(String key,String value);45public String get(String key);67public <T> T getObject(String key,Class<T> clazz);89 }View Code1 @Service2public class RedisHandle implements RedisCommand {34 @Autowired5protected RedisTemplate<String, String> redisTemplate;67 @Override8public void save(final String key, final String value) {9 redisTemplate.execute(new RedisCallback<Object>() {10 @Override11public Object doInRedis(RedisConnection connection)12throws DataAccessException {13 connection.set(14 redisTemplate.getStringSerializer().serialize(15 "user.uid." + key), redisTemplate16 .getStringSerializer().serialize(value));17return null;18 }19 });20 }2122 @Override23public String get(final String key) {24return redisTemplate.execute(new RedisCallback<String>() {25 @Override26public String doInRedis(RedisConnection connection)27throws DataAccessException {28byte[] keys = redisTemplate.getStringSerializer().serialize(29 "user.uid." + key);30if (connection.exists(keys)) {31byte[] value = connection.get(keys);32 String name = redisTemplate.getStringSerializer()33 .deserialize(value);34return name;35 }36return null;37 }38 });39 }4041 @Override42public <T> T getObject(String key, Class<T> clazz) {43// TODO Auto-generated method stub44return null;45 }464748 }View Code 2.业务逻辑类1 @Service(value="userRedis")2public class UserRedisImpl implements UserRedis{34 @Autowired5protected RedisHandle handler;67 @Override8public void saveUser(final User user) {9 handler.save(user.getId()+"", JSONObject.toJSONString(user));10 }1112 @Override13public User getUser(final long id) {14 String value =handler.get(id+"");15 User u= JSONObject.parseObject(value, User.class);16return u;17 }18 }View Code 3.测试类:1public class TestUseRedis {23 @SuppressWarnings("resource")4public static void main(String[] args) {5 ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/spring-redis.xml");6 UserRedis userDAO = (UserRedis)ac.getBean("userRedis");7 System.out.println("userDao"+JSONObject.toJSONString(userDAO));8 User user1 = new User();9 user1.setId(4);10 user1.setName("oba2sssss220a");11 userDAO.saveUser(user1);12 User user2 = userDAO.getUser(2);13 System.out.println(user2.getName());14 }15 }View Code 4.配置⽂件相关:spring-redis:1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="/schema/p"4 xmlns:context="/schema/context"5 xmlns:jee="/schema/jee" xmlns:tx="/schema/tx"6 xmlns:aop="/schema/aop"7 xsi:schemaLocation="8 /schema/beans /schema/beans/spring-beans.xsd9 /schema/context /schema/context/spring-context.xsd"> 1011 <context:property-placeholder location="classpath:redis.properties" />12 <context:component-scan base-package="com.hoo.report.web.service">13 </context:component-scan>14 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">15 <property name="maxIdle" value="${redis.maxIdle}" />16 <property name="maxActive" value="${redis.maxActive}" />17 <property name="maxWait" value="${redis.maxWait}" />18 <property name="testOnBorrow" value="${redis.testOnBorrow}" />19 </bean>2021 <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"22 p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> 2324 <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">25 <property name="connectionFactory" ref="connectionFactory" />26 </bean>2728 </beans>View Codepom引⽤:1 <!-- spring data -->2 <dependency>3 <groupId>org.springframework.data</groupId>4 <artifactId>spring-data-redis</artifactId>5 <version>1.0.2.RELEASE</version>6 </dependency>78 <dependency>9 <groupId>redis.clients</groupId>10 <artifactId>jedis</artifactId>11 <version>2.1.0</version>12 </dependency>View Coderedis.properties:1 redis.host=127.0.0.12 redis.port=63793 redis.pass=45 redis.maxIdle=3006 redis.maxActive=6007 redis.maxWait=10008 redis.testOnBorrow=trueView Code。
SpringDataJPA,⼀种动态条件查询的写法我们在使⽤SpringData JPA框架时,进⾏条件查询,如果是固定条件的查询,我们可以使⽤符合框架规则的⾃定义⽅法以及@Query注解实现。
如果是查询条件是动态的,框架也提供了查询接⼝。
JpaSpecificationExecutor和其他接⼝使⽤⽅式⼀样,只需要在你的Dao接⼝继承即可(官⽹代码)。
public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {…}JpaSpecificationExecutor提供很多条件查询⽅法。
public interface JpaSpecificationExecutor<T> {T findOne(Specification<T> var1);List<T> findAll(Specification<T> var1);Page<T> findAll(Specification<T> var1, Pageable var2);List<T> findAll(Specification<T> var1, Sort var2);long count(Specification<T> var1);}⽐如⽅法:List<T> findAll(Specification<T> var1);就可以查找出符合条件的所有数据,如果你的框架使⽤的是前段分页的技术,那么这个⽅法就挺简便的。
那么这个⽅法该如何使⽤呢?我们看到它需要的参数是⼀个org.springframework.data.jpa.domain.Specification对象。
SpringDataJPA在Entity中常⽤的注解浅析 ⾸先我们常⽤的注解包括(@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob)1. @Entity使⽤此注解定义的对象将会成为被JPA管理的实体,将映射到指定的数据库表@Entity(name = "user")其中name默认是此实体类的名字,全局唯⼀。
2. @Table指定此实体类对应的数据库的表名。
若注解不加名字则系统认为表名和实体类的名字相同3. @Id定义字段为数据库的主键,⼀个实体⾥⾯必须有⼀个。
4. @IdClass利⽤外部类的联合主键,其中外部类必须满⾜⼀下⼏点要求必须实现Serializable接⼝。
必须有默认的public⽆参数的构造⽅法。
必须覆盖equals和hashCode⽅法。
equals⽅法⽤于判断两个对象是否相同,EntityManger通过find⽅法来查找Entity时是根据equals的返回值来判断的。
hashCode⽅法返回当前对象的哈希码,⽣成的hashCode相同的概率越⼩越好,算法可以进⾏优化。
5. @GeneratedValue为主键⽣成策略默认为AUTO即JPA⾃动选择合适的策略IDENTITY 适⽤于MySQL,策略为⾃增SEQUENCE 通过序列⽣成主键通过@SquenceGenerator指定序列名MySQL不⽀持TABLE 框架由表模拟产⽣主键,使⽤该策略有利于数据库移植6. @Basic表⽰此字段是映射到数据库,如果实体字段上没有任何注解默认为@Basic。
其中可选参数为@Basic(fetch = ZY, optional = false)其中fetch默认为EAGER⽴即加载,LAZY为延迟加载、optional表⽰该字段是否可以为null7. @Transient和@Basic的作⽤相反,表⽰该字段不是⼀个到数据库表的字段映射,JPA映射数据库的时候忽略此字段。
SpringData与MyBatis的比较和选择在Java开发领域,SpringData和MyBatis都是非常受欢迎的持久化框架。
它们都有自己独特的特点和优势,但也存在一些不同之处。
本文将对这两个框架进行比较,帮助开发者选择适合自己项目需求的框架。
1. 简介SpringData是由Spring框架提供的一个用于简化数据库访问的基础架构。
它整合了现有的持久化框架(如JPA、Hibernate、MyBatis等),为开发者提供了一种统一的方式来操作数据库。
而MyBatis则是一个持久化框架,它通过SQL映射文件将Java对象与数据库表进行映射。
2. 功能特点2.1 SpringDataSpringData提供了一套丰富的API,支持多种数据库访问方式,包括关系型数据库、NoSQL数据库以及搜索引擎。
它具有自动生成SQL语句、分页查询、事务管理等功能,并提供了一些常用查询方法的实现,减少了开发者的工作量。
2.2 MyBatisMyBatis是一个轻量级的持久化框架,它与数据库之间的交互主要通过手写的SQL语句。
MyBatis的主要特点是灵活性和可控性,开发者可以根据需求自由编写SQL,优化查询性能。
此外,MyBatis还支持一级、二级缓存,提高了查询的效率。
3. 使用场景3.1 SpringDataSpringData适用于对数据库操作较为简单的场景,对于增删改查等基本操作,SpringData提供了一些默认实现,可以快速完成开发。
同时,SpringData也支持动态查询、排序、分页等高级查询功能,能够满足大部分常见的需求。
3.2 MyBatisMyBatis适用于对数据库操作较为复杂、SQL定制化要求较高的场景。
由于MyBatis将SQL与Java代码分离,开发者完全可以根据需求优化SQL语句,提高查询效率。
此外,MyBatis的一级、二级缓存也适用于对查询性能有较高要求的场景。
4. 性能比较4.1 SpringData由于SpringData是一个整合了多种持久化框架的库,它的性能往往受到具体框架的影响。
Spring集成Redis⽅案(spring-data-redis)(基于Jedis的单机。
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要⾃⾏引⼊,这个是个坑点。
并且会与⼀些低版本的Spring有冲突,要看官⽅⽂档和不断的测试。
继上⼀篇⽂章中提到的⼏款客户端,它们基本都能和Spring集成。
下⾯介绍的是基于Spring原⽣的spring-data-redis去集成。
还要注意的是,Spring整合了Jedis框架进去,所以下⾯配置上还会基于Jedis去实现的,但是Spring在上层已经集成了很好⽤的⼯具类。
⽽整个框架基于Spring Data,⾥⾯集成了主流的应⽤,⽐如Redis,MongoDB等,⽽基于这些应⽤的⼀些⾮常好⽤的框架也集成了,⽐如Jedis这些。
我猜测,基于Spring Data Redis去集成的,底层还是⽤Jedis去实现,应该是可以实现客户端集群的,下次我再实践详细分析⼀下。
Spring Data Redis项⽬结构:POM:<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.x.redis</groupId><artifactId>Spring_redis</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Spring_redis</name><url></url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.1.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.2</version><scope>test</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.1</version></dependency><!-- 将现有的jakarta commons logging的调⽤转换成lsf4j的调⽤。
Spring Data JPA快速启动目录Spring Data JPA快速启动 (1)1概述 (1)2 Spring Data JPA使用 (1)2.1实体类规范: (2)2.2 Dao接口规范: (2)2.3 自定义查询 (4)2.4 配置文件规范 (7)2.5事务处理 (9)2.6 为接口中的部分方法提供自定义实现 (12)2.7 锁 (13)2.8 应用场景以及优点 (15)2.9 JPA的缺陷: (16)1概述Spring Data JPA 是Spring Data 家族的提供的一个持久层框架,可以自动创建dao实现类和自定义查询,简化了持久层代码。
2 Spring Data JPA使用使用Spring Data JPA只需要3个步骤:(1)声明持久层的接口,该接口继承 Repository,Repository 是一个标记型接口,它不包含任何方法,当然如果有需要,Spring Data 也提供了若干 Repository 子接口,其中定义了一些常用的增删改查,以及分页相关的方法。
(2)在接口中声明需要的业务方法。
Spring Data 将根据给定的策略来为其生成实现代码。
(3)在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。
配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。
此外,<jpa:repository> 还提供了一些属性和子标签,便于做更细粒度的控制。
可以在<jpa:repository> 内部使用<context:include-filter>、<context:exclude-filter> 来过滤掉一些不希望被扫描到的接口。
dao层继承jparepository怎么用_浅析SpringDataJpa继承结构Spring Data JPA 是 Spring 提供的一个用于简化持久层操作的框架,它支持继承结构来进行数据库操作。
在 Spring Data JPA 中,我们通常使用 `JpaRepository` 接口作为 DAO 层的基础接口,其他的 DAO 接口则继承自 `JpaRepository` 来获得基本的 CRUD 操作。
`JpaRepository` 是 Spring Data JPA 提供的一个基础仓库接口,它继承自 `PagingAndSortingRepository` 接口和 `CrudRepository` 接口。
通过继承 `JpaRepository` 接口,我们可以直接使用其中定义的一些常用方法,无需自己去实现。
首先,我们需要定义一个 DAO 接口,并继承 `JpaRepository`,如下所示:```javapublic interface UserDao extends JpaRepository<User, Long>//可以自定义一些查询方法User findByUsername(String username);```在上面的例子中,我们定义了一个 `UserDao` 接口,继承自`JpaRepository<User, Long>`,其中 `User` 是实体类的类型,而`Long` 是实体类的主键类型。
通过继承 `JpaRepository` 接口,`UserDao` 接口中就已经获得了一些常用的方法,比如 `findAll(`、`save(`、`delete(`等。
而且,我们还可以根据自己的需要在 `UserDao` 接口中自定义一些查询方法,如上面的 `findByUsername(` 方法。
当我们需要在其他DAO接口中使用这些继承的方法时,只需要继承自定义的DAO接口即可,如下所示:```javapublic interface OrderDao extends UserDao//根据用户ID查询订单列表List<Order> findByUserId(Long userId);```在上面的例子中,我们定义了一个 `OrderDao` 接口,继承自`UserDao` 接口。
Spring Data JPA
致正在路上行走的程序员:
人生只有一条路不能选择——那就是放弃的路;人生只有一条路不能拒绝——那就是成长的路
一.什么是SpringDataJPA?
SpringData项目的目的是为了简化构建基于spring框架应用的数据访问技术,包括非关系型数据库,另外还包括对关系型数据库的访问支持。
对于拥有海量的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便。
二.Spring Data JPA有什么咋们主要来看看Spring Data JPA 提供的接口,也是Spring Data JPA的核心概念:
1.Repository:最顶层的接口,是一个空的接口,目的是为了统一所有
Repository的类型,且能让组件扫描的时候自动识别。
2:CrudRepository :是Repository的子接口,提供CRUD的功能。
3:PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能。
4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
5:JpaSpecificationExecutor:用来做负责查询的接口
6:Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可
三.接下来.咋们来学习一下如何使用Spring Data JPA
1.需要先下载Spring Data JPA的发布包(需要同时下载Spring Data
Commons和Spring Data JPA两个发布包,Commons是Spring Data的公共基础包),并把相关的依赖 JAR 文件加入到CLASSPATH 中。
2.让持久层接口Dao(以OrderRepository)继JpaRepository 接口,(该
接口使用了泛型,需要为其提供两个类型,第一个为该接口处理的域对象类型,第二个为该域对象的主键类型)
3.在 Spring 配置文件中启用扫描并自动在数据库创建实体类对应的表,以及事物管理器。
<bean id="dataSource"class="boPooledDataSource"> <property name="driverClass"value="${jdbc.driver}"/>
<property name="jdbcUrl"value="${jdbc.url}"/>
<property name="user"value="${er}"/>
<property name="password"value="${jdbc.password}"/>
</bean>
<!-- 整合JPA配置 -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBe an">
<property name="dataSource"ref="dataSource"/>
<property name="packagesToScan"value="cn.itcast.bos.domain"/>
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider"/> </property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapte r">
<property name="generateDdl"value="true"/>
<property name="database"value="MYSQL"/>
<property name="databasePlatform"value="org.hibernate.dialect.MySQL5Inno DBDialect"/>
<property name="showSql"value="true"/>
</bean>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> </property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.query.substitutions"value="true 1, false 0"/>
<entry key="hibernate.default_batch_fetch_size"value="16"/>
<entry key="hibernate.max_fetch_depth"value="2"/>
<entry key="hibernate.generate_statistics"value="true"/>
<entry key="e_reflection_optimizer"
value="true"/>
<entry key="e_second_level_cache"value="false"/>
<entry key="e_query_cache"value="false"/> </map>
</property>
</bean>
<!-- JPA事务管理器 -->
<bean id="transactionManager"class="org.springframework.orm.jpa.JpaTrans actionManager">
<property name="entityManagerFactory"ref="entityManagerFactory"/> </bean>
<!-- 注解管理事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 整合spring data jpa -->
<jpa:repositories base-package="cn.itcast.bos.dao"/>
</beans>
总结:
1.申明持久层的接口,让该接口继承Jpa Repository,他不包含任何方法,当然如果有需要Spring Data 也提供了若干Jpa Repository子接口,其中定义了一些常用的增删改查,以及分页相关的方法。
2.在接口中声明需要的业务方法。
Spring Data将根据给定的策略来为其生成实现代码。
3.在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象,配置了<jpa:repositories>后,Spring 初始化容器时将会扫描base-package指定的包目录及其子目录,为继承JpaRepository 或其子接口的接口创建代理对象,并将代理对象注册为Spring Bean,业务层便可以通过Spring 自动封装的特性来直接使用该对象。