当前位置:首页 > 科技  > 软件

Mybatis自定义类型转换,数据加密解密全攻略【实战】

来源: 责编: 时间:2023-10-06 19:17:54 404观看
导读环境:springboot2.6.12 + MyBatis3.5.6 + MySQLMyBatis是一种优秀的持久层框架,它支持自定义类型转换和数据加密解密。通过自定义类型转换,你可以轻松地将数据库中的数据类型转换为Java对象中的数据类型,以及将Java对象中

环境:springboot2.6.12 + MyBatis3.5.6 + MySQLe6928资讯网——每日最新资讯28at.com

MyBatis是一种优秀的持久层框架,它支持自定义类型转换和数据加密解密。通过自定义类型转换,你可以轻松地将数据库中的数据类型转换为Java对象中的数据类型,以及将Java对象中的数据类型转换为数据库中的数据类型。而数据加密解密则可以提高数据的安全性,保护敏感信息不被泄露。在MyBatis中,你可以使用类型处理器(TypeHandler)来实现自定义类型转换,使用加密和解密算法来实现数据加密解密。e6928资讯网——每日最新资讯28at.com

本案例使用自定义类型转换器对数据列进行加解密e6928资讯网——每日最新资讯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来帮助我们生成数据表。e6928资讯网——每日最新资讯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);  }}

加解密工具类e6928资讯网——每日最新资讯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",指明该列的类型转换。e6928资讯网——每日最新资讯28at.com

在insert中对具体的列进行指明类型转换。e6928资讯网——每日最新资讯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()) ;  }}

图片图片e6928资讯网——每日最新资讯28at.com

e6928资讯网——每日最新资讯28at.com

插入数据时数据已经被我们自定义的类型转换器进行了加密处理。e6928资讯网——每日最新资讯28at.com

图片图片e6928资讯网——每日最新资讯28at.com

查询数据进行了解密处理。e6928资讯网——每日最新资讯28at.com

完毕!!!e6928资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12115-0.htmlMybatis自定义类型转换,数据加密解密全攻略【实战】

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 微软为 VS Code 正式推出 C# 开发套件

下一篇: 尤雨溪:Vite 的现状与未来展望

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 一加首款折叠屏!一加Open渲染图出炉:罕见单手可握小尺寸

    8月5日消息,此前就有爆料称,一加首款折叠屏手机将会在第三季度上市,如今随着时间临近,新机的各种消息也开始浮出水面。据悉,这款新机将会被命名为&ldquo;On
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
Top