【Java】Spring Data JPA应用实例

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<User, Integer> {

	// 这里我们自定义查询语句,必须使用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. 数据访问接口调用

在接口调用过程中,我们会常常出现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<User> getAllUsers() {
        return userDao.findAll();
    }
	
	// 按id批量查找
    @RequestMapping(value = "/users/{ids}", method = RequestMethod.GET)
    public List<User> 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<User> saveUsers(String users) {
        JSONArray jsonArray = JSONObject.parseArray(users);
        List<User> 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<User> users = new ArrayList<>();
        this.getIdListFromString(ids).forEach(id -> {users.add(new User(id));});
        userDao.deleteInBatch(users);
    }

	// 将以,隔开的id转换为List
    private List<Integer> getIdListFromString(String ids) {
        List<Integer> integers = new ArrayList<>();
        for (String s : ids.split(",")) {
            integers.add(Integer.valueOf(s));
        }
        return integers;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值