基础数据修改时修改业务数据的方案实现

问题的提出:

在开发的过程中,我们会遇到这样的问题,在订单中订单的所属人,这个数据设计时有用户id,用户名称,联系信息等等。这样做的好处是不用关联到系统用户表做数据关联。

问题是如果用户表的基础信息发生了修改,那么这个时候,希望修改订单相应用户信息。

 

解决方案

方案1.

使用数据库触发器,这个修改相对简单,而且不用修改java代码。

缺点:

有时开发人员可能不能直接接触数据库,无法通过此方式实现。

方案2:

使用代码处理,如果直接在用户编辑时对业务表进行修改,这样肯定是不合理的,问题在于这样每次增加一个业务我们都需要这个用户代码进行修改。这样不满足封闭开放原则。

现在的解决方案是:

1.在用户编辑时,发布一个事件。

2.写监听器监视这个事件。

3.在信息修改时调用这个代码发布事件。

这样用户编辑类就不需要做任何更改,发布事件就是了,这个事件可以被系统监听,也可以不监听,这样代码就

 

实现了解耦。

 

具体代码如下:

1.定义事件对象:

public class DataModel {
    private String pk="";
    private String tableName="";
    private String action="";

}

2.定义事件

public class UpdDataEvent extends ApplicationEvent {
   
    /**
     *
     */
    private static final long serialVersionUID = -656796814656037536L;

    public UpdDataEvent(Object source) {
        super(source);
    }

}

3.定义事件监听器。

public class UpdateDataListener implements ApplicationListener<UpdDataEvent> {
   
    @Resource(name="jdbcTemplate")
    JdbcTemplate jdbcTemplate;
   
    private Map<String,List<String>> sqlMap=new HashMap<String, List<String>>();

    @Override
    public void onApplicationEvent(UpdDataEvent event) {
        DataModel dataModel=(DataModel) event.getSource();
        String id=dataModel.getPk();
        String tableName=dataModel.getTableName();
       
        List<String> sqlList=sqlMap.get(tableName);
       
        for(String sql:sqlList){
            jdbcTemplate.update(sql, id);
        }
    }
   
    public void setSqlMap(Map<String,List<String>> map){
        this.sqlMap=map;
    }

}

 

从外部注入sql map。

这个map键是表名,值为List,这个列表对应了sql语句。

oracle下这个sql语句的写法为:

UPDATE QINGJIA a  SET(username) =(SELECT b.fullname FROM sys_user b WHERE b.userid = a.userid) WHERE a.userid=?

必须为一个参数。

 

4.配置文件的写法:

<bean id="updateDataListener" class="com.hotent.core.datahandler.UpdateDataListener">
        <property name="sqlMap">
            <map>

<!--这个为表名,需要和发布事件时保持一直,请统一小写—> 
                <entry key="biaoming">
                    <list>

<!--待更新的sql语句,可以配置多条—>
                        <value type="java.lang.String">
                            UPDATE QINGJIA a  SET(username) =(SELECT b.fullname FROM sys_user b WHERE b.userid = a.userid) WHERE a.userid=?
                        </value>
                    </list>
                </entry>
            </map>
        </property>
    </bean>

 

 

5.发布事件

public class DataPublishUtil {
   
    /**
     * 发布事件。
     * @param model
     */
    public static void publishData(DataModel model){
        AppUtil.publishEvent(new UpdDataEvent(model));
    }
   
    /**
     * 发布事件。
     * @param tableName
     * @param pk
     */
    public static void publishData(String tableName ,String pk){
        DataModel model=new DataModel();
        model.setPk(pk);
        model.setTableName(tableName);
        AppUtil.publishEvent(new UpdDataEvent(model));
    }

}

 

在需要的地方比如用户编辑时,调用相关方法。

publishData(String tableName ,String pk)

参数说明:

tableName :表名这个需要约定和配置文件中的保持一致。

pk: 主键数据

时间: 2024-07-28 13:57:29

基础数据修改时修改业务数据的方案实现的相关文章

SAP 常用业务数据表设计

表的要求表中使用的字段请尽量参照各模块的SAP字段标准使用习惯:  例:"ZXSLRZX销售组织对应的利润中心"中的销售组织应该使用VKORG.利润中心应该使用PRCTR.根据表的用途,需确定是否属于配置目的.还是业务目的.配置表的建议:需要加入MANDT字段  例: "ZQJQD缺件清单"就没有MANDT字段需提供相应的维护视图:例:如ZCHECK_MM01工厂和利润中心的对应为保证DEV/QAS/PRD系统的一致性,不应该对配置表提供批量维护的功能,而应该走Re

从0到1构建大数据生态系列1:数据蛮荒中的拓荒之举

缘起 我们都知道,当前大数据的需求基本属于遍地开花.无论是帝都.魔都,还是广州.深圳,亦或是全国其他各地,都在搞大数据:不管是不到百人的微小公司,还是几百上千人的中型公司,亦或是上万的大型公司,都在需求数据岗位. 大公司暂且不论,他们一切都走在前头.那么,对于中小型企业来说,开始尝试以数据的思维去思考问题,开始涉足大数据领域,这就是一个从0到1的过程了. 有(bu)幸(xing),近半年来,我亲自见证以及亲身体会到了这个过程,或者至今仍然在完善1这个过程中.期间,有痛苦有坑.有喜悦有成功.有沉静

袋鼠云数据中台专栏2.0 | 数据中台综述:三个维度看数据中台

一.关于数据中台的9个名词 数据中台是什么,当前有很多解释,但是它一定不是哈姆雷特. 新兴的事物总会被各种解读,但是当人们足够熟悉了以后,总会有一个公允的定义得到广泛的认可和接受.这个过程中,最可以用于度量的便是「功能定义」与「业务价值」.袋鼠云认为,数据中台表现出的最主要特征是一种企业数据化体系的架构,而且就目前而言,这种架构是最为有效的一种架构. 目前很多人把数据中台直接等同于企业数据化,AI和大数据,或者是直接的业务价值,甚至企业变革(比如新零售).这些都是不准确的,数据中台的价值被过于放

ExtJS 4.2 业务开发(三)数据添加和修改

接上面的船舶管理业务,这里介绍添加和修改操作. 目录 1. 添加操作 2. 修改操作 3. 在线演示 1. 添加操作 1.1 创建AddShipWindow.js 在业务中的view目录下创建一个AddShipWindow.js文件,表示一个增加船舶的窗口组件. 此文件中包含了一个form组件用于显示所要添加的字段:船舶名称.状态.吨数和核载人数. 具体代码如下: Ext.define('App.ShipMgr.view.AddShipWindow', { extend: 'Ext.window

SQL基础篇-----修改表内的数据

知识点1----ALTER 下列代码意义:向已存在的表my_foods中新增自动排列的列 作为主键 ALTER TABLE my_contacts --表名称 ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST, --新的 列 id,自动排列,该列于第一位 ADD PRIMARY KEY (id); --要求新命名的id列作为主键 如果不需要作为主键,则去掉 PRIMARY KEY 即可! 排序关键字: FIRST - --把 列id 安置于所有其他列

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo

SharePoint 2010 升级到2013时 保证用户能够连接但不能修改正升级的数据

SharePoint 2010 升级到2013时 保证用户能够连接但不能修改正升级的数据 我总结的步骤 红色请注意他们的意义. 步骤1:连接到SQL DBS 上的SharePoint 2010数据库的内容. 步骤2:设置SharePoint内容数据库的只读状态为True. 步骤3:把SharePoint 2010内容数据库备份文件恢复到SharePoint 2013场. 步骤4:SharePoint内容数据库的只读状态设置为False(读写). 步骤5:分离SharePoint 2010内容数据

数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案

作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一数据库按照一定的规则进行切分,把数据分散到多台物理机(我们称之为Shard)上存储,从而突破单机限制,使系统能以Scale-Out的方式应对不断上涨的海量数据,但是这种切分对上层应用来说是透明的,多个物理上分布的数据库在逻辑上依然是一个库.实现Sharding需要解决一系列关键的技术问题,这些问题主

业务数据与基础数据思考

业务数据的产生与修改基于基础数据,但业务数据的统计分析等不应依赖于基础数据. 基础数据的作用就是以此为基础产生业务数据,业务数据一旦产生和修改完成,就已经与基础数据无关系了. 不应由于自己处理逻辑不正确而限制正常可行的客户操作行为,正确的做法是寻找可行解决方案. 原文地址:https://www.cnblogs.com/fuxuyang/p/10296482.html