课程表

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>大节,加入如下依赖:

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>mysql</groupId>
  7.     <artifactId>mysql-connector-java</artifactId>
  8.     <scope>runtime</scope>
  9. </dependency>

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

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

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

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

  1. <dependency>
  2.     <groupId>mysql</groupId>
  3.     <artifactId>mysql-connector-java</artifactId>
  4.     <scope>8.0.13</scope>
  5. </dependency>

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

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

  1. jpa:
  2.   hibernate:
  3.     ddl-auto: update
  4.   show-sql: true

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


三、实体类

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

  1. package com.w3xue.jiaocheng;
  2.  
  3. import javax.persistence.*;
  4.  
  5. @Entity //表明这是一个实体类
  6. @Table(name = "t_w3xue_student") //指定一个表名
  7. public class MainBean {
  8.     //自增ID
  9.     @Id
  10.     @GeneratedValue(strategy = GenerationType.IDENTITY) //意思是把Hibernate提供的主键生成策略设置为identity (即自增)
  11.     @Column(name = "f_id", nullable = false, updatable = false) //对应表列为“f_id”,该列不可为空,不可更新
  12.     private Integer id; //设定属性名为“id”,为Integer 类型,MySQL表里,会建立一个“int”类型的字段,下同
  13.  
  14.     @Column(nullable = true, name = "f_name") //对应表列为“f_name”,该列可以为空,下同
  15.     private String name; //设定属性名为“id”,为String 类型,MySQL表里,会建立一个长度为255的“varchar”类型的字段,下同
  16.     @Column(nullable = true, name = "f_age")
  17.     private Integer age;
  18.     @Column(nullable = true, name = "f_grade")
  19.     private String grade;
  20.     @Column(nullable = true, name = "f_class")
  21.     private String studentClass;
  22.     @Column(nullable = true, name = "f_parent_name")
  23.     private String parent_name;
  24.     @Column(nullable = true, name = "f_parent_mobilephone")
  25.     private String parent_mobilephone;
  26.  
  27.     //需要声明无参数的构造函数
  28.     public MainBean() {
  29.     }
  30.  
  31.     //以下为声明get-set函数部分
  32.     public Integer getId() {
  33.         return id;
  34.     }
  35.     public void setId(Integer id) {
  36.         this.id = id;
  37.     }
  38.  
  39.     public String getName() {
  40.         return name;
  41.     }
  42.     public void setName(String Name) {
  43.         this.name = Name;
  44.     }
  45.  
  46.     public String getGrade() {
  47.         return grade;
  48.     }
  49.     public void setGrade(String Grade) {
  50.         this.grade = Grade;
  51.     }
  52.  
  53.     public Integer getAge() {
  54.         return age;
  55.     }
  56.     public void setAge(Integer Age) {
  57.         this.age = Age;
  58.     }
  59.  
  60.     public String getStudentClass() {
  61.         return studentClass;
  62.     }
  63.     public void setStudentClass(String StudentClass) {
  64.         this.studentClass = StudentClass;
  65.     }
  66.  
  67.     public String getParent_name() {
  68.         return parent_name;
  69.     }
  70.     public void setParent_name(String Parent_name) {
  71.         this.parent_name = Parent_name;
  72.     }
  73.  
  74.     public String getParent_mobilephone() {
  75.         return parent_mobilephone;
  76.     }
  77.  
  78.     public void setParent_mobilephone(String Parent_mobilephone) {
  79.         this.parent_mobilephone = Parent_mobilephone;
  80.     }
  81. }

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

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


四、Dao和Service层

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

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

  1. package com.w3xue.jiaocheng;
  2.  
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5.  
  6. @Repository
  7. public interface MainDao extends JpaRepository<MainBean, Integer> {
  8.  
  9. }

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

  1. package com.w3xue.jiaocheng;
  2.  
  3. import com.w3xue.jiaocheng.MainBean;
  4.  
  5. public interface MainService {
  6.  
  7.     boolean addMain(MainBean mainBean);
  8.  
  9.     MainBean getMainById(Integer id);
  10.  
  11.     boolean updateMain(MainBean mainBean);
  12.  
  13.     boolean delMain(Integer id);
  14.  
  15. }

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

  1. package com.w3xue.jiaocheng;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.PersistenceContext;
  7.  
  8. @Service
  9. public class MainServiceImpl implements MainService {
  10.     @Autowired
  11.     private MainDao mainDao;
  12.     @PersistenceContext
  13.     EntityManager em;
  14.  
  15.     @Override
  16.     public boolean addMain(MainBean mainBean) {
  17.         boolean flag = false;
  18.         try {
  19.             mainDao.save(mainBean);
  20.             flag = true;
  21.         } catch (Exception e) {
  22.             System.out.println("新增失败!");
  23.             e.printStackTrace();
  24.         }
  25.         return flag;
  26.     }
  27.  
  28.     //更新
  29.     @Override
  30.     public boolean updateMain(MainBean mainBean) {
  31.         boolean flag = false;
  32.         try {
  33.             mainDao.save(mainBean);
  34.             flag = true;
  35.         } catch (Exception e) {
  36.             System.out.println("更新失败!");
  37.             e.printStackTrace();
  38.             flag = false;
  39.         }
  40.         return flag;
  41.     }
  42.  
  43.     //单个查找
  44.     @Override
  45.     public MainBean getMainById(Integer id) {
  46.         return mainDao.findById(id).get();
  47.     }
  48.  
  49.     //删除单个
  50.     @Override
  51.     public boolean delMain(Integer id) {
  52.         boolean flag = false;
  53.         try {
  54.             MainBean main = new MainBean();
  55.             main = mainDao.findById(id).get();//.orElse(null);
  56.             mainDao.delete(main);
  57.             flag = true;
  58.         } catch (Exception e) {
  59.             System.out.println("删除失败!");
  60.             e.printStackTrace();
  61.         }
  62.         return flag;
  63.     }
  64.  
  65. }

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


五、Controller层调用数据

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

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

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

1.jpg

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

  1. 添加学生张三成功

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

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

注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2019/7/24 16:08:06
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号