SpringBoot在数据库整合方面支持很强大,可以用mybatis,也可以用hibernate,本文是使用Hibernate+JPA的方式访问,数据库选择MYSQL

  • 操作系统:Mac
  • 技术栈:Hibernate+JPA
  • 数据库:MYSQL(利用Docker)

 

一、安装数据库MySQL(利用Docker)

    数据库的安装其实不是重点,但是这边我想顺便给大家安利一下Docker在搭建开发环境的作用。大家都知道Docker主要用于软件的打包和自动化的部署,但是用得恰到好处,对于开发环境的搭建非常便利,安装Redis,Mysql,消息服务RabbitMq,等等。。一键搞定。下一步我们就开始吧。

    1 .安装docker的运行环境,这个建议大家按照官网推荐的方式,在自己的操作系统上安装。其安装步骤看https://hub.docker.com/?overlay=onboarding  官方教程,非常简单。Mac安装成功后在顶部的导航栏会看到Docker的图标哦 。

    2 . 安装Mysql并配置环境,我们只是要简单的使用Docker来进行开发,所以我们只要简单的会几个命令就可以了。比如:

  •     docker search mysql  搜索mysql,也可以把mysql替换成redis等等
  •    从检索出来的列表选择一个版本安装,这里我选择 centos/mysql-57-centos7 这个版本,执行docker pull centos/mysql-57-centos7
  •    此时如果拉取速度太慢,可以到doker配置一下国内的镜像mirror,从上面导航栏内点开docker图标,并进入Preferences,然后再Docker Engine中配置镜像,配置完成后记得重启Docker哦

          

hibernate在spring boot中配置dml_spring

      

{
  "debug": true,
  "experimental": false,
  "registry-mirrors": [
    "https://md4nbj2f.mirror.aliyuncs.com"
  ]
}

    3.  下一步就可以从docker来启动我们的mysql

docker run -p 3306:3306 --name mysql -v /Users/li/Documents/docker/mysql:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d centos/mysql-57-centos7

    这里稍微解释一下各个参数:

  • -p  本地端口:Docker端口,本地端口和Docker端口的映射,这里代表我们可以通过本地的localhost:3306来访问到Docker内的mysql服务
  •  --name 给这个docker起个别名
  •  -v  本地文件夹:docker内文件夹,也是一种映射,这个映射使得Docker内部的数据库文件夹/etc/mysql能够和mac上的本地文件夹绑定,我们创建的数据库就会放在这个本地文件夹内,这样每次启动docker的时候不至于数据库都清空,如果不配置的话,docker会自动启用一个temp文件夹来存放,并且在每次端口后删除那个temp,我们作本地开发很显然不能让数据库次次消失,所以这个配置很重要的
  • -e  给启动的docker服务配置环境变量,这里我们配置 了数据库的密码 MYSQL_ROOT_PASSWORD=123456
  • -d  启动的docker镜像,也就是上面pull下来的镜像

  至此,我们的mysql就算是配置完成了,我们可以在Docker的Dashboard中看到这个启动的服务,同时也可以在mac中使用navicat对mysql进行连接和操作。

 


二、使用SpringBoot-jpa连接MYSQL

SpringBoot把对JPA的使用进行了封装,简化了这个配置,基础的应用我们只要用它提供的默认选项就可以进行简单的连接了。

 

1、我们第一步要取消之前关闭的JPA自动配置,到DemoApplication中去掉 对DataSourceAutoConfiguration.class的exclude,同时开启JPA和事务管理。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;


//暂时关闭Security
@SpringBootApplication(exclude= {
		SecurityAutoConfiguration.class
})
//启动JPA及其事务管理
@EnableJpaRepositories
@EnableTransactionManagement
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

2、我们简单的设计一下测试数据表,并在MYSQL中创建数据库,我们可以用Navicat Premium连接Docker的Mysql,并创建一个table,假设是demo表

hibernate在spring boot中配置dml_java_02

  用户:User表,字段:id,username,nickname,headimg,age

   文章:Article表,字段:id,title,content,thumb,author_id(关联到user)

3、创建实体类以及对应的Repositor

  • 创建2个包,com.example.demo.dao.entity  com.example.demo.dao.repository
  • 在entity中创建实体类 User,Article,在repository中创建接口:UserRepository,ArticleRepository
package com.example.demo.dao.entity;

import com.fasterxml.jackson.annotation.JsonBackReference;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

//标记为实体类
@Entity
//使用lombok自动产出getter  setter,注意安装lombok插件
@Data
//一般都要实现序列化接口
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @Column(columnDefinition = "varchar(200) comment'用户名' ")
    private String username;

    @Column(columnDefinition = "varchar(200) comment'昵称' ")
    private String nickname;

    @Column(columnDefinition = "varchar(200) comment'头像' ")
    private String headimg;

    @Column(columnDefinition = "int(11) default 0 comment'年龄' ")
    private Integer age;

    // author代表在article中User的字段名
    @OneToMany(mappedBy = "author")
    //防止JSON无限循环调用
    @JsonBackReference
    private List<Article> articleList;
}
package com.example.demo.dao.entity;

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;

//标记为实体类
@Entity
//使用lombok自动产出getter  setter,注意安装lombok插件
@Data
//一般都要实现序列化接口
public class Article implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @Column(columnDefinition = "varchar(200) comment'内容'")
    private String content;

    @Column(columnDefinition = "varchar(200) comment'标题'")
    private String title;

    @ManyToOne
    //表示对应子表的关联外键
    @JoinColumn(name = "author_id")
    private User author;
}

在Repository下创建Repository

package com.example.demo.dao.repository;

import com.example.demo.dao.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
}
package com.example.demo.dao.repository;

import com.example.demo.dao.entity.Article;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ArticleRepository extends JpaRepository<Article,Long> {
}

         最后配置application.properties,开启JPA的配置和数据库配置

#引入数据库配置
database.name = demo
database.user = root
database.password = 123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/${database.name}?charset=utf8mb4&useSSL=false&characterEncoding=utf8
spring.datasource.username=${database.user}
spring.datasource.password=${database.password}


# JPA 相关配置
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create
  • 至此一切准备就绪,我们可以测试一下repository是否可以工作,在TestController加入几个测试
package com.example.demo;


import com.example.demo.dao.entity.Article;
import com.example.demo.dao.entity.User;
import com.example.demo.dao.repository.ArticleRepository;
import com.example.demo.dao.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    UserRepository userRepository;
    @Autowired
    ArticleRepository articleRepository;

    @GetMapping("/user")
    public  String testUser(){
        User user = new User();
        user.setAge(1);
        user.setHeadimg("头像地址");
        user.setNickname("测试昵称");
        user.setUsername("user-test-1");
       user =   userRepository.save(user);
       return user.getNickname();
    }

    @GetMapping("/article")
    public Article saveArticle(){
        User user = userRepository.findById(1l).get();
        Article article = new Article();
        article.setAuthor(user);
        article.setTitle("标题");
        article.setContent("这是文章内容哦");
        articleRepository.save(article);
        return article;
    }

}

 

运行浏览器依次访问   localhost:8080/test/user  ,  localhost:8080/test/article

 

三、我们最后总结一下整合JPA的几个步骤

1、配置application.properties中DataSource,jpa,hibernate等

2、在启动类中开启@EnableJpaRepositories,@EnableTransactionManagement

3、创建相关的实体类及其Repsitory,SpringJpa提供的基础Repository拥有许多魔术方法,可以参考下面这个网站:

4、原来打算在这篇中加入SpringTest的整合,但是限于篇幅,暂时就算了,下回再开。