课程表

Spring Boot课程

工具箱
速查手册

Boot 使用JPA连接数据库

当前位置:免费教程 » Java相关 » Spring Boot
注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2019/7/24 16:08:06

本篇介绍使用JPA连接MySQL数据库并实现CURD(增删改查),通过各种CURD,我们就能构建一个基本完整的Web应用程序了!

一、准备

在学习本篇之前,首先,你的机器上要安装MySQL,如果你还没有安装,请参考我们的MySQL教程的安装这一章节。安装MySQL后,最好有可视化的管理工具,这里推荐“Navicat for MySQL”这一工具,非常好用,不但可以用来进行MySQL的可视化管理,而且还能用来进行数据库建模。具体得下载地址自行去网上搜索,这里不便提供。


二、配置

一切就绪之后,我们要做什么?首先,我们需要修改pom.xml,以便引入相关的依赖包。打开pom.xml,在<dependencies>大节,加入如下依赖:

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

然后,我们需要在yml文件中配置数据库连接的相关信息。目前,有第三方的数据库连接池,比如阿里巴巴提供的、已经开源的Druid连接池,可以监控所有的SQL语句的运行效率等,当然也需要对服务器进行相关配置。本章节介绍基本的数据库连接和使用,暂时不使用第三方连接池进行连接。

在application.yml文件的spring大节(如果没有则添加一个),再添加datasource子节

datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/w3xuedb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
  username: root
  password: yourPassword  #这里替换为你的密码

“driver-class-name”是驱动类的名字;url是数据库的链接字符串地址,其中“w3xuedb”是数据库名字,其后缀的一系列参数通过其字面也可以理解出来,这里不赘述,照样子加上去即可;底下的username和password分别是数据库连接名和连接密码(这里需要把“yourPassword  ”替换成你自己的MySQL密码)。如果发现“com.mysql.jdbc.Driver”是红字,那么,在pom.xml中,把mysql的依赖改一下,把<scope>的值改为你安装的mysql 数据库的版本号即可:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>8.0.13</scope>
</dependency>

在yml里面的文字变成正常黑色后,再把<scope>的值改回“runtime”,以防止不同的机器上安装的mysql版本不同导致错误。

大家可能这时在想,这个数据库中,表的结构怎么办?Spring Boot中,提供一种快速的建表的方法。在application.yml文件的spring大节,添加如下子节:

jpa:
  hibernate:
    ddl-auto: update
  show-sql: true

这个“jpa子节是和本章节之前提到的“datasource”子节是兄弟节。有了这个配置,Spring Boot就会根据你的实体类中的各个类属性,自动在数据库里添加相关表字段。这个配置会随时更改表结构,因此,我们一般不建议使用,或者,在使用完后,关闭掉,接下来用SQL或者“Navicat for MySQL”这一类可视化工具更改表结构。


三、实体类

现在,我们首先来建立一个实体类。这里,我们把这个类的文件名设定为“MainBean”,全部代码如下:

package com.w3xue.jiaocheng;

import javax.persistence.*;

@Entity //表明这是一个实体类
@Table(name = "t_w3xue_student") //指定一个表名
public class MainBean {
    //自增ID
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //意思是把Hibernate提供的主键生成策略设置为identity (即自增)
    @Column(name = "f_id", nullable = false, updatable = false) //对应表列为“f_id”,该列不可为空,不可更新
    private Integer id; //设定属性名为“id”,为Integer 类型,MySQL表里,会建立一个“int”类型的字段,下同

    @Column(nullable = true, name = "f_name") //对应表列为“f_name”,该列可以为空,下同
    private String name; //设定属性名为“id”,为String 类型,MySQL表里,会建立一个长度为255的“varchar”类型的字段,下同
    @Column(nullable = true, name = "f_age")
    private Integer age;
    @Column(nullable = true, name = "f_grade")
    private String grade;
    @Column(nullable = true, name = "f_class")
    private String studentClass;
    @Column(nullable = true, name = "f_parent_name")
    private String parent_name;
    @Column(nullable = true, name = "f_parent_mobilephone")
    private String parent_moblephone;

    //需要声明无参数的构造函数
    public MainBean() {
    }

    //以下为声明get-set函数部分
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String Name) {
        this.name = Name;
    }

    public String getGrade() {
        return grade;
    }
    public void setGrade(String Grade) {
        this.grade = Grade;
    }

    public Integer getAge() {
        return age;
    }
    public void setAge(Integer Age) {
        this.age = Age;
    }

    public String getStudentClass() {
        return studentClass;
    }
    public void setStudentClass(String StudentClass) {
        this.studentClass = StudentClass;
    }

    public String getParent_name() {
        return parent_name;
    }
    public void setParent_name(String Parent_name) {
        this.parent_name = Parent_name;
    }

    public String getParent_moblephone() {
        return parent_moblephone;
    }

    public void setParent_moblephone(String Parent_moblephone) {
        this.parent_moblephone = Parent_moblephone;
    }
}

可以看出,这个类主要分为3大部分:第一部分是声明这个类的所有属性(成员变量),第二部分是构造函数,第三部分是get-set函数,另外,还有穿插其中的各个注解。这里,大部分代码都已经在注释中进行了详细解释,相信有Java基础的你一定不难看懂。

建立这样一个实体类之后,如果你如上一小节所述,在yml文件里配置了“ddl-auto: update”,那么再运行程序时,数据库里就会多出“t_w3xue_student”这个表,其相关表字段,就是你在这个实体类里面设置的各个成员变量。


四、Dao和Service层

有了实体类,我们还需要2个类:一个数据仓库类(Dao层),他们是连接数据库的桥梁,还有一个是service层的类。下面,我们分别建立这样的2种类。

首先是MainDao类的代码,在包中新建该类,代码如下:

package com.w3xue.jiaocheng;

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

@Repository
public interface MainDao extends JpaRepository<MainBean, Integer> {

}

然后是MainService接口,这里为什么是接口呢?从面向对象的角度说,接口可以提供了一种标准,可以方便很多类去使用,虽然本教程只有一个类继承自该接口,我们也强烈建议你养成好习惯,先建一个这样的接口,然后再建一个MainServiceImpl类来继承它。以下是MainService接口的代码

package com.w3xue.jiaocheng;

import com.w3xue.jiaocheng.MainBean;

public interface MainService {

    boolean addMain(MainBean mainBean);

    MainBean getMainById(Integer id);

    boolean updateMain(MainBean mainBean);

    boolean delMain(Integer id);

}

下面是继承MainService接口MainServiceImpl类的代码:

package com.w3xue.jiaocheng;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Service
public class MainServiceImpl implements MainService {
    @Autowired
    private MainDao mainDao;
    @PersistenceContext
    EntityManager em;

    @Override
    public boolean addMain(MainBean mainBean) {
        boolean flag = false;
        try {
            mainDao.save(mainBean);
            flag = true;
        } catch (Exception e) {
            System.out.println("新增失败!");
            e.printStackTrace();
        }
        return flag;
    }

    //更新
    @Override
    public boolean updateMain(MainBean mainBean) {
        boolean flag = false;
        try {
            mainDao.save(mainBean);
            flag = true;
        } catch (Exception e) {
            System.out.println("更新失败!");
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    //单个查找
    @Override
    public MainBean getMainById(Integer id) {
        return mainDao.findById(id).get();
    }

    //删除单个
    @Override
    public boolean delMain(Integer id) {
        boolean flag = false;
        try {
            MainBean main = new MainBean();
            main = mainDao.findById(id).get();//.orElse(null);
            mainDao.delete(main);
            flag = true;
        } catch (Exception e) {
            System.out.println("删除失败!");
            e.printStackTrace();
        }
        return flag;
    }

}

好了,万事俱备,让我们来开始调用数据。


五、Controller层调用数据

我们在MainRestController类里面,加上这样一个路由和方法:

@RequestMapping(value="/jpatest",method= RequestMethod.GET)
public String jpaTest() {
    MainBean mbStudent = new MainBean();  //申明一个主类的变量
    mbStudent.setName("张三");  //设置姓名
    mbStudent.setAge(8);
    mbStudent.setGrade("二年级");
    mbStudent.setStudentClass("三班");
    mbStudent.setParent_name("张无忌"); //设置父母姓名
    mbStudent.setParent_moblephone("18899998888");
    try
    {
        mainServiceImpl.addMain(mbStudent); //调用service层的addMain方法,并把刚才申明的主类变量“mbStudent”作为参数
        return "添加学生"+mbStudent.getName()+"成功";
    }
    catch (Exception e)  //一旦出错则返回提示
    {
        mainServiceImpl.addMain(mbStudent);
        return "添加学生"+mbStudent.getName()+"失败";
    }
}

大部分代码的作用,已经作为注释标明了。这段代码的作用顺序是:申明主类的变量,然后设置成员变量的值,并最终将其作为一个参数,传给service层的addMain方法,而service层的addMain方法调用的是Dao层的save方法,而它是来自CrudRepository类的方法。Dao层的类(MainDao类)继承JpaRepository类,而JpaRepository类继承自CrudRepository类具体的继承关系如下:

1.jpg

运行程序,访问“http://localhost:8080/jiaocheng/jpatest”,不出意外,会出现添加成功的提示:

添加学生张三成功

而数据库里已经多了这样一条数据。

这样,我们就用Spring Boot完成了第一个连接MySQL数据库,并添加数据的实例。

注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2019/7/24 16:08:06