接口冪等性實現(xiàn)方式之一

1.什么是接口冪等性?

接口程序多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同补履。

2.什么情況下要用到冪等性

在寫入數(shù)據(jù)時添坊,保證某個數(shù)據(jù)多次寫入而數(shù)據(jù)庫只插入一次數(shù)據(jù),比如支付問題箫锤,用戶支付一次就可完成商品交易贬蛙,當(dāng)網(wǎng)絡(luò)卡頓時,用戶多次點擊付款按鈕谚攒,最終只執(zhí)行一次支付阳准,避免重復(fù)支付給用戶帶來的經(jīng)濟(jì)損失。

3.使用攔截器實現(xiàn)接口冪等性

這里馏臭,模擬一個場景:在數(shù)據(jù)庫中添加商品(name)與編號(code)野蝇,code是商品的唯一標(biāo)識id,不可重復(fù)括儒,也就是說多次寫入某個商品時數(shù)據(jù)庫添加的數(shù)據(jù)只能有一個绕沈,避免了數(shù)據(jù)的重復(fù)性。

下面開始用攔截器實現(xiàn)功能:

首先帮寻,項目的代碼(springboot項目)如下:

mapper:

public interface MiMapper {

/*

* 插入數(shù)據(jù)

* */

? ? int insert(Mi mi);

/*

* 查詢

* */

? ? List find(String code);

}

MiMapper.xml:

<mapper namespace="com.example.mideng.mapper.MiMapper">

<insert id="insert" parameterType="com.example.mideng.pojo.Mi">

insert into t_mi(name,code) values (#{name},#{code})

</insert>

<select id="find" parameterType="String" resultType="com.example.mideng.pojo.Mi">

select code from t_mi where code=#{code}

</select>

</mapper>

service:

public interface MiService {

int insert(Mi mi);

/*

* 查詢

* */

? ? List find(String code);

}

serviceImpl:

@Service

public class MiServiceImplimplements MiService {

@Autowired

? ? private MiMappermiMapper;

@Override

? ? public int insert(Mi mi) {

return miMapper.insert(mi);

}

@Override

? ? public List find(String code) {

return miMapper.find(code);

}

}

controller:

@Controller

public class WelcomeController {

@RequestMapping("/welcome")

public String wel(){

return "welcome";

}

}


@Controller

@RequestMapping("/mideng")

public class MiController {

@Autowired

? ? private MiServicemiService;

@RequestMapping("/tijiao")

public String tijiao(Mi mi){

int insert =miService.insert(mi);

return "ok";

}

@RequestMapping("/tip")

public String tip(){

return "tip";

}

}

html文件就不特意寫出了乍狐,就是簡單的數(shù)據(jù)提交,記得加上th:標(biāo)簽固逗,因為我這是用的thymeleaf模板浅蚪。

添加攔截器實現(xiàn)冪等

(1)首先自定義攔截器藕帜,這里思路是獲取http中的code參數(shù),然后在調(diào)用MiService 查詢該code在數(shù)據(jù)庫中是否已經(jīng)寫入惜傲,返回的是list耘戚,如果list的容量為0,說明數(shù)據(jù)表還沒插入數(shù)據(jù)操漠,那么返回true收津,否則重定向到提示界面并且返回false,不讓程序往下執(zhí)行。

@Component

public class MiDengIntercepterimplements HandlerInterceptor {

@Autowired

? ? private MiService miService;

@Override

? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {

String code = request.getParameter("code");

List mi =miService.find(code);

if (mi.size()==0){

? ? ? ? ? ? return true;

}else {

response.sendRedirect("/mideng/tip");

return false;

}

}

}

(2)配置攔截器

攔截器寫好后記得配置浊伙,這里添加的攔截路徑只有一個撞秋,就是提交接口,提交接口實現(xiàn)的功能是將數(shù)據(jù)寫入數(shù)據(jù)表

@Configuration

public class TiJiaoConfigureimplements WebMvcConfigurer {

@Autowired

? ? private MiDengIntercepter miDengIntercepter;

@Override

? ? public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(miDengIntercepter).addPathPatterns("/mideng/tijiao");

}

}


演示:

運(yùn)行項目嚣鄙,訪問http://localhost:8080/welcome


歡迎界面

先看下數(shù)據(jù)表吻贿,因為目前還沒添加數(shù)據(jù),所以是空的哑子。


空表

開始寫入:


點擊添加:

查看數(shù)據(jù)庫:

數(shù)據(jù)成功寫入舅列。下面繼續(xù)添加,這時code仍是123


點擊添加:

提示

會出現(xiàn)提示卧蜓,查看數(shù)據(jù)庫:

發(fā)現(xiàn)仍然只有一條數(shù)據(jù)帐要,現(xiàn)在換一下名稱看看效果:

code不變,名稱改變

點擊添加:

提示

查看數(shù)據(jù)庫:

仍然只有一個

分析:因為是對code的攔截判斷弥奸,所以表中不能有重復(fù)的code榨惠。下面換一下code試試:

code改變

點擊添加:

查看數(shù)據(jù)庫:

成功寫入

繼續(xù):

點擊添加:

查看數(shù)據(jù)庫:

發(fā)現(xiàn)只要code不同就可插入數(shù)據(jù),如果插入的code相同盛霎,那么無論點擊多少次添加赠橙,都只能執(zhí)行一次,所以簡單的冪等實現(xiàn)也就完成了愤炸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末期揪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子规个,更是在濱河造成了極大的恐慌凤薛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绰姻,死亡現(xiàn)場離奇詭異枉侧,居然都是意外死亡引瀑,警方通過查閱死者的電腦和手機(jī)狂芋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨栽,“玉大人帜矾,你說我怎么就攤上這事翼虫。” “怎么了屡萤?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵珍剑,是天一觀的道長。 經(jīng)常有香客問我死陆,道長招拙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任措译,我火速辦了婚禮别凤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘领虹。我一直安慰自己规哪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布塌衰。 她就那樣靜靜地躺著诉稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪最疆。 梳的紋絲不亂的頭發(fā)上杯巨,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音努酸,去河邊找鬼舔箭。 笑死,一個胖子當(dāng)著我的面吹牛蚊逢,可吹牛的內(nèi)容都是我干的层扶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼烙荷,長吁一口氣:“原來是場噩夢啊……” “哼镜会!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起终抽,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤戳表,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昼伴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匾旭,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年圃郊,在試婚紗的時候發(fā)現(xiàn)自己被綠了价涝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡持舆,死狀恐怖色瘩,靈堂內(nèi)的尸體忽然破棺而出伪窖,到底是詐尸還是另有隱情,我是刑警寧澤居兆,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布覆山,位于F島的核電站,受9級特大地震影響泥栖,放射性物質(zhì)發(fā)生泄漏簇宽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一吧享、第九天 我趴在偏房一處隱蔽的房頂上張望晦毙。 院中可真熱鬧,春花似錦见妒、人聲如沸甸陌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溃卡,卻和暖如春瘸羡,著一層夾襖步出監(jiān)牢的瞬間搓茬,已是汗流浹背卷仑。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工锡凝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雾棺。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓衬浑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尸饺。 傳聞我的和親對象是個殘疾皇子助币,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容