详解springboot+dubbo+zookeeper访问数据库(附sql练习)

	本篇开始之前,如果你没有搭建好远程调用的环境,请参考我的另一篇文章搭建一下:
	https://blog.csdn.net/weixin_45433191/article/details/105236815
														----  都很简单,没有什么难度

文章最后我会分享一些数据库的练习,帮助各位练习sql的使用

我们最终的目的是使用springboot+dubbo+zookeeper的方式去调用到数据库即可,本文章并不赘述过多其他的知识点

  • 数据库使用的是mysql,工具的话可以依个人使用习惯来,我这里用的是sqlyog

首先第一步,先把数据库的表建好,当然,建表之前首先需要建库,建库不讲解,我直接上sql脚本:

-- 部门表
CREATE TABLE dept (
  id INT PRIMARY KEY PRIMARY KEY, -- 部门id
  dname VARCHAR(50), -- 部门名称
  loc VARCHAR(50) -- 部门所在地
);
-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES 
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');

-- 职务表,职务名称,职务描述
CREATE TABLE job (
  id INT PRIMARY KEY,
  jname VARCHAR(20),
  description VARCHAR(50)
);
-- 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司,接单'),
(2, '经理', '管理部门员工'),
(3, '销售员', '向客人推销产品'),
(4, '文员', '使用办公软件');

-- 员工表
CREATE TABLE emp (
  id INT PRIMARY KEY, -- 员工id
  ename VARCHAR(50), -- 员工姓名
  job_id INT, -- 职务id
  mgr INT , -- 上级领导
  joindate DATE, -- 入职日期
  salary DECIMAL(7,2), -- 工资
  bonus DECIMAL(7,2), -- 奖金
  dept_id INT, -- 所在部门编号
  CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
  CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);

-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES 
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);

-- 工资等级表
CREATE TABLE salarygrade (
  grade INT PRIMARY KEY,   -- 级别
  losalary INT,  -- 最低工资
  hisalary INT -- 最高工资
);

-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES 
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);

表创建完毕之后,我再针对这些表给几个练习题目:

-- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
-- 3.查询员工姓名,工资,工资等级
-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
-- 5.查询出部门编号、部门名称、部门位置、部门人数
-- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询

老实敲哦,不会的话可以加我QQ在文末sql练习的链接里,本人乐于为人排忧解难!
前文里,我详细的讲述了dubbo远程调用的搭建,现在,基于前文的基础,我想访问数据库,取出数据库中的数据,那么要去调用数据库,首先需要与数据库建立连接对吧,项目首先得支持数据库对吧,那么怎么使项目和数据库关联上呢?

第二步,我们开始在pom.xml中添加依赖,当然,是父工程下的.xml文件:

<dependencies>
		<!-- 整合dubbo -->
		<dependency>
			<groupId>io.dubbo.springboot</groupId>
			<artifactId>spring-boot-starter-dubbo</artifactId>
			<version>1.0.0</version>
		</dependency>
		<!-- zookeeper客户端 -->
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.7</version>
		</dependency>
		<!--web工程-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.1.3.RELEASE</version>
		</dependency>

		<!--mybatis启动器-->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		<!--连接池-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.6</version>
		</dependency>
		<!--添加JDBC依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<!--添加MySql依赖-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
	</dependencies>

第三步,因为等下会先测试一下数据库的连接情况,我们这里还需要添加一个test启动器:

		<!--测试-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>

完成之后我们写一个pojo,来封装数据,我这里就直接用一个emp表就行了:
第三步, 提供者 下创建pojo包(该包与service平级),创建Emp类(对应数据库字段),set,get方法整上去,如果你用lombok我也不反对,你要重写hashCode和equals或者toString我也不能说话,我只有一句:请仔细看我的注释信息

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

public class Emp implements Serializable {
      //使用Dubbo进行数据传递时,需让作为消息传递的类序列化。
    private int id;
    private String ename;
    private int job_id;
    private int mgr;
    private Date joindate; //你问我为什么这里不加@JsonFormat注解?那么我问你,最终把数据返回给浏览器的是谁
    private BigDecimal salary; //mysql数据库对应的java类型请自行去百度了解
    private BigDecimal bonus;
    private int dept_id;

    public int getId() {
     
        return id;
    }

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

    public String getEname() {
     
        return ename;
    }

    public void setEname(String ename) {
     
        this.ename = ename;
    }

    public int getJob_id() {
     
        return job_id;
    }

    public void setJob_id(int job_id) {
     
        this.job_id = job_id;
    }

    public int getMgr() {
     
        return mgr;
    }

    public void setMgr(int mgr) {
     
        this.mgr = mgr;
    }

    public Date getJoindate() {
     
        return joindate;
    }

    public void setJoindate(Date joindate) {
     
        this.joindate = joindate;
    }

    public BigDecimal getSalary() {
     
        return salary;
    }

    public void setSalary(BigDecimal salary) {
     
        this.salary = salary;
    }

    public BigDecimal getBonus() {
     
        return bonus;
    }

    public void setBonus(BigDecimal bonus) {
     
        this.bonus = bonus;
    }

    public int getDept_id() {
     
        return dept_id;
    }

    public void setDept_id(int dept_id) {
     
        this.dept_id = dept_id;
    }

}

第四步,将pojo包原样复制到 消费者 工程目录下,还是和service平级,还是那句:请仔细看我的注释信息

import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;

public class Emp {
     
    private int id;
    private String ename;
    private int job_id;
    private int mgr;
    @JsonFormat(pattern = "yyyy-MM-dd") //该注解会对日期格式进行一个转换
    private Date joindate;
    private BigDecimal salary;
    private BigDecimal bonus;
    private int dept_id;

    public int getId() {
     
        return id;
    }

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

    public String getEname() {
     
        return ename;
    }

    public void setEname(String ename) {
     
        this.ename = ename;
    }

    public int getJob_id() {
     
        return job_id;
    }

    public void setJob_id(int job_id) {
     
        this.job_id = job_id;
    }

    public int getMgr() {
     
        return mgr;
    }

    public void setMgr(int mgr) {
     
        this.mgr = mgr;
    }

    public Date getJoindate() {
     
        return joindate;
    }

    public void setJoindate(Date joindate) {
     
        this.joindate = joindate;
    }

    public BigDecimal getSalary() {
     
        return salary;
    }

    public void setSalary(BigDecimal salary) {
     
        this.salary = salary;
    }

    public BigDecimal getBonus() {
     
        return bonus;
    }

    public void setBonus(BigDecimal bonus) {
     
        this.bonus = bonus;
    }

    public int getDept_id() {
     
        return dept_id;
    }

    public void setDept_id(int dept_id) {
     
        this.dept_id = dept_id;
    }

}

好了,实体类创建完成,我们这边来测试一下数据库的连接情况,现在我们还没有对数据库进行一个关联,这个项目是找不到数据库的,那么接下来,我们将在.yml文件里配置数据库连接:
第五步,使java能够访问数据库,需要告知数据库的位置,和登录数据库的账号密码:
消费者提供者 模块下的.yml文件里配置数据库连接(基于父工程,两边都需要配置)

  datasource:
    url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf8 #连接字符串URL
    username: root #用户名
    password: root #密码
注意!!!库名请填你的库名,不要填我的(我的是db2),我的账号密码都是root,你的呢?

到这一步,我们就可以开始进行一个测试了,怎么测试呢?首先,你得要有dao持久层,其次,你需要有sql语句去执行,那么完成这两者之后,就可以进行测试了!
第五步,在 提供者 中创建dao包(该包与service平级),写一个接口,提供一个方法,该方法返回多个emp对象,我这里采用list进行封装:

import com.dubbo.pojo.Emp;
import java.util.List;

public interface DubboMapper {
     
    public List<Emp> dubboTest();
}

现在接口写好了,还差sql语句,我这里是用xml文件来配置的.
第六步,在resources目录下,创建一个和dao包目录一样的目录,在该目录下创建一个和接口名相同的.xml文件:

目录结构如下:
详解springboot+dubbo+zookeeper访问数据库(附sql练习)_第1张图片
.xml文件的配置如下:
xml配置请注意有四个一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.dubbo.dao.DubboMapper" >

    <!--
    namespace = 指定dao接口所在位置,这个直接关系到接口能不能访问到这个.xml执行sql
    resultType = 传出的参数(与接口返回类型一致),如果是对象,需指定该对象的全限定名
    parameterType = 传入的参数(与接口传入类型一致),如果是对象,需指定该对象的全限定名
    id = 与dao接口内的方法名一致
    通过namespace找到对应接口,通过id找到接口内对应方法,根据传入传出的参数执行sql语句
    由于我这边只是单纯的查出emp表中的所有数据,所以没有传入参数,只有传出的对象
    -->
    
    <select id="dubboTest"  resultType="com.dubbo.pojo.Emp">
        select * from emp
    </select>
</mapper>

这一步完成之后,我们有了数据库的连接,有了具体执行的sql,接下来,我们就开始测试这个数据库能不能拿到数据:
第七步,测试数据库连接:

import com.dubbo.dao.DubboMapper;
import com.dubbo.pojo.Emp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DubboTest {
     
    @Autowired
    private DubboMapper dubboDao;

    @Test
    public void test1(){
     
        List<Emp> emps = dubboDao.dubboTest();
        int i = 0;
        for (Emp emp : emps) {
     
            System.out.println(emp.getEname());
            i++;
        }
        System.out.println("共"+i+"条数据");
    }

}

最后的话就是将访问路径上的参数传递修改一下从controller到service再到dao,这里的话我就不再去讲解了,无非就是层层传递下来而已,当做完这些工作后,启动提供者和消费者,访问http://127.0.0.1:8082/hello/visitHello
得到结果如下图(我这里是浏览器上装了一个jsonview的插件,会自动给我将json串进行格式化):
详解springboot+dubbo+zookeeper访问数据库(附sql练习)_第2张图片
至此,访问数据库的操作就已经做完了,搞完,收工!!

以下是练习sql的链接:
https://pan.baidu.com/s/1xH4lEZojHzPfY_lTsU6h3Q
提取码:1hqu

写在最后:人若成就一道景致,则无关春夏秋冬。

你可能感兴趣的:(springboot,dubbo,mybatis,java,mybatis,mysql,spring,boot,数据库)