Boot 使用JPA连接数据库
注意:本页面内容为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_mobilephone;
- //需要声明无参数的构造函数
- 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_mobilephone() {
- return parent_mobilephone;
- }
- public void setParent_mobilephone(String Parent_mobilephone) {
- this.parent_mobilephone = Parent_mobilephone;
- }
- }
可以看出,这个类主要分为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_mobilephone("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类,具体的继承关系如下:
运行程序,访问“http://localhost:8080/jiaocheng/jpatest”,不出意外,会出现添加成功的提示:
- 添加学生张三成功
而数据库里已经多了这样一条数据。
这样,我们就用Spring Boot完成了第一个连接MySQL数据库,并添加数据的实例。
注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue 发布时间:2019/7/24 16:08:06