本篇开始之前,如果你没有搭建好远程调用的环境,请参考我的另一篇文章搭建一下:
https://blog.csdn.net/weixin_45433191/article/details/105236815
---- 都很简单,没有什么难度
我们最终的目的是使用springboot+dubbo+zookeeper的方式去调用到数据库即可,本文章并不赘述过多其他的知识点
首先第一步,先把数据库的表建好,当然,建表之前首先需要建库,建库不讲解,我直接上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 #密码
到这一步,我们就可以开始进行一个测试了,怎么测试呢?首先,你得要有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文件:
目录结构如下:
.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串进行格式化):
至此,访问数据库的操作就已经做完了,搞完,收工!!
以下是练习sql的链接:
https://pan.baidu.com/s/1xH4lEZojHzPfY_lTsU6h3Q
提取码:1hqu
写在最后:人若成就一道景致,则无关春夏秋冬。