文章目录
一、demo介绍
采用Dubbo+Springboot+zookeeper+Maven,简单实现业务demo的效果图,单车平台的显示和条件查询维修记录,和维修记录的增删改
demo实现描述:
maven创建pom聚合工程将服务调用和服务提供分离(即服务消费者和服务提供者),zookeeper作为注册中心,dubbo实现服务的提供和调用。
此处将工程分为三个子工程完成,分别的任务是:
consumer消费者:负责controller层,调用服务
provider提供者:负责具体的服务实现提供,service层和dao层
common通用工程:避免代码的冗余,负责整合consumer和provider的公共部分,实体类、工具类和service接口
二、项目环境搭建
1、创建maven父工程
创建maven父工程bikedubbodemo
2、分别创建三个子工程
服务端工程:bike-provider
消费者端工程:bike-consumer
通用工程:bike-common
3、jar包引入
父工程的pom.xml管理公共版本号
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!--分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
通用工程bike-common的pom.xml管理提供者和消费者公共的jar包
<dependencies>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
服务端工程bike-provider的pom.xml首先引入通用工程,服务端需要和数据库打交道,因此需要mysql驱动包和mybatis核心包,注意此处mysql驱动包的大版本和安装的版本相差不要太大,否则会报错
<dependencies>
<dependency>
<artifactId>bike-common</artifactId>
<groupId>com.booy.bikedubbodemo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.29</version>
</dependency>
</dependencies>
<!--配置资源文件扫描,否则Mapper-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
消费者端工程bike-consumer的pom.xml首先引入通用工程,消费者端要负责前端页面模板引擎,因此需要引入thymeleaf包
<dependencies>
<dependency>
<artifactId>bike-common</artifactId>
<groupId>com.booy.bikedubbodemo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--thymeleaf包,注意小版本差异也大-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
三、通用工程bike-common
1、实体类
平台实体类Platform
package com.booy.bike.pojo;
import java.io.Serializable;
//平台实体类
public class Platform implements Serializable {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
维修实体类Record
package com.booy.bike.pojo;
import java.io.Serializable;
import java.util.Date;
public class Record implements Serializable{
private Integer id;
private Platform platform;
private String num;
private String detail;
private Date createdDate;
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Platform getPlatform() {
return platform;
}
public void setPlatform(Platform platform) {
this.platform = platform;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
搜索条件封装成类RecordSearch
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class RecordSearch extends Record {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date start;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date end;
private Integer platId;
public Date getStart() {
return start;
}
public void setStart(Date start) {
this.start = start;
}
public Date getEnd() {
return end;
}
public void setEnd(Date end) {
this.end = end;
}
public Integer getPlatId() {
return platId;
}
public void setPlatId(Integer platId) {
this.platId = platId;
}
}
事务返回的状态类
package com.booy.bike.pojo;
import java.io.Serializable;
public class DubboResult implements Serializable {
private boolean success;
private String message;
public DubboResult(boolean success, String message) {
this.success = success;
this.message = message;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、service接口
平台查询接口PlatformService
package com.booy.bike.service;
import com.booy.bike.pojo.Platform;
import java.util.List;
public interface PlatformService {
List<Platform> getPlatformList();
}
自行车维修数据的CRUD接口
package com.booy.bike.service;
import com.booy.bike.pojo.DubboResult;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import com.github.pagehelper.PageInfo;
public interface RecordService {
PageInfo<Record> getRecordList(RecordSearch search, Integer pageNum, Integer pageSize);
Record getRecordById(Integer id);
DubboResult addRecord(Record record);
DubboResult updateRecord(Record record);
DubboResult deleteRecord(Integer id);
}
四、服务端bike-provider
1、dao层
平台查询dao接口
package com.booy.bike.dao;
import com.booy.bike.pojo.Platform;
import java.util.List;
public interface PlatformDAO {
List<Platform> getPlatformList();
}
相对应的mapper映射
<?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.booy.bike.dao.PlatformDAO">
<select id="getPlatformList" resultType="Platform">
select id,name from platform
</select>
</mapper>
维修数据的dao层接口
package com.booy.bike.dao;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import java.util.List;
public interface RecordDAO {
List<Record> getRecordList(RecordSearch search);
//修改回填
Record getRecordById(Integer id);
int updateRecord(Record record);
int addRecord(Record record);
int deleteRecord(Integer id);
}
相对应的mapper映射
<?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.booy.bike.dao.RecordDAO">
<resultMap id="recordMap" type="Record">
<id property="id" column="ID"/>
<result property="num" column="num"/>
<result property="detail" column="detail"/>
<result property="createdDate" column="created_date"/>
<result property="status" column="status"/>
<result property="platform.id" column="plat_id"/>
<result property="platform.name" column="name"/>
</resultMap>
<select id="getRecordList" resultMap="recordMap">
SELECT
r.ID,
num,
detail,
created_date,
status,
plat_id,
p.name
FROM record r
INNER JOIN platform p ON p.id = r.plat_id
<where>
<if test="start!=null">created_date >= #{start}</if>
<if test="end!=null">and created_date <=#{end}</if>
<if test="status!=null">and status =#{status}</if>
<if test="platId!=null">and plat_id =#{platId}</if>
<if test="num!=null and num!=''">and num=#{num}</if>
</where>
</select>
<insert id="addRecord" parameterType="Record" useGeneratedKeys="true" keyProperty="id">
INSERT INTO record (num, detail, created_date, status, plat_id)
VALUES (#{num}, #{detail}, #{createdDate}, #{status}, #{platform.id})
</insert>
<update id="updateRecord" parameterType="Record">
update record
<set>
<if test="num!=null and num!=''">num=#{num},</if>
<if test="detail!=null and detail!=''">detail=#{detail},</if>
<if test="status!=null">status =#{status},</if>
<if test="platform!=null and platform.id!=null">plat_id =#{platform.id},</if>
</set>
where id=#{id}
</update>
<delete id="deleteRecord" parameterType="int">
DELETE FROM record
WHERE ID = #{id}
</delete>
<select id="getRecordById" parameterType="int" resultMap="recordMap">
SELECT
id,
num,
detail,
created_date,
status,
plat_id
FROM record
WHERE id = #{id}
</select>
</mapper>
2、service接口实现类
平台查询接口具体实现PlarformServiceImpl
package com.booy.bike.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.booy.bike.dao.PlatformDAO;
import com.booy.bike.pojo.Platform;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@Service
public class PlarformServiceImpl implements PlatformService {
@Autowired
private PlatformDAO platformDAO;
@Override
public List<Platform> getPlatformList() {
return platformDAO.getPlatformList();
}
}
维修数据的CRUD具体实现RecordServicImpl
package com.booy.bike.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.booy.bike.dao.RecordDAO;
import com.booy.bike.pojo.DubboResult;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class RecordServicImpl implements RecordService {
@Autowired
private RecordDAO recordDAO;
@Override
public PageInfo<Record> getRecordList(RecordSearch search, Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
return new PageInfo<>(recordDAO.getRecordList(search), 5);
}
@Override
public Record getRecordById(Integer id) {
return recordDAO.getRecordById(id);
}
@Override
public DubboResult addRecord(Record record) {
try {
int res = recordDAO.addRecord(record);
System.out.println(1);
return new DubboResult(res > 0, null);
} catch (Exception e) {
e.printStackTrace();
System.out.println(2);
return new DubboResult(false, e.getMessage());
}
}
@Override
public DubboResult updateRecord(Record record) {
try {
int res = recordDAO.updateRecord(record);
return new DubboResult(res > 0, null);
} catch (Exception e) {
e.printStackTrace();
return new DubboResult(false, e.getMessage());
}
}
@Override
public DubboResult deleteRecord(Integer id) {
try {
int res = recordDAO.deleteRecord(id);
return new DubboResult(res > 0, null);
} catch (Exception e) {
e.printStackTrace();
return new DubboResult(false, e.getMessage());
}
}
}
3、配置文件
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
mybatis:
mapper-locations: classpath*:com/booy/bike/dao/mapper/*.xml
type-aliases-package: com.booy.bike.pojo
dubbo:
application:
name: bike-provider
# 协议
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://localhost:2181
scan:
base-packages: com.booy.bike.service
server:
port: 8080
4、启动类
package com.booy.bike;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo//启动Dubbo服务
@MapperScan(basePackages = "com.booy.bike.dao")
public class ProviderStarter {
public static void main(String[] args) {
SpringApplication.run(ProviderStarter.class);
}
}
五、消费者端bike-consumer
1、controller
package com.booy.bike.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.booy.bike.pojo.Platform;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import com.booy.bike.service.PlatformService;
import com.booy.bike.service.RecordService;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Date;
import java.util.List;
@Controller
public class BikeController {
@Reference
private PlatformService platformService;
@Reference
private RecordService recordService;
@RequestMapping("list.html")
public String list(RecordSearch recordSearch, Integer pageNum, Model model) {
if (pageNum == null || pageNum < 1) {
pageNum = 1;
}
List<Platform> platforms = platformService.getPlatformList();
model.addAttribute("platforms", platforms);
PageInfo<Record> pageInfo = recordService.getRecordList(recordSearch, pageNum, 2);
model.addAttribute("pageInfo", pageInfo);
return "list";
}
@RequestMapping("edit.html")
public String edit(Integer id, Model model) {
if (id != null) {
Record record = recordService.getRecordById(id);
model.addAttribute("record", record);
}
List<Platform> platforms = platformService.getPlatformList();
model.addAttribute("platforms", platforms);
return "edit";
}
@RequestMapping("save.html")
public String save(Record record) {
if(record.getId()==null){
record.setCreatedDate(new Date());
recordService.addRecord(record);
}else{
recordService.updateRecord(record);
}
return "redirect:list.html";
}
@RequestMapping("delete.html")
public String delete(Integer id){
recordService.deleteRecord(id);
return "redirect:list.html";
}
}
2、配置文件
dubbo:
application:
name: bike-consumer
registry:
address: zookeeper://localhost:2181
consumer:
timeout: 5000
server:
port: 8082
spring:
mvc:
view:
suffix: .html
3、启动类
package com.booy.bike;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerStarter {
public static void main(String[] args) {
SpringApplication.run(ConsumerStarter.class);
}
}
剩下的就是前端页面的文件了
项目文件地址:https://download.csdn.net/download/booy123/12602679
项目文件结构图: