SpringBoot整合业务流程01

本文介绍了如何在SpringBoot中整合业务流程,包括定义实体对象实现ORM映射,定义Dao接口及Mapper文件,编写SQL语句。同时,详细阐述了Service接口、实现类以及Controller的处理,强调了异常处理和服务层数据封装。最后,提到了客户端的日志分页展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

管理列表数据呈现

1.1定义实体对象(POJO)封装从数据库查询的数据实现ORM映射

//构建与数据库表对应的实体类型

/*	
类名 SysLog (实现序列化接口,并定义序列化id)
属性 与表(sys_Logs)中字段有对应关系
方法 set/get/toString
*/
public class SysLog  implements Serializable{
	private static final long serialVersionUID = -6585641359032857459L;
	private Integer id;//用户名
	private String username;//用户操作
	...

通过此对象除了可以封装从数据库查询的数据,还可以封装客户端请求数据,实现层与层之间数据的传递

1.2定义Dao接口实现,并创建接口并定义相关方法


@Mapper //告诉mybatis 框架   此接口实现类有底层实现
public interface SysLogDao {
	/**
	 * @param username  查询条件(例如查询哪个用户的日志信息)
	 * @param startIndex 当前页的起始位置
	 * @param pageSize 当前页的页面大小
	 * @return 当前页的日志记录信息
	 */
	//数据库中每条日志信息封装到一个SysLog对象中
	List<SysLog> findPageObjects(
		@Param("username")	String username,
		@Param("startIndex")Integer startIndex,
		@Param("pageSize")	Integer pageSize);

	
	/**
	 * @param username 查询条件(例如查询哪个用户的日志信息)
	 * @return 总记录数(基于这个结果可以计算总页数)
	 * 说明:假如如下方法没有使用注解修饰,在基于名字进行查询
	 * 时候会出现There is no getter for property named
	 * 'username' in 'class java.lang.String'
	 */

	int getRowCount(@Param("username")  String username);
}
  1. 当DAO中方法参数多余一个时尽量使用@Param注解进行修饰并指定名字,然后再Mapper文件中便可以通过类似#{username}方式进行获取,否则只能通过#{arg0},#{arg1}或者#{param1},#{param2}等方式进行获取。
  2. 当DAO方法中的参数应用在动态SQL中时无论多少个参数,尽量使用@Param注解进行修饰并定义。

1.3Mapper.xml映射文件编写sql语句

<?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.cy.pj.sys.dao.SysLogDao">
    <select id="findPageObjects"
            resultType="com.cy.pj.sys.entity.SysLog">
         select *
         from sys_Logs
         <include refid="queryWhereId"/>
order by createdTime desc
         limit #{startIndex},#{pageSize}    
</select>
    
    <select id="getRowCount"
            resultType="int">
          select count(*) 
          from sys_Logs
          <include refid="queryWhereId"/>
    </select>
    <!-- 借助此元素对共性数据进行提取 -->
    <sql id="queryWhereId">
          <where>
            <if test="username!=null and username!=''">
               username like concat("%",#{username},"%")
            </if>
          </where>
    </sql>
</mapper>

2.1Service接口以及实现类类

Service接口:

public interface SysLogService {

	 PageObject<SysLog> findPageObjects(
			 String username,
			 Integer pageCurrent);
}

PageObject 封装查询后的数据

package com.cy.pj.common.vo;
...
//类泛型
public class PageObject<T> implements Serializable {
	private static final long serialVersionUID = 7013456843599537805L;
	private Integer rowCount; /**总行数(通过查询获得)*/
	private Integer pageCurrent;/**当前页的页码值*/
    private Integer pageSize=3;/**页面大小*/
    private Integer pageCount;  /**总页数(通过计算获得)*/
    private List<T> records; /**当前页记录*/
	......get/set toString  构造方法
	}	
}

Service接口的实现类

package com.cy.pj.sys.service.impl;
...

@Service
public class SysLogServiceImpl implements SysLogService {
	//SysLogDao 接口  数据层的查询
	@Autowired
	private SysLogDao sysLogDao;//DI注入
	@Override
	public PageObject<SysLog> findPageObjects(
			String username, 
			Integer pageCurrent) {
		 //1.验证参数合法性
		 //1.1验证pageCurrent的合法性
		if (pageCurrent ==null || pageCurrent<1) {
			throw new IllegalArgumentException("当前页码不正确");
		}

		 //2.基于条件查询总记录数
		//接口里面两个查询数据的抽象方法
		//findPageObjects   getRowCount  
		int rowCount = sysLogDao.getRowCount(username);
		if (rowCount == 0) {
			  throw new ServiceException("系统没有查到对应记录");
		}
		
		 //3.基于条件查询当前页记录(pageSize定义为2)
		int pageSize = 3;
		int startIndex = (pageSize -1)*pageSize;
		List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
		
		 //4.对分页信息以及当前页记录进行封装
//		PageObject<Object> pageObject = new PageObject<>();
//		//4.2)封装数据
//		  pageObject.setPageCurrent(pageCurrent);
//		  pageObject.setPageSize(pageSize);
//		  pageObject.setRowCount(rowCount);
//		  pageObject.setRecords(records);
//        pageObject.setPageCount((rowCount-1)/pageSize+1);
		PageObject<SysLog> po = 
		new PageObject<>(pageCurrent, pageSize, rowCount, (rowCount-1)/pageSize+1, records);
		return po;
	}
}

Controller

package com.cy.pj.common.vo;

import java.io.Serializable;

/**
 * VO  借助此对象封装服务端的影响数据
 * 
 * 1)响应状态码
 * 2)响应消息
 * 3)响应数据
 * 
 * @author Administrator
 *
 */
public class JsonResult implements Serializable{
	
	private static final long serialVersionUID = -7744020406749967230L;
	//状态码
	private int state = 1;
	//状态码对应的信息
	private String message = "ok";
	
	private Object data;
	
	public JsonResult(String message){
		this.message=message;
	}
	/**一般查询时调用,封装查询结果*/
	public JsonResult(Object data) {
		this.data=data;
	}
	/**出现异常时时调用*/
	public JsonResult(Throwable t){
		this.state=0;
		this.message=t.getMessage();
	}
......get/set toString  构造方法 无参  全参
}

处理异常 ServiceException 类

package com.cy.pj.common.exception;

public class ServiceException extends RuntimeException {
	private static final long serialVersionUID = 5843835376260549700L;
	
	public ServiceException() {
		super();
	}
	public ServiceException(String message) {
		super(message);
	}
	public ServiceException(Throwable cause) {
		super(cause);
	} 
}

GlobalExceptionHandler 自己创建异常类

package com.cy.pj.common.web;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cy.pj.common.vo.JsonResult;

@ControllerAdvice //全局异常处理类
public class GlobalExceptionHandler {
	/**
	 * @ExceptionHandler()描述的方法
	 * @param e
	 * @return
	 */
	//JDK中的自带的日志API
		@ExceptionHandler(RuntimeException.class) // 处理RuntimeException或者它的子类
	    @ResponseBody
		public JsonResult doHandleRuntimeException(
				RuntimeException e){
	    	e.printStackTrace();//也可以写日志
			return new JsonResult(e);//封装异常信息
		}
}

Controller 类以及类的实现

package com.cy.pj.sys.controller;
...

@Controller
@RequestMapping("/log/")
public class SysLogController {
	
	@Autowired
	private SysLogService sysLogService;

	@RequestMapping("doFindPageObjects")
	@ResponseBody
	public JsonResult doFindPageObjects(String username, Integer pageCurrent) {
		PageObject<SysLog> pageObject = sysLogService.findPageObjects
				(username, pageCurrent);
		return new JsonResult(pageObject);
	}
}

客户端实现 日志分页信息 列表出现
log_list.html

<div class="row">
	<div class="col-xs-12">
		<div class="box">
			<div class="box-header">
				<h3 class="box-title">日志管理</h3>

				<div class="box-tools">
					<div class="input-group input-group-sm" style="width: 350px;">
						<input type="text" name="table_search" id="searchNameId"
							class="form-control pull-right" placeholder="用户名">

						<div class="input-group-btn">
							<button type="button" class="btn btn-default btn-search">
								<i class="fa fa-search"></i>
							</button>
							<button type="button" class="btn btn-default btn-delete">删除</button>
						</div>
					</div>
				</div>
			</div>
			<!-- /.box-header -->
			<div class="box-body table-responsive no-padding">
				<table class="table table-hover">
					<thead>
						<tr>
							<th><input type="checkbox" id="checkAll">全选</th>
							<th>用户名</th>
							<th>操作</th>
							<th>请求方法</th>
							<th>请求参数</th>
							<th>IP</th>
							<th>执行时长</th>
						</tr>
					</thead>
					<tbody id="tbodyId">
						<tr>
							<td colspan="7">数据正在加载中...</td>
						</tr>
					</tbody>
				</table>
			</div>
			<div id="pageId" class="box-footer clearfix"></div>
			<!-- /.box-body -->
		</div>
		<!-- /.box -->
	</div>
</div>
<script type="text/javascript">
	$(function() {
		//当页面加载(异步加载 《多线程》)完成执行后执行此函数
		//并将资源添加到pageId对应的位置

		//function(){}会在异步加载结束后调用
		$("#pageId").load("doPageUI", function() {
			//加载数据 并呈现数据
			doGetObjects();
		});
	})

	function doGetObjects() {
		//1定义请求参数
		var params ="pageCurrent=1";
		//2定义请求url
		var url = "log/doFindPageObjects";
		
		//发送异步请求加载日志数据
		//1)getJSON为JQuery框架中的函数
		//2)getJSON用于向服务器发送GET请求
		//3)getJSON会将服务器端返回的json串直接转换为JSON格式
		//4)function(){}会在服务器端数据响应到客户端
		$.getJSON(url,params,function(result){
			//console.log(result)//在js控制台输出打印
			doHandleResponseResult(result);
		});
	}
	
	function doHandleResponseResult(result){
		
		if(result.state==1){
			//console.log(result.data.records);
			//此方法写到page.html中
			//doSetPagination(result.data); 
			
			doSetTableBodyRows(result.data.records);
			
		}else{
			alert(result.message);
		}
	}
	
	/*设置表格内容*/
	   function doSetTableBodyRows(records){
		   //1.获取tbody对象,并清空对象
		   var tBody=$("#tbodyId");
		   tBody.empty();
		   //2.迭代records记录,并将其内容追加到tbody
		   for(var i in records){
			   //2.1 构建tr对象
			   var tr=$("<tr></tr>");
			   //2.2 构建tds对象
			   var tds=doCreateTds(records[i]);
			   //2.3 将tds追加到tr中
			   tr.append(tds);
			   //2.4 将tr追加到tbody中
			   tBody.append(tr);
		   }
	   }
	
	   function doCreateTds(data){
		   var tds="<td><input type='checkbox' class='cBox' name='cItem' value='"+data.id+"'></td>"+
			   	 "<td>"+data.username+"</td>"+
			     "<td>"+data.operation+"</td>"+
			     "<td>"+data.method+"</td>"+
			     "<td>"+data.params+"</td>"+
			     "<td>"+data.ip+"</td>"+
			     "<td>"+data.time+"</td>";	   
	return tds;
	   }

</script>
Spring Boot 整合 Activiti 流程引擎通常是指将流行的轻量级企业应用开发框架 Spring Boot 与 Activiti 这个开源的工作流管理平台结合使用。Activiti 提供了一个强大的流程定义语言 BPMN (Business Process Model and Notation),使得开发者可以轻松设计、管理和执行业务流程。 以下是整合的基本步骤: 1. **添加依赖**:在你的 Maven 或者 Gradle 项目中,添加 Activiti 的 starter 对应版本到构建工具的依赖中。例如,如果你使用 Maven,可以在 `pom.xml` 中添加: ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> </dependency> ``` 2. **配置 Activiti**:在 `application.properties` 或 `application.yml` 文件中设置 Activiti 的数据库连接信息和其他重要配置,如历史服务的存储策略等。 3. **创建流程定义**:使用 Activiti的历史服务 API 来定义流程模型,并将其持久化到数据库中。这通常是通过 XML 或 YML 配置文件完成,也可以通过 Java 注解的方式。 4. **启动流程实例**:在 Spring Boot 控制器或其他业务组件中,你可以使用 Activiti的 `ProcessEngine` 和 `RuntimeService` 来启动一个新的流程实例。 5. **任务处理**:当流程到达某个任务节点时,会创建一个待办事项。Spring Boot 可以与 Activiti Task Service 结合,提供用户界面或 RESTful API 让用户处理任务。 6. **监听与通知**:可以利用 Activiti 的事件监听机制,对流程的不同状态变化进行响应,比如任务完成或流程结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值