前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java进阶|JPA系列教程(一)单表操作

java进阶|JPA系列教程(一)单表操作

作者头像
码农王同学
发布2020-06-17 11:24:26
8670
发布2020-06-17 11:24:26
举报
文章被收录于专栏:后端Coder

什么是JPA?

代码语言:javascript
复制
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行器的实体对象持久化到数据库中。

本文实现的内容如下:

代码语言:javascript
复制
关于JPA对user表的单表操作,主要包含的内容如下
(1)根据userId获取用户信息。
(2)获取用户列表信息。
(3)保存用户信息。
(4)更新用户信息。
(5)删除用户信息。
(6)分页获取用户列表信息,这个很常用吧,没有见过不分页就对数据表进行查询的,或者基于时间段进行查询。
(7)批量删除,主要根据用户id进行删除,其目的就是提高用户的使用体验。

一,项目依赖的jar包信息

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

二,项目所依赖的数据库和JPA信息配置

代码语言:javascript
复制
server:
  port: 8080
spring:
  application:
    name: jpa-springboot
  datasource:
    url: jdbc:mysql://localhost:3306/jpa?serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: on
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

说明一下,记得配置JPA的方言,即database-platform。

三,项目需要的基础类

代码语言:javascript
复制
package com.wpw.jpaspringboot.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.io.Serializable;

/**
 * @author wpw
 */
@Entity
@Table(name = "user")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "username")
    private String userName;
    @Column(name = "password")
    private String passWord;
}
代码语言:javascript
复制
package com.wpw.jpaspringboot.vo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * @author wpw
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public class RequestVo {
    private List<Long> idList;
}

四,项目的处理器controller,主要用户接收前端传入的参数,这里基于postman测试工具进行测试。

代码语言:javascript
复制
package com.wpw.jpaspringboot.controller;

import com.wpw.jpaspringboot.vo.RequestVo;
import com.wpw.jpaspringboot.entity.User;
import com.wpw.jpaspringboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author wpw
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping(value = "/get")
    public User getById(@RequestParam(value = "id") Long id) {
        return userService.getById(id);
    }

    @GetMapping(value = "/listUser")
    public List<User> listUser() {
        return userService.listUser();
    }

    @PostMapping(value = "/save")
    public Long save(@RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping(value = "/update")
    public Long update(@RequestBody User user) {
        return userService.update(user);
    }

    @GetMapping(value = "/listPagination")
    public List<User> listPagination(@RequestParam(value = "pageNumber") Integer pageNumber
            , @RequestParam(value = "pageSize") Integer pageSize) {
        return userService.listPagination(pageNumber, pageSize);
    }

    @DeleteMapping(value = "/delete")
    public void delete(@RequestParam(value = "id") Long id) {
        userService.deleteById(id);
    }

    @DeleteMapping(value = "/batchDelete")
    public void batchDelete(@RequestBody RequestVo requestVo) {
        userService.batchDelete(requestVo.getIdList());
    }

}

五,基于java常用的MVC分层架构的写法,这里我们看下业务逻辑层的实现逻辑和接口定义。

代码语言:javascript
复制
package com.wpw.jpaspringboot.service;

import com.wpw.jpaspringboot.entity.User;

import java.util.List;

/**
 * @author wpw
 */
public interface UserService {
    /**
     * 根据用户id查找用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    User getById(Long id);

    /**
     * 获取用户列表信息,这个用法其实很少,谁会全表查呢
     *
     * @return 用户列表信息
     */
    List<User> listUser();

    /**
     * 保存用户信息
     *
     * @param user 用户信息
     * @return 主键
     */
    Long save(User user);

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 主键
     */
    Long update(User user);

    /**
     * 进行分页数据的查询
     *
     * @param pageNumber 其实页
     * @param pageSize   分页大小
     * @return 返回分页后的数据信息
     */
    List<User> listPagination(Integer pageNumber, Integer pageSize);

    /**
     * 根据用户id删除用户信息
     *
     * @param id 用户id
     */
    void deleteById(Long id);

    void batchDelete(List<Long> idList);
}
代码语言:javascript
复制
package com.wpw.jpaspringboot.service.impl;

import com.wpw.jpaspringboot.entity.User;
import com.wpw.jpaspringboot.repository.UserRepository;
import com.wpw.jpaspringboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author wpw
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public User getById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Override
    public List<User> listUser() {
        return userRepository.findAll();
    }

    @Override
    public Long save(User user) {
        return userRepository.save(user).getId();
    }

    @Override
    public Long update(User user) {
        preCheck(user);
        return userRepository.save(user).getId();
    }

    @Override
    public List<User> listPagination(Integer pageNumber, Integer pageSize) {
        PageRequest pageRequest = PageRequest.of(pageNumber - 1, pageSize);
        return userRepository.findAll(pageRequest).getContent();

    }

    @Override
    public void deleteById(Long id) {
        preCheckIsExists(id);
        userRepository.deleteById(id);
    }

    @Override
    public void batchDelete(List<Long> idList) {
        List<User> userList = userRepository.findAllById(idList);
        List<Long> idListNew = userList.stream().map(User::getId).collect(Collectors.toList());
        idList.retainAll(idListNew);
        System.out.println("idList = " + idList);
        userRepository.deleteInBatch(userList);
    }

    private void preCheckIsExists(Long id) {
        Optional<User> optionalUser = userRepository.findById(id);
        if (optionalUser.isPresent()) {
            User u = optionalUser.get();
            if (Objects.isNull(u)) {
                return;
            }
        }
    }

    private void preCheck(User user) {
        preCheckIsExists(user.getId());
    }
}

六,操作数据库,用到了JPA提供好的JpaRepository接口,这里面已经实现了基本的增删改查方法,我们直接调用即可。

代码语言:javascript
复制
package com.wpw.jpaspringboot.repository;

import com.wpw.jpaspringboot.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * @author wpw
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

与此同时,给截个图看下这里面的方法吧。

是不是很简单,这也是JPA比较好的地方,一款比较优秀的ORM框架,写到这我还是比较喜欢MyBatis这个框架的,因为我刚刚喜欢上MyBatis框架时又去使用JPA上了,后面再去说下为啥自己习惯MyBatis这个框架吧想了解MyBatis的可以看下我之前写的文章,MyBatis系列教程吧,有点扯远了,这里看下项目的结构示例图。

七,这里说下,由于使用JPA可以帮我们自己创建表,这里就没有定义表结构sql,但是为了方便需要的人,这里自己手写了一下sql。

代码语言:javascript
复制
show databases ;
use jpa;
select database();
create table `user`(
    id bigint primary key  comment '主键,用户id',
    username varchar(255) comment '用户名',
    password varchar(255) comment '用户密码'
)engine=InnoDB charset =utf8 comment '用户表'

八,由于个人习惯将写好的代码放到自己的github账户里面,便于查找,所以这里提供一下这个项目的github地址,需要的可以直接下载。

代码语言:javascript
复制
https://github.com/myownmyway/jpa-springboot.git

到这里这篇文章就结束了,喜欢的可以进行点个在看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农王同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档