随笔3
在springboot项目中使用JPA
Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别
CrudRepository:继承Repository,实现了一组CRUD相关的方法
PagingAndSortingRepository:继承CrudRepository,实现了一组分页排序相关的方法
JpaRepository:继承PagingAndSortingRepository,实现一组JPA规范相关的方法
JpaSpecificationExecutor:比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法。
先添加依赖:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> </dependency>
CrudRepository接口:
CrudRepository接口提供了最基本的增删改查能力,从各个方法的命名就很容易猜出用途
<S extends T> S save(S var1); //保存指定的实体
<S extends T> Iterable<S> save(Iterable<S> var1); //保存实体集合 T findOne(ID var1); //返回单个实体 boolean exists(ID var1); //判断是否存在 Iterable<T> findAll(); //返回全部实体 Iterable<T> findAll(Iterable<ID> var1); //返回集合<ID>的全部实体 long count(); //返回实体数量 void delete(ID var1); void delete(T var1); void delete(Iterable<? extends T> var1); void deleteAll();
PagingAndSortingRepository
PagingAndSortingRepository继承自CrudRepository接口,提供排序以及分页查询能力。这里需要讲一下Sort和Pageable类,非常重要,在查询中经常会用到(貌似也就这两个了)。
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); //排序,不执行分页 Page<T> findAll(Pageable pageable); //分页 }
举个栗子:
//进入 用户类别 的第二页(每一页的条目是20) ,可以像这样来分页 PagingAndSortingRepository<User, Long> repository = // … get access to a bean Page<User> users = repository.findAll(new PageRequest(1, 20));
需要注意的是:从0页开始.
sort:
Sort主要为了实现排序功能
栗子:
@Test public void testPage() { Sort sort = new Sort(Sort.Direction.DESC, "id"); List<User> list = userService.findAll(sort); for(User u : list) { System.out.println(u.getUserName()); } }
Pageabl:
在敲码的时候遇到个问题:
方法过时,查阅网上资料后得到解决办法:
public void testFindPage(){ Sort sort = new Sort(Sort.Direction.ASC,"id"); Pageable pageable =PageRequest.of(1,2, sort); Page<User> users = dao.findAll(pageable); System.out.println(users); }
附上参照众多博文后写的jpa的一些demo
package com.lk.jpademo.dao; import com.lk.jpademo.domain.User; import net.minidev.json.JSONArray; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * @Author: Lukizzz * @Date: 2018/8/1 14:34 * @Description: */ @RunWith(SpringRunner.class) @SpringBootTest public class UserRepositoryTest { @Autowired private UserRepository dao; @Test//保存 public void testSave(){ User user = new User(); user.setName("luke"); user.setAccount("10000"); user.setEmail("luke@163.com"); user.setPassword("123456"); dao.save(user); } @Test//批量保存 public void testSave1(){ List<User> users = new ArrayList<User>(); User user = new User(); user.setName("tanjie"); user.setAccount("10000"); user.setEmail("tanjie@.com"); user.setPassword("123456"); users.add(user); user = new User(); user.setName("esdong"); user.setAccount("10000"); user.setEmail("esdong@.com"); user.setPassword("123456"); users.add(user); user = new User(); user.setName("qinhongfei"); user.setAccount("10000"); user.setEmail("qinhongfei@.com"); user.setPassword("123456"); users.add(user); user = new User(); user.setName("huizhang"); user.setAccount("10000"); user.setEmail("huizhang@.com"); user.setPassword("123456"); users.add(user); user = new User(); user.setName("caican"); user.setAccount("10000"); user.setEmail("caican@.com"); user.setPassword("123456"); users.add(user); dao.saveAll(users); } @Test//修改id=1的用户密码 public void testUpdate(){ Optional<User> user = dao.findById(1); User user1 = user.get(); user1.setPassword("123123"); } @Test//删除id=2的用户的信息 public void testDelete(){ dao.deleteById(2); } @Test//查询全部用户 public void testFindAll(){ List<User> users = dao.findAll(); System.out.println(users); //System.out.println(JSONArray.toJSONString(users)); } @Test//判断指定的id对象是否存在 public void testIsExist(){ boolean isExist = dao.existsById(8); System.out.println(isExist); } @Test//通过id列表来查询 public void testFindUserByIds(){ List<Integer> listIds =new ArrayList<Integer>(); listIds.add(2); listIds.add(4); listIds.add(7); List<User> users = dao.findAllById(listIds); System.out.println(JSONArray.toJSONString(users)); } @Test//查找按id正序排列的第二页的用户 public void testFindPage(){ Sort sort = new Sort(Sort.Direction.ASC,"id"); Pageable pageable =PageRequest.of(1,2, sort); Page<User> users = dao.findAll(pageable); System.out.println(users); } }
查询全部用户和通过id列表来查询时遇到一个问题:
在控制台输出的不是正确的格式,而是这样的:
[com.lk.jpademo.domain.User@74fb5b59, com.lk.jpademo.domain.User@66451058, com.lk.jpademo.domain.User@3db6dd52, com.lk.jpademo.domain.User@1e92c3b6, com.lk.jpademo.domain.User@6ef4cbe1, com.lk.jpademo.domain.User@207d
原因是在控制台打印出来的是列表属性而不是json格式,找到了两种办法去解决
1:
System.out.println(JSONArray.toJSONString(users))
2.添加tostring方法
@Override public String toString() { return "User{" + "id=" + id + ", account='" + account + '\'' + ", name='" + name + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}'; }
明后天整理出自定义操作规则,用sql语句的学习笔记