一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis自定義類型處理器TypehHandler示例詳解

mybatis自定義類型處理器TypehHandler示例詳解

2021-05-31 11:24xwlmdd Java教程

我們在寫mapper映射器的配置文件時,不經意間已經用到類型轉換,不過是mybatis幫我們完成的,下面這篇文章主要給大家介紹了關于mybatis自定義類型處理器TypehHandler的相關資料,需要的朋友可以參考下

前言

當大家使用mybatis作為持久層框架時,在存儲和查詢數據時,只需要在mapper.xml文件中配置好對應字段的jdbctype和javatype,mybatis就可以幫我們轉化對應的類型。這背后是有mybatis內置的類型轉換器做轉換(可見源碼typehandlerregistry)。但是有時候,我們會對某些字段做特殊處理,比如加密和解密、狀態轉換、類型轉換等。這個時候我們需要自定義類型轉換器。

類架構

mybatis自定義類型處理器TypehHandler示例詳解

從上面的圖中可以看出mybatis中整個類型處理器實現架構,typehandler接口定義了類型處理器,而typereference抽象類則定義了一個類型引用,用于引用一個泛型類型(此處很抽象,不好理解,詳見后續解析),basetypehandler則是類型處理器的基礎,是所有類型處理器的公共模塊,幾乎所有的類型處理器都是通過直接繼承basetypehandler來實現的。

一、原理

使用場景:mybatis在預處理語句(preparedstatement)中設置一個參數時,或者從結果集(resultset)中取出一個值時,都會用到typehandler。它的作用就是將java類型(javatype)轉化為jdbc類型(jdbctype),或者將jdbc類型(jdbctype)轉化為java類型(javatype)。

二、自定義類型處理器

實現typehandler接口或者繼承basetypehandler

typehandler是一個接口,它定義了如下四個方法,實現類必須去實現,方法如下:

?
1
2
3
4
5
6
7
8
void setparameter(preparedstatement var1, int var2, t var3,jdbctype var4) throws sqlexception;
 
 t getresult(resultset var1, string var2) throws sqlexception;
 
 t getresult(resultset var1, int var2) throws sqlexception;
 
 t getresult(callablestatement var1, int var2) throws sqlexception;
}

setparameter:通過preparedstatement對象設置參數,將t類型的數據存入數據庫。

getresult:通過列名或者下標來獲取結果數據,也可以通過callablestatement獲取數據。

三、案例(自定義敏感字段加解密處理器)

mytypehandler實現typehandler接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.mdd.mybatis.typehandle;
 
import com.mdd.mybatis.util.desutil;
import org.apache.commons.lang3.stringutils;
import org.apache.ibatis.type.jdbctype;
import org.apache.ibatis.type.typehandler;
 
import java.sql.callablestatement;
import java.sql.preparedstatement;
import java.sql.resultset;
import java.sql.sqlexception;
 
public class mytypehandle implements typehandler<string> {
 private static string key = "123456";
 
 @override
 public void setparameter(preparedstatement preparedstatement, int i, string s, jdbctype jdbctype) throws sqlexception {
  try {
   string encrypt = desutil.encrypt(s, key);
   preparedstatement.setstring(i, encrypt);
  } catch (exception e) {
   e.printstacktrace();
  }
 }
 
 @override
 public string getresult(resultset resultset, string s) throws sqlexception {
  string result = resultset.getstring(s);
  if (stringutils.isnotempty(result)) {
   try {
    return desutil.decrypt(result, key);
   } catch (exception e) {
    e.printstacktrace();
   }
  }
  return result;
 }
 
 @override
 public string getresult(resultset resultset, int i) throws sqlexception {
  string result = resultset.getstring(i);
  if (stringutils.isnotempty(result)) {
   try {
    return desutil.decrypt(result, key);
   } catch (exception e) {
    e.printstacktrace();
   }
  }
  return result;
 }
 
 @override
 public string getresult(callablestatement callablestatement, int i) throws sqlexception {
  string result = callablestatement.getstring(i);
  if (stringutils.isnotempty(result)) {
   try {
    return desutil.decrypt(result, key);
   } catch (exception e) {
    e.printstacktrace();
   }
  }
  return result;
 }
}

配置注冊自定義處理器(mybatis.cfg.xml)

?
1
2
3
4
<!--自定義類型處理器-->
<typehandlers>
 <typehandler handler="com.mdd.mybatis.typehandle.mytypehandle"></typehandler>
</typehandlers>

使用自定義處理器(mapper文件)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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.mdd.mybatis.dao.userdao" >
 <resultmap id="baseresultmap" type="com.mdd.mybatis.dao.vo.user">
  <id column="user_id" property="userid" jdbctype="varchar"/>
  <result column="name" property="name" typehandler="com.mdd.mybatis.typehandle.mytypehandle"/>
  <result column="password" property="password" jdbctype="varchar"/>
  <result column="age" property="age" jdbctype="integer"/>
 </resultmap>
 
 <sql id="base_column_list" >
  user_id,name,password, age
 </sql>
 
 <insert id="saveuser">
  insert into t_user(user_id,name, password, age) values (
  #{userid,jdbctype=varchar},#{name,jdbctype=varchar},
  #{password,jdbctype=varchar},#{age,jdbctype=integer}
  )
 </insert>
 
 <insert id="saveuserwithtype">
  insert into t_user(user_id,name, password, age) values (
  #{userid,jdbctype=varchar},#{name,typehandler=com.mdd.mybatis.typehandle.mytypehandle},
  #{password,jdbctype=varchar},#{age,jdbctype=integer}
  )
 </insert>
 
 <select id="queryuser" resultmap="baseresultmap">
  select * from t_user where user_id = #{userid,jdbctype=varchar}
 </select>
 
</mapper>

通過上面的配置,自定義的typehandler就會生效,敏感字段的加解密在dao層就可以解決,對上層業務無感,使用相當方便,也更加靈活。

參考 http://www.mybatis.org/mybatis-3/configuration.html#typehandler

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.cnblogs.com/xwlhyy1072552712/p/9615877.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色网在线观看 | 99热精品69堂国产 | 国产精品久久久免费视频 | 日本成人黄色网址 | 91热国内精品永久免费观看 | 国产精品久久久久影院色老大 | 色噜噜狠狠狠综合曰曰曰88av | 无遮挡h肉动漫在线观看电车 | 趴好撅高打屁股sp调教h | 好湿好紧好大野战 | 久久高清一级毛片 | 精选国产AV精选一区二区三区 | 黄 色 成 年人在线 幻女free性俄罗斯第一次摘花 | 欧美兽皇video | 明星ai人脸替换造梦在线播放 | 蜜桃久久久亚洲精品成人 | 亚洲va天堂va国产va久久 | 国产一级一级片 | 小早川怜子亚洲综合中文字幕 | 暖暖 免费 高清 日本 在线1 | 禁忌4中文 | 99热这里只精品99re66 | 亚洲色图二区 | 华人在线视频 | 91国语自产拍在线观看 | 亚洲网站在线 | 久久这里都是精品 | 久久99r66热这里只有精品 | 女海盗斯蒂内塔的复仇2免费观看 | 国产精品女主播大秀在线 | 欧美一级视频在线 | 亚洲精品短视频 | 我和么公的秘密小说免费 | 公翁的舌尖研磨她的花蒂小说 | 精品牛牛影视久久精品 | 免费高清资源黄网站在线观看 | 无敌秦墨漫画免费阅读 | 国产伦精品一区二区 | 波多野结衣一区免费作品 | 18性夜影院午夜寂寞影院免费 | 日韩影院在线 |