Spring Boot干货——(七)Spring Boot整合Spring Data JPA

来源:互联网 发布:云脉文档识别 mac 编辑:程序博客网 时间:2024/05/18 02:19

前言

Spring Data JPA对大家来说相对比较陌生,尤其是在一些传统互联网行业工作的人。一方面现在mybatis整合Spring和SpringMVC如火如荼,遮盖住了Spring Data的锋芒,另一方面不少公司的管理层为了项目稳定不太喜欢用不熟悉的工具,就这样Spring Data变得有些悲剧,不过用过Spring Data的人一定会深深的爱上他的,因为他真的实在是太方便了,尤其是在Spring整合中。下面我们就来详细介绍一下Spring Boot整合Spring Data JPA。

优点:

1.自动通过代码创建数据库;

2.部分常用的sql语句不需要自己编写,大大提高了开发效率;



正文

接口继承关系图



依赖

 <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>        </dependency><dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency><!-- 数据源 -->      <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid</artifactId>            <version>1.0.19</version>        </dependency>

项目结构图



Application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/testspring.datasource.username = rootspring.datasource.password = XXXXXXXspring.datasource.driver-class-name = com.mysql.jdbc.Driverspring.jpa.properties.hibernate.hbm2ddl.auto=updatelogging.file=/log/springBootTest.logserver.port=8090

注意,如果通过jpa在数据库中建表,将jpa.hibernate,ddl-auto改为create,建完表之后,要改为update,要不然每次重启工程会删除表并新建。
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。


Bean

package com.gwd.domain;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.*;//@Table(name="User")//用来绑定表名,如果表名与bean名称本身一致,那么可以不用@Entitypublic class User {@Id@GeneratedValue    private Integer id;@Column(nullable=false)    private String name;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name == null ? null : name.trim();    }}

Dao
package com.gwd.dao;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import com.gwd.domain.User;public interface StuMapper extends JpaRepository<User, Integer>{@Query("select u from User u where id =?1")List<User> findUserById(Integer id);}

这块需要注意:spring data jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等,


简单条件查询

按照 Spring Data的规范,查询方法以 find | read | get开头, 
涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写 

例如:定义一个 Entity实体类 
class User
 
        private StringfirstName; 
        private StringlastName; 
 
使用And条件连接时,应这样写: 
findByLastNameAndFirstName(String lastName,String firstName); 
条件的属性名称与个数要与参数的位置与个数一一对应 


KeywordSampleJPQL snippetAndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2Is,EqualsfindByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2LessThanfindByAgeLessThan… where x.age < ?1LessThanEqualfindByAgeLessThanEqual… where x.age ⇐ ?1GreaterThanfindByAgeGreaterThan… where x.age > ?1GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1AfterfindByStartDateAfter… where x.startDate > ?1BeforefindByStartDateBefore… where x.startDate < ?1IsNullfindByAgeIsNull… where x.age is nullIsNotNull,NotNullfindByAge(Is)NotNull… where x.age not nullLikefindByFirstnameLike… where x.firstname like ?1NotLikefindByFirstnameNotLike… where x.firstname not like ?1StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname descNotfindByLastnameNot… where x.lastname <> ?1InfindByAgeIn(Collection ages)… where x.age in ?1NotInfindByAgeNotIn(Collection age)… where x.age not in ?1TRUEfindByActiveTrue()… where x.active = trueFALSEfindByActiveFalse()… where x.active = falseIgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

分页查询

分页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable
,当查询中有多个参数的时候Pageable建议做为最后一个参数传入

StuServiceImpl
public Page<User> queryPage(int page, int size, Sort id) {    Sort sort = new Sort(Direction.DESC, "id");    Pageable pageable = new PageRequest(page, size, sort);    Page<User> findALL = stuMapper.findALL(pageable);return findALL;}

Controller
@RequestMapping("/getPage")public void testPage() {Sort sort = new Sort(Direction.DESC, "id");Page<User> page = stuService.queryPage(1, 2, sort);System.out.println("当前总记录数"+page.getTotalElements());System.out.println("当前页面的记录数"+page.getNumberOfElements());System.out.println("总页数"+page.getTotalPages());System.out.println("当前页面的List"+page.getContent());System.out.println("当前页码"+(page.getNumber()+1));}



阅读全文
0 0
原创粉丝点击