JPA简介
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展起来的,具有易于使用,伸缩性强等优点。
JPA是一套规范,不是一套产品。Hibernate是一套产品,如果这些产品实现了JPA规范,那么我们可以叫它们为JPA的实现产品。使用JPA,就可以把我们的应用完全从Hibernate中解脱出来
Spring-data-jpa就是基于Hibernate的实现,配合Spring Boot可以更加快速高效的开发我们的项目,其使用简单快捷,甚至可以不用写一条SQL语句,基本可以满足大部分需求,深受广大开发者的青睐。
Spring-data-jpa主要类介绍
在Spring-data-jpa的提供了这么几个类供我们的crud操作:
CrudRepository:基本的增删改查操作接口
QueryByExampleExecutor:根据实例条件查询接口
PagingAndSortingRepository:分页和排序接口集成CrudRepository接口
JpaRepository:继承了上面所有接口
由此可见我们只需实现JpaRepository接口便可拥有上面所有功能
Spring-data-jpa基本使用
添加pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
修改配置文件:application.yml 增加数据库连接配置,修改为自己的数据库
#设置端口 server: port: 8080 context-path: / #开发环境日志 logging: config: log4j2-dev.xml spring: #############################################主库配置######################################### datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8 username: root password: 123456 jpa: hibernate: ddl-auto: update show-sql: true
创建实体类UserInfo
@Entity @Table(name = "user_info") public class UserInfo implements Serializable { @Id @GeneratedValue @Column(name = "user_id") private Integer userId; @Column(name = "user_name") private String userName; 省略get()/set()方法 }
@Entity:表明这是个实体类
@Table(name = "user_info"):映射数据库表
@Column(name = "user_id"):映射数据库字段
@GeneratedValue:表明为主键id
创建接口类UserInfoRepository继承JpaRepository
public interface UserInfoRepository extends JpaRepository<UserInfo,Integer> { }
创建service实现类UserInfoServiceImpl(接口在这省略)
@Service public class UserInfoServiceImpl implements UserInfoService { @Autowired private UserInfoRepository userInfoRepository; @Override public UserInfo findAll(Integer id){ UserInfo user = userInfoRepository.findOne(id); return user; } }
创建控制层UserInfoController
@Controller public class UserInfoController { @Autowired private UserInfoService userInfoService; @RequestMapping(value = "/findOne") @ResponseBody public UserInfo findAll(@RequestParam("id") Integer id){ UserInfo user = userInfoService.findOne(id); return user; } }
到此我们就完成了一个简单的查询操作,接下来创建数据库,运行项目(会自动创建数据表),往数据库手动添加一条信息,然后打开浏览器访问 http://127.0.0.1:8080/findOne?id=1 即可看到结果。
jpa的分页排序操作:修改UserInfoServiceImpl实现类即可
@Service public class UserInfoServiceImpl implements UserInfoService { @Autowired private UserInfoRepository userInfoRepository; @Override public Page<UserInfo> findOne(Integer id){ //排序 Sort sort = new Sort(Sort.Direction.DESC,"排序字段"); //分页(从第一页开始,每页10条数据) Pageable pageable = new PageRequest(1,10,sort); Page<UserInfo> page = userInfoRepository.findAll(pageable); return page; } }
JpaRepository接口提供的其他方法大家可以自己去尝试很简单,这里要说的是jpa是一种规范,那么他的查询方法同样有严格的命名定义,除了一些简单增删改查外,稍微复杂点的如 findByNameLike、findByNameStartingWith 等一系列方法都是遵循严格的命名定义不能随便写,下面给出jpa按规则查询的方法:
Keyword | Sample | JPQL snippet |
IsNotNull | findByAgeNotNull | ... where x.age not null |
Like | findByNameLike | ... where x.name like ?1 |
NotLike | findByNameNotLike | ... where x.name not like ?1 |
StartingWith | findByNameStartingWith | ... where x.name like ?1(parameter bound with appended %) |
EndingWith | findByNameEndingWith | ... where x.name like ?1(parameter bound with prepended %) |
Containing | findByNameContaining | ... where x.name like ?1(parameter bound wrapped in %) |
OrderBy | findByAgeOrderByName | ... where x.age = ?1 order by x.name desc |
Not | findByNameNot | ... where x.name <> ?1 |
In | findByAgeIn | ... where x.age in ?1 |
NotIn | findByAgeNotIn | ... where x.age not in ?1 |
True | findByActiveTrue | ... where x.avtive = true |
Flase | findByActiveFalse | ... where x.active = false |
And | findByNameAndAge | ... where x.name = ?1 and x.age = ?2 |
Or | findByNameOrAge | ... where x.name = ?1 or x.age = ?2 |
Between | findBtAgeBetween | ... where x.age between ?1 and ?2 |
LessThan | findByAgeLessThan | ... where x.age < ?1 |
GreaterThan | findByAgeGreaterThan | ... where x.age > ?1 |
After/Before | ... | ... |
IsNull | findByAgeIsNull | ... where x.age is null |
public interface UserInfoRepository extends JpaRepository<UserInfo,Integer> { /** * 根据用户名查询用户信息 * @param userName * @return */ @Query("select u from UserInfo u where u.userName=?1") UserInfo findUserInfoByName(String userName); /** * 查询用户信息 * @return */ @Query("select u from UserInfo u ") UserInfo findUserInfo(); }Spring-data-jpa的简单操作到此就结束了,怎么样是不是很简单呢,当然还有更加高级的玩法,我们可以通过继承JpaSpecificationExecutor来扩展我们的复杂查询操作,在下一篇中我会做详细介绍以及对jpa的封装,让我们的开发变得更加方便易懂