1. 程式人生 > >Spring Cloud+Vue簡單模仿微博四:服務提供者整合Hibernate以及設計資料庫

Spring Cloud+Vue簡單模仿微博四:服務提供者整合Hibernate以及設計資料庫

一、建立資料庫

暫時先建立一個使用者表

/*
Navicat MySQL Data Transfer

Source Server         : MyDB
Source Server Version : 50549
Source Host           : localhost:3306
Source Database       : microblog

Target Server Type    : MYSQL
Target Server Version : 50549
File Encoding         : 65001

Date: 2018-10-27 18:27:40
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `userinfo`
-- ----------------------------
DROP TABLE IF EXISTS `userinfo`;
CREATE TABLE `userinfo` (
  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Email` varchar(20) CHARACTER SET utf8 NOT NULL,
  `Password` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `Nickname` varchar(30) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `Production` varchar(80) CHARACTER SET utf8 DEFAULT NULL,
  `Level` int(11) NOT NULL,
  `Createtime` datetime NOT NULL,
  `Gender` bit(1) DEFAULT NULL,
  `Birthday` datetime DEFAULT NULL,
  `Islove` bit(1) DEFAULT NULL,
  `Province` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
  `City` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
  `University` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `Isdelete` bit(1) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of userinfo
-- ----------------------------
INSERT INTO `userinfo` VALUES ('1', '
[email protected]
', '123456', '風一般的少年', '無', '1', '2018-10-25 22:59:12', '', '1996-12-01 22:59:23', '1', '江蘇省', '常州市', '常州大學', '');

二、整合hibernate

1、新增依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.49</version>
</dependency>

2、配置檔案application.yml

server:
  port: 2000
spring:
  application:
    name: provide-service
  datasource:
    url: jdbc:mysql://localhost:3306/microblog
    username: root
    password: 123456
    driverClassName: com.mysql.jdbc.Driver
    tomcat:
      max-active: 20
      max-idle: 8
      min-idle: 8
      initial-size: 10
  jpa:
    database: MYSQL
    showSql: true
    hibernate:
      ddl-auto: update
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/

3、啟動類添加註解

@SpringBootApplication
@EnableDiscoveryClient
@EnableJpaRepositories("eurekaclient.provider.dao")
@EntityScan("eurekaclient.provider.entity")
@EnableScheduling
public class ProviderApplication {

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

分別是對dao、entity的scan

4、新增entity包與UserInfo實體類

package eurekaclient.provider.entity;



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

@Entity
@Table(name="userinfo")
public class UserInfo implements Serializable {
    private static final long serialVersionUID = -3946734305303957850L;

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

    @Column(name="Email",nullable = false)
    private String Email;

    @Column(name = "Password")
    private String Password;
    @Column(name = "Nickname",nullable = false)
    private String Nickname;
    @Column(name = "Production")
    private String Production;

    @Column(name = "Level",nullable = false)
    private Integer Level;
    @Column(name = "Createtime",nullable = false)
    private Date Createtime;
    @Column(name = "Gender")
    private Boolean Gender;
    @Column(name = "Birthday")
    private Date Birthday;
    @Column(name = "Islove")
    private Boolean Islove;
    @Column(name="Province")
    private String Province;
    @Column(name = "City")
    private String City;


    @Column(name = "University")
    private String University;

    @Column(name = "Isdelete",nullable = false)
    private Boolean Isdelete;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmail() {
        return Email;
    }

    public void setEmail(String email) {
        Email = email;
    }

    public String getPassword() {
        return Password;
    }

    public void setPassword(String password) {
        Password = password;
    }

    public String getNickname() {
        return Nickname;
    }

    public void setNickname(String nickname) {
        Nickname = nickname;
    }

    public String getProduction() {
        return Production;
    }

    public void setProduction(String production) {
        Production = production;
    }

    public Integer getLevel() {
        return Level;
    }

    public void setLevel(Integer level) {
        Level = level;
    }

    public Date getCreatetime() {
        return Createtime;
    }

    public void setCreatetime(Date createtime) {
        Createtime = createtime;
    }

    public Boolean getGender() {
        return Gender;
    }

    public void setGender(Boolean gender) {
        Gender = gender;
    }

    public Date getBirthday() {
        return Birthday;
    }

    public void setBirthday(Date birthday) {
        Birthday = birthday;
    }

    public Boolean getIslove() {
        return Islove;
    }

    public void setIslove(Boolean islove) {
        Islove = islove;
    }

    public String getProvince() {
        return Province;
    }

    public void setProvince(String province) {
        Province = province;
    }

    public String getCity() {
        return City;
    }

    public void setCity(String city) {
        City = city;
    }

    public String getUniversity() {
        return University;
    }

    public void setUniversity(String university) {
        University = university;
    }

    public Boolean getIsdelete() {
        return Isdelete;
    }

    public void setIsdelete(Boolean isdelete) {
        Isdelete = isdelete;
    }
}

5、新增dao包與UserInfoDao介面

package eurekaclient.provider.dao;

import eurekaclient.provider.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UserInfoDao extends JpaRepository<UserInfo,Long> {
    @Query("select user from UserInfo user where user.Email=:Email")
    UserInfo GetUserByEmail(@Param("Email") String Email);
}

6、新增service包與UserService介面

package eurekaclient.provider.service;

import eurekaclient.provider.entity.UserInfo;


public interface UserService {
    UserInfo GetByEmail(String Email);

    boolean CheckLogin(String Email,String Password);

    void sendSimpleEmail(String to, String subject, String content);
}

7、在service包中新增serviceimpl以及UserServiceImpl介面實現類

package eurekaclient.provider.service.serviceimpl;

import eurekaclient.provider.dao.UserInfoDao;
import eurekaclient.provider.entity.UserInfo;
import eurekaclient.provider.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserInfoDao userInfoDao;
    @Override
    public UserInfo GetByEmail(String Email) {
        return userInfoDao.GetUserByEmail(Email);
    }

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender mailSender;

    @Value("${mail.fromMail.addr}")
    private String from;

    @Override
    public boolean CheckLogin(String Email, String Password) {
        UserInfo userInfo=GetByEmail(Email);
        if (userInfo.getPassword().equals(Password)){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public void sendSimpleEmail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();//建立簡單郵件訊息
        message.setFrom(from);//設定傳送人
        message.setTo(to);//設定收件人

        message.setSubject(subject);//設定主題
        message.setText(content);//設定內容
        try {
            mailSender.send(message);//執行傳送郵件
            logger.info("簡單郵件已經發送。");
        } catch (Exception e) {
            logger.error("傳送簡單郵件時發生異常!", e);
        }
    }


}

如郵件方法不可用,可自行刪除,後續會完善!

8、新增controller以及UserController

package eurekaclient.provider.controller;

import eurekaclient.provider.entity.UserInfo;
import eurekaclient.provider.service.UserService;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@RequestMapping("/provider/user")
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping(value="/getUser",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public UserInfo GetAll(@RequestParam(value = "email") String email){
        return userService.GetByEmail(email);
    }

    @GetMapping(value="/checkLogin",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public boolean CheckLogin(@RequestParam(value = "email") String email,@RequestParam(value = "pass") String pass){
        return userService.CheckLogin(email,pass);
    }


}

OK,至此,服務提供類已經繼承hibernate。

三、消費者編寫消費者服務

1、建立service包、serviceimpl子包,編寫UserService介面以及UserServiceImpl實現類

UserService程式碼如下

package eurekaclient.consumer.service;

import eurekaclient.consumer.service.serviceimpl.UserServiceImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value="PROVIDE-SERVICE",fallback = UserServiceImpl.class)
public interface UserService {
    @GetMapping(value = "/provider/user/getUser")
    String getUserByEmail(@RequestParam("email") String email);
    @GetMapping(value = "/provider/user/checkLogin")
    String checkLogin(@RequestParam(value = "email") String email,@RequestParam(value = "pass") String pass);
}

UserSeriviceImpl程式碼如下

package eurekaclient.consumer.service.serviceimpl;

import eurekaclient.consumer.entity.ResultMsg;
import eurekaclient.consumer.service.UserService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class UserServiceImpl implements UserService {

    @Override
    public String getUserByEmail(String email) {
        return new ResultMsg("error","","出錯了,請重試").toString();
    }

    @Override
    public String checkLogin(String email, String pass) {
        return new ResultMsg("error","","登入出錯,請重試").toString();
    }
}

實現類中主要編寫熔斷降級的方法

2、建立請求結果資訊類

建立entity包並建立ResultMsg類

package eurekaclient.consumer.entity;

public class ResultMsg {
    private String state;//狀態 ok,error
    private String msg;//訊息
    private String errorMsg;//錯誤資訊

    public ResultMsg(String state, String msg, String errorMsg) {
        this.state = state;
        this.msg = msg;
        this.errorMsg = errorMsg;
    }

    @Override
    public String toString() {
        return "{" +
                "state:'" + state + '\'' +
                ", msg:'" + msg + '\'' +
                ", errorMsg:'" + errorMsg + '\'' +
                '}';
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}

3、建立控制器包與UserController類

package eurekaclient.consumer.controller;

import eurekaclient.consumer.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;

    @GetMapping(value="/getUser",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public String GetAll(@RequestParam(value = "email") String email){
        return userService.getUserByEmail(email);
    }

    @GetMapping(value="/checkLogin",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
        public String CheckLogin(@RequestParam(value = "email") String email,@RequestParam(value = "pass") String pass){
        return userService.checkLogin(email,pass);
    }
}

OK,至此我們已經可以從閘道器處訪問我們的服務並讀取資料庫了。