Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
Spring Boot陈恒_JAVA8与JAVA11,希望能够帮助你!!!。
### 前言
一直都在用MyBatis,感觉很好用,自己也熟悉。考虑到Spring Boot天生支持JPA,而且Hibernate也支持
分布式事务,有成熟的解决方案,值得研究一下
开发环境:
OS: Mac 10.11.6
IDE: IDEA
Build: Maven
### 引入依赖
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
```
###JPA Config
```
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@EnableJpaRepositories(basePackages = "tech.lingyi.**.dao")
@EntityScan(basePackages = "tech.lingyi.**.entity")
public class JpaConfiguration {
@Bean
PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){
return new PersistenceExceptionTranslationPostProcessor();
}
}
```
### 业务接口
```
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findAll(Specification<User> s, Pageable pageRequest);
}
```
JPA 实现了几乎我们所用的所有方法,你需要继承就可以了,提高了生产效率,解放了广大码农,可以去约妹子了。
### JPA CRUD 和 联合条件、分页查询
* insert
```
public User insert(){
User user = new User();
user.setNickname("neal");
return userRepository.save(user);
}
```
* updateByPK
```
public User updateByPK(){
User user = new User();
user.setId(31L);
user.setNickname("lingyi");
return userRepository.save(user);
}
```
* deleteByPK
```
public void deleteByPK(Long id){
userRepository.delete(id);
}
```
* selectByPK
```
public User selectByPK(Long id){
return userRepository.findOne(id);
}
```
* findPage 只分页 没有条件
```
public void findPage(){
Pageable pageable = new PageRequest(0,10, new Sort(
new Sort.Order(Sort.Direction.ASC, "username"),
new Sort.Order(Sort.Direction.DESC, "id"))
);
Page<User> page = userRepository.findAll(pageable);
Assert.notNull(page);
for (User user : page.getContent()){
LOGGER.info("id={}, name={}, department={}, role={}", user.getId(), user.getNickname(), user.getUsername(),"");
}
}
```
* findPage 只分页 没有条件
```
public void findPage(){
Pageable pageable = new PageRequest(0,10, new Sort(
new Sort.Order(Sort.Direction.ASC, "username"),
new Sort.Order(Sort.Direction.DESC, "id"))
);
Page<User> page = userRepository.findAll(pageable);
Assert.notNull(page);
for (User user : page.getContent()){
LOGGER.info("id={}, name={}, department={}, role={}", user.getId(), user.getNickname(), user.getUsername(),"");
}
}
```
* findCriteria, findCriteriaV2 两种方式 关联条件分页查询
```
public Page<User> findCriteria(final User user, int page, int pageSize) throws Exception {
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = new PageRequest(page, pageSize, sort);
return userRepository.findAll((root, query, builder) -> {
List<Predicate> predicates = new ArrayList<>();
if(null != user.getUsername()){
predicates.add(builder.equal(root.get("username").as(Long.class), user.getUsername()));
}
if(null != user.getNickname()){
predicates.add(builder.equal(root.get("nickname").as(String.class), user.getNickname()));
}
query.where(predicates.toArray(new Predicate[predicates.size()]));
return query.getRestriction();
}, pageable);
}
```
OR
```
public Page<User> findCriteriaV2(final User user, int page, int pageSize) throws Exception {
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = new PageRequest(page, pageSize, sort);
return userRepository.findAll((root, query, builder) -> {
Predicate p1 = builder.equal(root.get("username").as(String.class), user.getUsername());
Predicate p2 = builder.equal(root.get("nickname").as(Long.class), user.getNickname());
query.where(builder.and(p1, p2));
return query.getRestriction();
}, pageable);
}
```
### 结束
使用频率最多的都列举出来了,够我们用了。
但是程序员就像偷懒,不想每个domain都要写个XxxRepository,写个基础BaseRepository岂不是节省好多事呢,有空在写吧...
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章