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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧洲网站 | 精品久久免费视频 | 美女扒开胸罩露出奶 | x8x8在线永久免费观看 | 国产综合第一页 | 国产黄频在线观看高清免费 | 精品在线免费观看视频 | 手机在线伦理片 | 日本综合在线观看 | 亚洲 欧美 国产 综合 播放 | 日韩在线中文字幕 | 日本黄色高清视频网站 | 热国产热综合 | 国产成人愉拍免费视频 | 91在线高清视频 | 国产精品激情综合久久 | 人人艹在线视频 | 日韩欧美亚洲天堂 | 久久99精国产一区二区三区四区 | 亚洲免费在线观看视频 | 国内精品久久久久久不卡影院 | 日本高清视频网站 | 2022国产麻豆剧果冻传媒入口 | 日韩黄色影视 | 被教官揉了一晚上的奶小说 | 日剧整部剧护妻狂魔免费观看全集 | 国产一卡2卡3卡四卡精品网 | 鄂州一家三口完整版免费 | 亚洲成年人免费网站 | 91国内精品久久久久怡红院 | 欧美va在线播放免费观看 | 国产亚洲欧美日韩俺去了 | 欧美一级裸片 | 四川女人偷人真实视频 | 成人私人影院在线观看网址 | 我的青梅竹马是消防员2季未增删免费 | 日韩欧美亚洲一区二区综合 | 免费精品国产在线观看 | 性派对videos18party | 91天堂素人97年清纯嫩模 | 国模娜娜一区二区三区 |