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哦
{
"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表
用户: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的整合,但是限于篇幅,暂时就算了,下回再开。