SpringData和JPA结合

2018-03-17  本文已影响0人  咻咻咻i

行吧,爬虫学了一点点了。先等等,把这欠着的SpringData和JPA整合篇写了。说真的这个确实是好用,手下有个小项目这次就打算用SSSP这么一套框架整合来写。我们先简单谈谈SpringData和JPA整合的基本用法。

1、创建Maven项目

这次用流行的Maven来构建项目,包管理起来比较的方便。然后把基本的包创建好,最后结构如下。

pom中的包如下,需要注意的是版本一定要对应,用eclipse我并不会看maven依赖关系,用idea可以清晰的看到包之间的依赖关系,因为用了eclipse,就不截图看了

2、编写配置文件

因为这里只测试持久层所以就不去配置SpringMVC了。

...
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <context:component-scan base-package="cn.lkangle.*"/>
    
    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.pass}"/>
    </bean>
    
    <!-- 配置entityManagerFactory -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
        </property>
        
        <property name="packagesToScan" value="cn.lkangle.entity"/>
        
        <!-- 配置二级缓存开启方式 -->
        <property name="sharedCacheMode" value="ENABLE_SELECTIVE"/>
        <property name="jpaProperties">
            <props>
                <!-- hibernate相关配置 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                
                <!-- 配置二级缓存项 -->
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
            </props>
        </property>
    </bean>
    
    <!-- 配置JPA事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    <!-- 开启注解式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <!-- 引入springdata jpa的支持 -->
    <jpa:repositories base-package="cn.lkangle.repository" entity-manager-factory-ref="entityManagerFactory"/>
...

3、编写测试类进行测试

直接一张图解决吧,这里使用了spring提供的test包。需要注意junit版本要在4.5已上。好像就4.5记不太清楚了、、、

4、超级简单的Dao层

只需要我们继承SpringDataJpa提供的各种接口就行,甚至可以不需要任何代码就能完成基本的数据库操作。springdata一共提供了四个基础接口来给我们使用

除了一上四个比较基础的接口外还提供了一个用来动态查询的接口

一般我们直接继承JpaRepository这个接口便能完成常用的CRUD操作。

save 保存,delete删除,saveAndFlush修改,findOne查找一个,findAll查找所有等等。

已上是接口提供的crud基本方法,我们还能通过@Query注解和@Modifying注解配合使用通过JPQL进行crud操作。

  /**
   * 删除
   * @date 2018年3月16日
   */
  @Modifying
  @Query("delete from Student where id=?1")
  Integer delete_(Integer id);
  
  /**
   * 修改 
   * @date 2018年3月16日
   */
  @Modifying
  @Query("update from Student set name=?1 where id=?2")
  Integer change_(String name, Integer id);
  
  /**
   * 查询 
   * @date 2018年3月16日
   */
  @Query("select s from Student s where id=?1")
  Student find_(Integer id);

不仅如此SpringData JPA还提供了根据方法名自动构建查询的功能。具体查看官方文档这里就不做示例了。

  @Transactional(readOnly = true) 
  public Page<Student> pageQuery(Map<String, Object> map, Integer pageNo) {
      Specification<Student> spec = new Specification<Student>() {
          @Override
          public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
              List<Predicate> ps = new ArrayList<>();
              map.forEach((key, val)->{
                  try {
                      ps.add(cb.equal(root.get(key), val));
                  } catch (Exception e) {
                      log.error("不存在的属性--> {}", e);
                  }
              });
              query.where(ps.toArray(new Predicate[ps.size()]));
              return null;
          }
      };
      /**
       * 这里我们按照id降序,每页5条数据进行分页查询
       * 需要注意这里的pageNo是从0开始的
       */
      Pageable sort = new PageRequest(pageNo - 1, 5, new Sort(new Sort.Order(Direction.DESC, "id")));
      Page<Student> stus = dao.findAll(spec, sort);
      return stus;
  }

这样就简单的构建了一个动态分页查询,更多的查询条件可以在文档中查看,直接查看CriteriaQueryCriteriaBuilder接口源码也能看到。

5、缓存使用也变得简单

  /**
   * 查询 
   * @date 2018年3月16日
   * @QueryHints是org.springframework.data.jpa.repository.QueryHints
   * @QueryHint是javax.persistence.QueryHint
   */
  @Query("select s from Student s where id=?1")
  @QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "true"))
  Student find_(Integer id);

6、总结

使用SpringData JPA可以简化dao层的开发,使开发者只写少量的代码就能完成复杂的数据库操作,大大加快了开发效率。官方文档链接前面加了,这里在添加一次。官方文档

上一篇 下一篇

猜你喜欢

热点阅读