日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Mybatis自定義類型轉換,數據加密解密全攻略【實戰】

來源: 責編: 時間:2023-10-06 19:17:54 372觀看
導讀環境:springboot2.6.12 + MyBatis3.5.6 + MySQLMyBatis是一種優秀的持久層框架,它支持自定義類型轉換和數據加密解密。通過自定義類型轉換,你可以輕松地將數據庫中的數據類型轉換為Java對象中的數據類型,以及將Java對象中

環境:springboot2.6.12 + MyBatis3.5.6 + MySQLYcc28資訊網——每日最新資訊28at.com

MyBatis是一種優秀的持久層框架,它支持自定義類型轉換和數據加密解密。通過自定義類型轉換,你可以輕松地將數據庫中的數據類型轉換為Java對象中的數據類型,以及將Java對象中的數據類型轉換為數據庫中的數據類型。而數據加密解密則可以提高數據的安全性,保護敏感信息不被泄露。在MyBatis中,你可以使用類型處理器(TypeHandler)來實現自定義類型轉換,使用加密和解密算法來實現數據加密解密。Ycc28資訊網——每日最新資訊28at.com

本案例使用自定義類型轉換器對數據列進行加解密Ycc28資訊網——每日最新資訊28at.com

1. 依賴及相關配置

<dependencies>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId>  </dependency>  <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <scope>runtime</scope>  </dependency>  <dependency>    <groupId>org.mybatis.spring.boot</groupId>    <artifactId>mybatis-spring-boot-starter</artifactId>    <version>2.1.4</version>  </dependency>  <dependency>    <groupId>com.github.pagehelper</groupId>    <artifactId>pagehelper-spring-boot-starter</artifactId>    <version>1.3.0</version>  </dependency></dependencies>
spring:  datasource:    driverClassName: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/testjpa?serverTimezone=GMT%2B8    username: root    password: xxxxx    type: com.zaxxer.hikari.HikariDataSource    hikari:      minimumIdle: 10      maximumPoolSize: 200      autoCommit: true      idleTimeout: 30000      poolName: MasterDatabookHikariCP      maxLifetime: 1800000      connectionTimeout: 30000      connectionTestQuery: SELECT 1---spring:  jpa:    generateDdl: false    hibernate:      ddlAuto: update    openInView: true    show-sql: true---pagehelper:  helperDialect: mysql  reasonable: true  pageSizeZero: true  offsetAsPageNum: true  rowBoundsWithCount: true---mybatis:  type-aliases-package: com.pack.domain  mapper-locations:  - classpath:/mappers/*.xml  configuration:    lazy-loading-enabled: true    aggressive-lazy-loading: false---logging:  level:    com.pack.mapper: debug

實體對象

@Entity@Table(name = "BC_PERSON")public class Person extends BaseEntity {  private String name ;  private String idNo ;}

這里是用JPA來幫助我們生成數據表。Ycc28資訊網——每日最新資訊28at.com

2. 自定義類型轉換器及數據加解密工具

public class EncryptTypeHandler implements TypeHandler<String> {  @Override  public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {    ps.setString(i, EncryptUtils.encrypt(parameter)) ;  }  @Override  public String getResult(ResultSet rs, String columnName) throws SQLException {    String value = rs.getString(columnName) ;    if (value == null || value.length() == 0) {      return null ;    }    return EncryptUtils.decrypt(value);  }  @Override  public String getResult(ResultSet rs, int columnIndex) throws SQLException {    String value = rs.getString(columnIndex) ;    if (value == null || value.length() == 0) {      return null ;    }    return EncryptUtils.decrypt(value);  }  @Override  public String getResult(CallableStatement cs, int columnIndex) throws SQLException {    String value = cs.getString(columnIndex) ;    if (value == null || value.length() == 0) {      return null ;    }    return EncryptUtils.decrypt(value);  }}

加解密工具類Ycc28資訊網——每日最新資訊28at.com

public class EncryptUtils {  private static final String secretKey = "1111222244445555" ;  private static final String ALGORITHM  = "AES" ;  public static String encrypt(String data) {    try {      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding") ;      cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secretKey.getBytes(), ALGORITHM)) ;      return Hex.encode(cipher.doFinal(data.getBytes())) ;    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {      e.printStackTrace();      return null ;    }  }  public static String decrypt(String secretText) {    try {      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding") ;      cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey.getBytes(), ALGORITHM)) ;      return new String(cipher.doFinal(Hex.decode(secretText))) ;    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {      e.printStackTrace();      return null ;    }  }  private static class Hex {    private static final char[] HEX = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };    public static byte[] decode(CharSequence s) {      int nChars = s.length();      if (nChars % 2 != 0) {        throw new IllegalArgumentException("16進制數據錯誤");      }      byte[] result = new byte[nChars / 2];      for (int i = 0; i < nChars; i += 2) {        int msb = Character.digit(s.charAt(i), 16);        int lsb = Character.digit(s.charAt(i + 1), 16);        if (msb < 0 || lsb < 0) {          throw new IllegalArgumentException("Detected a Non-hex character at " + (i + 1) + " or " + (i + 2) + " position");        }        result[i / 2] = (byte) ((msb << 4) | lsb);      }      return result;    }    public static String encode(byte[] buf) {      StringBuilder sb = new StringBuilder() ;      for (int i = 0, leng = buf.length; i < leng; i++) {        sb.append(HEX[(buf[i] & 0xF0) >>> 4]).append(HEX[buf[i] & 0x0F]) ;      }      return sb.toString() ;    }  }}

Mapper及XML文件

@Mapperpublic interface PersonMapper {  List<Person> queryPersons() ;  int insertPerson(Person person) ;}
<mapper namespace="com.pack.mapper.PersonMapper">  <resultMap type="com.pack.domain.Person" id="PersonMap">    <id column="id" property="id"/>    <result column="name" property="name"/>    <result column="id_no" property="idNo" typeHandler="com.pack.mybatis.EncryptTypeHandler"/>    <result column="create_time" property="createTime"/>  </resultMap>  <select id="queryPersons" resultMap="PersonMap">    SELECT * FROM bc_person  </select>  <insert id="insertPerson" parameterType="com.pack.domain.Person">    insert into bc_person (id, name, id_no, create_time) values (#{id}, #{name}, #{idNo, typeHandler=com.pack.mybatis.EncryptTypeHandler}, #{createTime})  </insert></mapper>

查詢數據時在resultMap中的result中配置typeHandler="com.pack.mybatis.EncryptTypeHandler",指明該列的類型轉換。Ycc28資訊網——每日最新資訊28at.com

在insert中對具體的列進行指明類型轉換。Ycc28資訊網——每日最新資訊28at.com

3. 測試

@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringBootComprehensiveApplicationTests {  @Resource  private PersonMapper personMapper ;  @Test  public void testInsertMapper() {    com.pack.domain.Person person = new com.pack.domain.Person() ;    person.setId("0001") ;    person.setCreateTime(new Date()) ;    person.setIdNo("111111") ;    person.setName("中國") ;    personMapper.insertPerson(person) ;  }  @Test  public void testQueryUers() {    System.out.println(personMapper.queryPersons()) ;  }}

圖片圖片Ycc28資訊網——每日最新資訊28at.com

Ycc28資訊網——每日最新資訊28at.com

插入數據時數據已經被我們自定義的類型轉換器進行了加密處理。Ycc28資訊網——每日最新資訊28at.com

圖片圖片Ycc28資訊網——每日最新資訊28at.com

查詢數據進行了解密處理。Ycc28資訊網——每日最新資訊28at.com

完畢!!!Ycc28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-12115-0.htmlMybatis自定義類型轉換,數據加密解密全攻略【實戰】

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 微軟為 VS Code 正式推出 C# 開發套件

下一篇: 尤雨溪:Vite 的現狀與未來展望

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美精品在线网站| 午夜亚洲性色视频| 黄色成人在线| 在线观看视频亚洲| 日韩视频一区二区三区在线播放 | 国产人妖伪娘一区91| 国产一区av在线| 亚洲激情视频在线| 亚洲视频免费在线| 久久精品一区二区三区不卡| 欧美国产欧美综合| 国产精品免费一区二区三区观看| 国产精品视频区| 在线不卡免费欧美| 一区二区动漫| 久久久综合免费视频| 欧美日韩一区二区三区在线视频| 国产精品日韩在线一区| 亚洲第一黄色| 亚洲视频在线看| 久久亚洲影音av资源网| 欧美色另类天堂2015| 激情小说亚洲一区| 亚洲一区二区网站| 免费欧美在线| 国产精品一区毛片| 亚洲日韩欧美视频一区| 欧美一级午夜免费电影| 欧美精品一区二区三区蜜桃| 国产亚洲一级高清| 国产精品99久久久久久宅男| 玖玖玖国产精品| 国产精自产拍久久久久久蜜| 亚洲精品极品| 久久久久99| 国产精品少妇自拍| 亚洲乱码国产乱码精品精天堂| 欧美亚洲视频| 欧美日韩免费一区| 在线观看一区| 欧美在线999| 欧美午夜一区| 亚洲日韩第九十九页| 久久蜜桃资源一区二区老牛| 国产精品一区二区视频| 亚洲视频一区二区在线观看| 欧美激情免费观看| 在线激情影院一区| 欧美伊人久久久久久午夜久久久久| 欧美日本高清视频| 在线不卡免费欧美| 久久精品视频免费播放| 欧美日韩亚洲精品内裤| 亚洲观看高清完整版在线观看| 亚洲男人影院| 欧美人妖在线观看| 亚洲国产精品电影| 久久久最新网址| 国产欧美日韩综合一区在线观看| 亚洲美女黄色| 蜜桃精品一区二区三区| 激情成人av| 久久精品视频在线看| 国产精品一二一区| 亚洲一区图片| 国产精品久久久久久久浪潮网站| 亚洲精品乱码久久久久久久久| 久久三级视频| 黄色成人免费网站| 久久精品综合| 韩国三级电影一区二区| 欧美在线免费视屏| 国产日韩精品久久| 欧美伊久线香蕉线新在线| 国产精品色婷婷久久58| 亚洲欧美精品suv| 国产精品日日摸夜夜摸av| 亚洲一区亚洲| 国产精品一区二区久久| 性久久久久久久久| 国产婷婷一区二区| 久久精品中文字幕一区| 精品二区视频| 免费观看国产成人| 亚洲欧洲精品一区二区精品久久久| 久久综合网hezyo| 亚洲国产成人精品久久久国产成人一区| 欧美制服丝袜第一页| 国产亚洲欧洲997久久综合| 欧美中文在线观看| 国产一区二区在线观看免费| 久久精品一区二区国产| 尤物九九久久国产精品的特点 | 国产一区二区日韩精品欧美精品| 亚洲欧美成aⅴ人在线观看| 国产精品久久久久一区二区| 亚洲制服丝袜在线| 国产欧美日韩在线视频| 久久精品国产免费观看| 一区在线播放| 欧美国产日韩一区二区| 一区二区三区回区在观看免费视频| 欧美护士18xxxxhd| 一本色道久久综合亚洲精品婷婷| 欧美色另类天堂2015| 亚洲一区在线直播| 国产精品自在欧美一区| 久久xxxx精品视频| 在线观看欧美日韩国产| 欧美激情第8页| 亚洲一区二区在线| 国产一区二区三区电影在线观看 | 欧美午夜不卡| 香蕉久久一区二区不卡无毒影院| 国产日韩欧美一区| 久久婷婷成人综合色| 亚洲精品欧美| 国产精品欧美久久| 久久午夜国产精品| 日韩视频专区| 国产欧美日韩| 女同一区二区| 亚洲性视频h| 狠狠做深爱婷婷久久综合一区 | 亚洲性夜色噜噜噜7777| 国产亚洲欧美另类一区二区三区| 久久久综合精品| 日韩一级黄色av| 国产婷婷一区二区| 欧美顶级大胆免费视频| 亚洲专区欧美专区| 在线观看视频日韩| 欧美午夜精品久久久久久浪潮| 亚洲欧美激情视频在线观看一区二区三区 | 中国成人在线视频| 国产亚洲一区二区精品| 欧美激情综合色| 欧美亚洲一区二区在线观看| 亚洲精品黄色| 国产精品综合网站| 免费视频最近日韩| 亚洲欧美日韩在线播放| 91久久精品一区二区别| 国产欧美日韩在线播放| 欧美国产综合一区二区| 欧美在线不卡| 日韩视频在线观看一区二区| 国产综合视频在线观看| 欧美视频日韩视频在线观看| 久久综合色综合88| 亚洲欧美日韩第一区| 亚洲精品国产精品乱码不99按摩| 国产精品私房写真福利视频| 欧美国产丝袜视频| 欧美专区第一页| 一区二区三区精品视频| 在线精品国精品国产尤物884a| 欧美午夜宅男影院| 欧美aa国产视频| 久久九九免费| 亚洲欧美在线视频观看| 日韩天堂在线视频| 亚洲大片一区二区三区| 国产日韩欧美综合在线| 国产精品国产自产拍高清av| 欧美成人网在线| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲永久免费av| 日韩视频―中文字幕| 久久精品在线视频| 亚洲午夜小视频| 亚洲精品一级| 亚洲高清在线| 国产在线精品自拍| 国产精品一区在线观看| 欧美日韩一区二区三区高清| 欧美高清视频一二三区| 久久综合九色综合久99| 久久免费午夜影院| 久久国产精彩视频| 午夜精品久久久久| 亚洲一区二区三区高清不卡| 一区二区久久久久| 亚洲精品影院| 亚洲精品少妇| 亚洲精品看片| 亚洲区欧美区| 亚洲人成毛片在线播放| 亚洲国内自拍| 亚洲高清av| 亚洲国产精品va| 亚洲国产视频一区| 亚洲黑丝一区二区| 亚洲国产一区二区视频| 亚洲国产欧美日韩精品| 在线免费观看欧美| 亚洲第一精品夜夜躁人人爽| 在线观看欧美| 亚洲国产精品黑人久久久| 亚洲成人直播| 91久久综合| 亚洲毛片av在线| 一本色道久久综合亚洲精品高清| 黑人一区二区|