一、 使用Springboot+Jpa实现对mysql数据库的增删改查和分页功能

  JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
  使用Springboot和jpa对数据库进行操作时,能够大大减少我们的工作量,在jpa中,已经在底层封装好了增删查的功能和sql语句,可以使我们进行快速开发

二、项目过程和配置文件

1、applaction.properties文件配置

#数据源配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
#注意   test是你要连接的数据库的名字  见下图
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.initialSize=20
spring.datasource.minIdle=50
spring.datasource.maxActive=500

#上下文配置
server.port=8888
server.servlet.context-path=/kude

#配置jpa
#帮我们自动生成表结构
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页

2、pom.xml文件配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>kudesoft</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>kudesoft</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- druid数据库连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>
	<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter   实现分页功能的插件-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>1.2.10</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3、项目结构

SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页

4、实体类Student

package com.example.kudesoft.entity;

import javax.persistence.*;

/**
 * Student实体类
 * @Entity   表示该类是一个实体类
 * @Table(name = "student")  表示该类对应数据库中的student表
 *  @Id   表明该属性是一个主键
 * @GeneratedValue(strategy = GenerationType.IDENTITY)  表示该主键自增
 */
@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String sname;
    private String spassword;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", sname='" + sname + '\'' +
                ", spassword='" + spassword + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSpassword() {
        return spassword;
    }

    public void setSpassword(String spassword) {
        this.spassword = spassword;
    }
}

5、DAO层

package com.example.kudesoft.dao;

import com.example.kudesoft.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface StudentDAO extends JpaRepository<Student,Integer> {

    //根据id查
    Student findStudentById(Integer id);
    //根据名字查询
    @Query(name = "findStudentBySname",nativeQuery = true,
            value = "select * from student where sname=:sname")
    List<Student> findStudentBySname(@Param("sname") String sname);

    //登录功能
    Student findStudentBySnameAndSpassword(@Param("sname") String sname,@Param("spassword") String spassword);
}

  在jpa中封装有查询功能、添加功能、删除功能,但是没有修改功能以及一些特定的查询功能,所以在编程过程中,我们需要根据需求来增加一些功能函数。如果要是根据id来进行查询或其他操作时,数据库中的主键id 一定要设为id,不要设置为sid、uid等其他的主键名。

6、Service层

package com.example.kudesoft.service;

import com.example.kudesoft.entity.Student;
import org.springframework.data.domain.Page;

import java.util.List;

public interface StudentService {

    //查询所有
    List<Student> findAll();

    //根据id查询单个
    Student findStudentById(Integer id);

    //根据name查询
    List<Student> findStudentByName(String sname);

    //登录
    Student findStudentByNameAndPassword(String sname,String spassword);

    //添加一个
    Student save(Student student);

    //删除一个
    void deleteStudentById(Integer id);

    //修改
    Student update(Student student);

    //分页
    Page<Student> findAll(int page, int pageSize);
}

  在编写分页功能时,一定要注意Page所在的包是import org.springframework.data.domain.Page,不是其他的包,如果包导错了,就会出现错误。

7、ServiceImpl

package com.example.kudesoft.service;

import com.example.kudesoft.dao.StudentDAO;
import com.example.kudesoft.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
/**
*Service 实现
*/

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentDAO studentDAO;

    /**
     * 查询所有
     * @return
     */
    @Override
    public List<Student> findAll() {
        return studentDAO.findAll();
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Override
    public Student findStudentById(Integer id) {
        return studentDAO.findStudentById(id);
    }

    /**
     * 根据名字查询
     * @param sname
     * @return
     */
    @Override
    public List<Student> findStudentByName(String sname) {
        return studentDAO.findStudentBySname(sname);
    }

    /**
     *
     * 查询name和password进行登录
     * @param sname
     * @param spassword
     * @return
     */
    @Override
    public Student findStudentByNameAndPassword(String sname, String spassword) {
        return studentDAO.findStudentBySnameAndSpassword(sname,spassword);
    }

    /**
     * 添加信息
     * @param student
     * @return
     */
    @Override
    public Student save(Student student) {
        return studentDAO.save(student);
    }

    /**
     * 根据id来删除
     * @param id
     */
    @Override
    public void deleteStudentById(Integer id) {

        studentDAO.deleteById(id);
    }

    /**
     * 修改
     * @param student
     * @return
     */
    @Override
    public Student update(Student student) {
        return studentDAO.save(student);
    }

    /**
     * 分页操作
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public Page<Student> findAll(int page, int pageSize) {
        Pageable pageable = PageRequest.of(page,pageSize);
        return (Page<Student>) studentDAO.findAll(pageable);
    }
}

  在进行分页操作的时候,由于Jpa中封装有很多的findAll()函数,所以一定要看清楚要用哪一个findAll()函数,如上代码片:查询所有的studentDAO.findAll()和分页的studentDAO.findAll()函数一样,但是内部参数不一样,所以就会产生不一样的结果。

8、Controller层

package com.example.kudesoft.controller;

import com.example.kudesoft.entity.Student;
import com.example.kudesoft.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 *控制层
 * @Autowired 用于类中的属性注入
 * @RestController注解底层包括了@ResponseBody和@Controller两个注解
 * @ResponseBody 将数据以json格式返回
 * @RequestMapping("/XXXX")  请求路径
 * @GetMapping("/xxxx")  Get请求
 * @PostMapping("/XXX") Post请求
 */
@RestController
@RequestMapping("/student")
public class StudentController {


    @Autowired
    private StudentService studentService;

    /**
     * 查询所有
     * @return
     */
    @GetMapping("/findAll")
    public List<Student> findAll(){

        return studentService.findAll();
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @GetMapping("/findById")
    public Student fingById(Integer id){
        return studentService.findStudentById(id);
    }


    /**
     * 根据名字查询
     * @param name
     * @return
     */
    @GetMapping("/findByName")
    public List<Student> findByName(String name){
        return studentService.findStudentByName(name);
    }


    /**
     * 登录功能
     * @param sname
     * @param spassword
     * @return
     */
    @PostMapping("/login")
    public Student login(String sname,String spassword){
        return studentService.findStudentByNameAndPassword(sname,spassword);
    }

    /**
     * 添加信息
     * @param student
     * @return
     */
    @PostMapping("/add")
    public Student save(Student student){
        return studentService.save(student);
    }

    /**
     * 删除信息
     * @param id
     * 使用 RESTful规范
     */

    @GetMapping("/delete/{id}")
    public  String deleteById(@PathVariable Integer id){

        studentService.deleteStudentById(id);
        return "<h2>删除成功</h2>";
    }

    /**
     * 更新信息
     * @param student
     * @return
     */
    @PostMapping("/update")
    public Student update(Student student){

        return studentService.update(student);
    }

/**
*分页操作
*
*/
    @GetMapping("/query")
    public Page<Student> findByPage(Integer page, HttpServletResponse httpServletResponse){
        httpServletResponse.setHeader("Access-Control-Allow-Origin","*");

        if (page==null || page<=0){
            page = 0;
        }else {
            page = page-1;
        }
        return studentService.findAll(page,5);
    }
}

   在controller层中,我们对于各个功能的实现一定要明白使用Get方式还是Post方式进行操作,否则就会出现服务器内部错误等等。

三、 RESTful规范

  REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,Roy Fielding是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。

RESTful教程
使用Restful规范前:
http://localhost:8888/student/findStudentById?id=3
使用规范后:
http://localhost:8888/student/findStudentById/3

四、注意

  在项目的各个功能实现过程中,由于其中含有很多的同名方法和jar包,所以我们在编程过程中一定要注意用对jar包,不要因为导错jar包而给我们增加工作量

相关文章: