温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中Spring Data JPA的使用

发布时间:2020-06-16 15:38:00 来源:亿速云 阅读:126 作者:元一 栏目:编程语言

  简介:

  Spring Data JPA 的目标是通过让一些必须的工作变得更简单,来显著提高数据访问层的实现。作为一个开发者,你写你的仓库界面,包括自定义查询方法,而 Spring 给你提供自动实现。

  特性:

  对建立基于Spring 和 JPA 的库的支持

  支持 Querydsl predicates 和安全类型的 JPA 查询

  Transparent auditing of domain class

  Pagination 支持, 动态查询执行, 可以集成自定义数据访问代码

  在 @Query 注明查询引导时验证

  支持基于 XML 的实体映射

  引入 @EnableJpaRepositories.,实现基于JavaConfig based 仓库配置

  1. Spring Data JPA

  通常,在Java语言中,我们为项目提供数据支持时,常常用到的ORM(Object Relation Mapping)框架有:MyBatis(iBatis)或Hibernate。通常在使用时,我们需要写大量配置文件,比如mapper文件,hibernate cfg文件等。

  Spring Data Jpa集成在SpringBoot中,因为SpringBoot是一款习惯大于配置的微服务框架。所以Spring Data Jpa减少了传统ORM框架中的大量配置,转而使用让数据访问类(DAO)实现接口的方式定义数据查询方式,当然,我们也可以利用Spring Data Jpa提供的@Query注解实现SQL自定义,但是因为Spring Data Jpa结合了Hibernate中的特性,所以自定义SQL语句时,必须使用HQL(Hibernate Query Language)语句。

  2. 配置数据源

  #application.yml

  spring:

  datasource:

  driver-class-name: com.mysql.cj.jdbc.Driver

  url: jdbc:mysql://localhost:3306/db_88ys

  username: huangwei

  password: 123456789

  3. 定义实体

  在定义实体时,我们需要使用到大量Spring Data Jpa提供的注解,这些注解都来源于(javax.presistence.*)。

  package com.demo.analysis.entity;

  import lombok.Data;

  import javax.persistence.*;

  @Data //lombok注解,提供相应属性的getter,setter

  @Entity //表明该类是实体类

  @Table(name = "tb_user") //说明该实体所对应的数据表表名称,不添加则说明数据表和类名相同

  public class User {

  @Id //表明该属性对应数据库中的id主键

  @GeneratedValue(strategy = GenerationType.IDENTITY) //指定主键生成策略:自增

  private Integer id;

  @Column(name = "username") //指定该属性所对应数据库中的字段名称

  private String username;

  @Column(name = "password")

  private String password;

  public User(Integer id) {

  this.id = id;

  }

  public User(Integer id, String username, String password) {

  this.id = id;

  this.username = username;

  this.password = password;

  }

  }

  4. 定义数据访问接口

  package com.demo.analysis.dao;

  import com.demo.analysis.entity.User;

  import org.springframework.data.jpa.repository.JpaRepository;

  import org.springframework.data.jpa.repository.Query;

  import org.springframework.stereotype.Repository;

  // 在继承JpaRepository时,我们需要传入两个泛型,第一个是所对应的实体类,第二个是实体类中主键的类型

  @Repository

  public interface IUserDao extends JpaRepository {

  // 这里我们自定义查询语句,必须使用HQL,即(Hibernate Query Language)

  @Query(value = "select new User(u.id, u.username, u.password) from User u where u.username=:username")

  User findUserByUserName(String username);

  }

  5. 数据访问接口调用郑州人流医院哪家好 http://m.zzzy120.com/

  在接口调用过程中,我们会常常出现Iterable类型的参数,这是我们需要将参数转换为集合类,如List或Set。

  package com.demo.analysis.controller;

  import com.alibaba.fastjson.JSONArray;

  import com.alibaba.fastjson.JSONObject;

  import com.demo.analysis.dao.IUserDao;

  import com.demo.analysis.entity.User;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.web.bind.annotation.PathVariable;

  import org.springframework.web.bind.annotation.RequestMapping;

  import org.springframework.web.bind.annotation.RequestMethod;

  import org.springframework.web.bind.annotation.RestController;

  import java.util.ArrayList;

  import java.util.List;

  @RestController

  public class UserController {

  @Autowired

  private IUserDao userDao;

  // 查找全部

  @RequestMapping(value = "/users", method = RequestMethod.GET)

  public List getAllUsers() {

  return userDao.findAll();

  }

  // 按id批量查找

  @RequestMapping(value = "/users/{ids}", method = RequestMethod.GET)

  public List getUsersByIds(@PathVariable("ids") String ids) {

  return userDao.findAllById(this.getIdListFromString(ids));

  }

  // 自定义SQL,按用户名查询

  @RequestMapping(value = "/user/{username}", method = RequestMethod.GET)

  public User getUserByUserName(@PathVariable("username") String username) {

  return userDao.findUserByUserName(username);

  }

  // 保存单个用户

  @RequestMapping(value = "/user", method = RequestMethod.POST)

  public User saveUser(User user) {

  return userDao.save(user);

  }

  // 保存多个用户,这里传入的Json数据需要转换Json数组,并最终转换成相应实体类

  @RequestMapping(value = "/users", method = RequestMethod.POST)

  public List saveUsers(String users) {

  JSONArray jsonArray = JSONObject.parseArray(users);

  List userList = new ArrayList<>();

  for (int i = 0; i < jsonArray.size(); i++) {

  userList.add(jsonArray.getObject(i, User.class));

  }

  return userDao.saveAll(userList);

  }

  // 删除单个用户

  @RequestMapping(value = "/user", method = RequestMethod.DELETE)

  public void deleteUser(Integer id) {

  userDao.deleteById(id);

  }

  // 按id删除多个用户

  @RequestMapping(value = "/users", method = RequestMethod.DELETE)

  public void deleteUsersByIds(String ids) {

  List users = new ArrayList<>();

  this.getIdListFromString(ids).forEach(id -> {users.add(new User(id));});

  userDao.deleteInBatch(users);

  }

  // 将以,隔开的id转换为List

  private List getIdListFromString(String ids) {

  List integers = new ArrayList<>();

  for (String s : ids.split(",")) {

  integers.add(Integer.valueOf(s));

  }

  return integers;

  }

  }

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI