怎么入门SpringJPA

怎么入门SpringJPA,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

成都创新互联,专注为中小企业提供官网建设、营销型网站制作、成都响应式网站建设、展示型网站制作、做网站等服务,帮助中小企业通过网站体现价值、有效益。帮助企业快速建站、解决网站建设与网站营销推广问题。

从一个helloworld开始

建立好springboot的项目后

pom.xml

   org.springframework.boot   spring-boot-starter-actuator   org.springframework.boot   spring-boot-starter-data-jpa   org.springframework.boot   spring-boot-starter-web   org.projectlombok   lombok   true   com.alibaba   fastjson   1.2.47   com.alibaba   druid   1.0.29   MySQL   mysql-connector-java   8.0.11   org.springframework.boot   spring-boot-starter-test   test

配置文件

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/jpa?useSSL=FALSE&serverTimezone=GMT%2B8username: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSourcefilters: statmaxActive: 20initialSize: 1maxWait: 60000minIdle: 1timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: select 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxOpenPreparedStatements: 20  jpa:    hibernate:      ddl-auto: updateshow-sql: true

实体类

@Entity@Data@RequiredArgsConstructor@AllArgsConstructor@NoArgsConstructorpublic class User {@Id    @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;    @NonNull    private String name;    @NonNull    private String email;}

仓库文件

public interface UserRepository extends CrudRepository {
}

controller

@RestControllerpublic class UserController {@Autowired    private UserRepository userRepository;    @SuppressWarnings("unchecked")@Transactional    @GetMapping("/add")public Result addNewUser(@RequestParam("name") String name,@RequestParam("email") String email) {
        User user = new User(name,email);        userRepository.save(user);        return Result.success("添加用户成功");    }@GetMapping("/all")@SuppressWarnings("unchecked")public Result> getAllUsers() {return Result.success(userRepository.findAll());    }@GetMapping("/user")@SuppressWarnings("unchecked")public Result getUser(@RequestParam("id") Long id) {return Result.success(userRepository.findById(id));    }
}

也可以直接用名字查询

public interface UserAloneRepository extends Repository {
    List findByName(String name);}

在UserController中添加

@Autowiredprivate UserAloneRepository userAloneRepository;
@GetMapping("/user/name")@SuppressWarnings("unchecked")public Result getUserByName(@RequestParam("name") String name) {return Result.success(userAloneRepository.findByName(name));}

jpa的一个好处是可以不用手工去数据库建表,一运行就可以自动建表。

如果要分页和排序

public interface UserPagingAndSortingRepository extends PagingAndSortingRepository {
}

Controller中添加

/** * 分页和排序 * @return */@SuppressWarnings("unchecked")@GetMapping("/page")public Result> getAllUserByPage() {return Result.success(userPagingAndSortingRepository.findAll(new PageRequest(0,2,new Sort(new Sort.Order(Sort.Direction.ASC,"name")))
    ));}/** * 排序 * @return */@SuppressWarnings("unchecked")@GetMapping("/sort")public Result> getAllUserWithSort() {return Result.success(userPagingAndSortingRepository.findAll(new Sort(new Sort.Order(Sort.Direction.ASC,"name"))
    ));}

我们来看一下他的总体继承关系结构图

怎么入门SpringJPA

其中SimpleJpaRepository是他们所有接口的实现类,而JpaRepository以上其实都是兼容NOSQL的接口,而只有JpaRepository以下才是对数据库特有的接口。

而使用的方法也是一样,只需要用一个自定义接口继承即可

public interface UserJpaRespository extends JpaRepository {
}

jpa有自己的根据方法名的查询生成器机制,例如之前的UserAloneRepository中的findByName,findBy是固定前缀,Name是属性名。我们来看几个and、or的查询。

public interface UserAloneRepository extends Repository {
    List findByName(String name);    List findByNameAndEmail(String name,String email);    List findByNameOrEmail(String name,String email);}

Controller中的

@SuppressWarnings("unchecked")@GetMapping("/and")public Result> getUserByNameAndEmail(@RequestParam("name") String name,@RequestParam("email") String email) {return Result.success(userAloneRepository.findByNameAndEmail(name,email));}@SuppressWarnings("unchecked")@GetMapping("/or")public Result> getUserByNameOrEmail(@RequestParam("name") String name,@RequestParam("email") String email) {return Result.success(userAloneRepository.findByNameOrEmail(name,email));}

我们从打印出来的日志可以看到

Hibernate: select user0_.id as id1_0_, user0_.email as email2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? and user0_.email=?
Hibernate: select user0_.id as id1_0_, user0_.email as email2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? or user0_.email=?

其实就是where语句后面的and和or.

这种and以及or是可以无限接下去的多条件查询。现在我们来看一下去重和取前几个数据

public interface UserAloneRepository extends Repository {
    List findByName(String name);    List findByNameAndEmail(String name,String email);    List findByNameOrEmail(String name,String email);    //去重    List findDistinctByName(String name);    //查找前2个    List findTop2ByName(String name);}

只要加上Distinct和Top数字就可以了

现在给User实体类增加两个字段

@Entity@Data@RequiredArgsConstructor@AllArgsConstructor@NoArgsConstructorpublic class User {@Id    @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;    @NonNull    private String name;    @NonNull    private String email;    private int age;    private boolean sex;}

启动项目后,数据库会自动给user表增加上该字段

怎么入门SpringJPA

所有的jpa关键字如下

public interface UserAloneRepository extends Repository {
    List findByName(String name);    List findByNameAndEmail(String name,String email);    List findByNameOrEmail(String name,String email);    //去重    List findDistinctByName(String name);    //查找前2个    List findTop2ByName(String name);    //查找小于age参数的    List findByAgeBefore(int age);    //查找小于age参数的    List findByAgeLessThan(int age);    //查找小于等于age参数的    List findByAgeLessThanEqual(int age);    //查找大于age参数的    List findByAgeAfter(int age);    //查找大于age参数的    List findByAgeGreaterThan(int age);    //查找大于等于age参数的    List findByAgeGreaterThanEqual(int age);    //查找name为null的    List findByNameIsNull();    //查找name不为null的    List findByNameNotNull();    //查找like name的(此处不带%)    List findByNameLike(String name);    //查找not like name的(此处不带%)    List findByNameNotLike(String name);    //查找like %name(无后缀%)    List findByNameStartingWith(String name);    //查找like name%(无前缀%)    List findByNameEndingWith(String name);    //查找like %name%    List findByNameContaining(String name);    //根据name查找,按照age排序    List findByNameOrderByAgeDesc(String name);    //查找不等于age的    List findByAgeNot(int age);    //根据age查找在ages集合内的    List findByAgeIn(Set ages);    //根据age查找不在ages集合内的    List findByAgeNotIn(Set ages);    //查找sex为1的    List findBySexTrue();    //查找sex为0的    List findBySexFalse();    //按照email查找,不区分大小写    List findByEmailIgnoreCase(String email);    //按照name查找总数    long countByName(String name);    //按照name删除    //此处是根据查找出来的id一条一条删除的,所以在调用的时候必须加事务    long deleteByName(String name);    //按照name删除    //此处是根据查找出来的id一条一条删除的,所以在调用的时候必须加事务    List removeByName(String name);}

在删除时必须带上事务

@Transactional@SuppressWarnings("unchecked")@GetMapping("/delete")public Result deleteByName(@RequestParam("name") String name) {userAloneRepository.deleteByName(name);    return Result.success("删除成功");}@Transactional@SuppressWarnings("unchecked")@GetMapping("/remove")public Result> removeByName(@RequestParam("name") String name) {return Result.success(userAloneRepository.removeByName(name));}

根据打印的日志可以看到其实是按照id来删除的

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.sex as sex5_0_ from user user0_ where user0_.name=?
Hibernate: delete from user where id=?
Hibernate: delete from user where id=?

关于怎么入门SpringJPA问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


本文名称:怎么入门SpringJPA
分享链接:http://hbruida.cn/article/pieosp.html