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

一、 使用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

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、项目结构

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方式进行操作,否则就会出现服务器内部错误等等。

三、注意

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

本文介绍了SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页如果想了解更多相关内容请查看下面的相关链接

(0)

相关推荐

  • SpringBoot连接MYSQL数据库并使用JPA进行操作

    今天给大家介绍一下如何SpringBoot中连接Mysql数据库,并使用JPA进行数据库的相关操作. 步骤一:在pom.xml文件中添加MYSQl和JPA的相关Jar包依赖,具体添加位置在dependencies中,具体添加的内容如下所示. <!--数据库相关配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • SpringBoot入门系列之JPA mysql

    一,准备工作,建立spring-boot-sample-mysql工程 1.http://start.spring.io/ A.Artifact中输入spring-boot-sample-MySQL      B.勾选Web下的web      C.勾选SQL下的JPA MYSQL 2.Eclips中导入工程spring-boot-sample-mysql A.解压快捷工程spring-boot-sample-mysql到某文件夹 B.eclips中file->import->Import E

  • springboot使用spring-data-jpa操作MySQL数据库

    我们在上一篇搭建了一个简单的springboot应用,这一篇将介绍使用spring-data-jpa操作数据库. 新建一个MySQL数据库,这里数据库名为springboot,建立user_info数据表,作为我们示例操作的表对象. user_info信息如下: DROP TABLE IF EXISTS `user_info`; CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(

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

    一. 使用Springboot+Jpa实现对mysql数据库的增删改查和分页功能 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 使用Springboot和jpa对数据库进行操作时,能够大大减少我们的工作量,在jpa中,已经在底层封装好了增删查的功能和sql语句,可以使我们进行快速开发 二.项目过程和配置文件 1.applaction.properties文件配置

  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    首先新建一个简单的数据表,通过操作这个数据表来进行演示 DROP TABLE IF EXISTS `items`; CREATE TABLE `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `name` varchar(10) DEFAULT NULL, `detail` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE

  • Java中SSM框架实现增删改查功能代码详解

    记录一下自己第一次整合smm框架的步骤. 参考博客和网站有:我没有三颗心脏 How2J学习网站 1.数据库使用的是mySql,首先创建数据库ssm1,并创建表student create database ssm1; use ssm1; CREATE TABLE student( id int(11) NOT NULL AUTO_INCREMENT, student_id int(11) NOT NULL UNIQUE, name varchar(255) NOT NULL, age int(1

  • Hibernate中Session增删改查操作代码详解

    把三状态转换图放在这,方便分析方法的作用: 1.Session的save()方法 Session是Hibernate所有接口中最重要的接口,提供了对数据保存,更新,查询和删除的方法. Session的save()方法可以使临时态或游离态转换为持久态.例如,保存一个Customer对象: SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFacto

  • JavaWeb JDBC + MySql 通讯录实现简单的增删改查功能案例详解

    本文实例讲述了JavaWeb JDBC + MySql 通讯录实现简单的增删改查功能.分享给大家供大家参考,具体如下: 开发工具:Eclipse + Navicat 项目源码:Github:https://github.com/Sunjinhang/JavaWeb 一.新建项目 在Eclipse中新建一个Web项目,至于如何新建Web项目以及如何添加Tomcat服务器的就不赘述了,项目的目录如下 最终实现的效果如下所示: 点击新增可以进行联系人的新增,点击修改/删除可以进行 联系人的修改和删除

  • thinkPHP数据库增删改查操作方法实例详解

    本文实例讲述了thinkPHP数据库增删改查操作方法.分享给大家供大家参考,具体如下: thinkphp对数据库增删改查进行了封装操作,使得使用更加方便,但是不一定灵活. 可以用封装的用,需要写sql,可以执行sql. 1.原始的 $Model = new Model(); // 实例化一个model对象 没有对应任何数据表 $insert_sql = "INSERT INTO sh_wxuser_collection (user_id,store_id,good_id,addtime) VAL

  • Hibernate中实现增删改查的步骤详解

    1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获取的方法, 可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间,解放编程人员95%的任务. 2.什么是ORM  Object-Relational-Mapping对象关系映射 ORM:是通过java对象映射到数据库表,通过操作Java对象可以完成对数据表的操作.(假如你用的是Dbutils那么还需要在Java类中写sq

  • java连接mongoDB并进行增删改查操作实例详解

    本文实例讲述了java连接mongoDB并进行增删改查操作.分享给大家供大家参考,具体如下: 1.安装 MongoDB JDBC驱动程序 在java中使用mongoDB之前,首先需要拥有java连接mongoDB的第三方驱动包(jar包) 1)maven项目可通过在pom.xml中添加依赖 <dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-ja

  • java 数据库连接与增删改查操作实例详解

    本文实例讲述了java 数据库连接与增删改查操作.分享给大家供大家参考,具体如下: 1.设置数据库的基本配置信息 package mysql; //数据库配置资源连接 public final class DbConfig { //数据库资源 指定所使用的数据库类型 地址 端口 数据库名称 编码格式 public final static String dbUrl = "jdbc:mysql://localhost:3306/database_name?useUnicode=true&c

  • django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】

    本文实例讲述了django框架使用views.py函数对表进行增删改查内容操作.分享给大家供大家参考,具体如下: models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True),  OneToOneField("Author") 一对多:ForeignKey(to="Publish",to_field="id",on_delete.CASCADE) 多对多:ManyToMany

随机推荐