Mybatis对数据加密解密(AES加解密)操作

1:使用mybatis的BaseTypeHandler类,编写需要加密解密处理的类型

package com.example.poi.typeHandlers;import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;import java.nio.charset.StandardCharsets;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @Author xu* @create 2023/9/3 23*/
@MappedTypes(EncryptField.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class EncryptFieldTypeHandler extends BaseTypeHandler<EncryptField> {private static final byte[] KEYS = "balabalbalabala".getBytes(StandardCharsets.UTF_8);/*** 处理sql执行前相应的参数* @param * @param i 参数的索引下标* @param parameter* @param jdbcType* @throws SQLException*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, EncryptField parameter, JdbcType jdbcType) throws SQLException {if (parameter == null || parameter.getValue() == null) {ps.setString(i, null);return;}AES aes = SecureUtil.aes(KEYS);String encrypt = aes.encryptHex(parameter.getValue());ps.setString(i, encrypt);}/*** sql语句执行后执行的操作* @param rs* @param columnName* @return* @throws SQLException*/@Overridepublic EncryptField getNullableResult(ResultSet rs, String columnName) throws SQLException {return decrypt(rs.getString(columnName));}/*** sql语句执行后执行的操作* @param rs* @param columnIndex* @return* @throws SQLException*/@Overridepublic EncryptField getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return decrypt(rs.getString(columnIndex));}/*** sql语句执行后执行的操作* @param cs* @param columnIndex* @return* @throws SQLException*/@Overridepublic EncryptField getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return decrypt(cs.getString(columnIndex));}public EncryptField decrypt(String value) {if (null == value) {return null;}return new EncryptField(SecureUtil.aes(KEYS).decryptStr(value));}
}

只要数据库sql语句有对EncryptField类型的操作,就会触发EncryptFieldTypeHandler类的方法
@MappedTypes:表示该处理器会自动处理的java类型
@MappedJdbcTypes:表示处理器会自动处理的Jdbc类型

2: yml配置需要设置mybatis的type-handlers-package配置

mybatis-plus:mapper-locations: classpath*:com/example/poi/mapper/**/xml/*Mapper.xmlglobal-config:banner: falsedb-config:id-type: ASSIGN_IDtable-underline: truetype-handlers-package: com.example.poi.typeHandlers

3:传递phone字段是明文,查出结果phone是密文

    @GetMapping("/getTypeHandler")public EntityDemo typeHandler(String phone) {EncryptField encryptField = new EncryptField(phone);return entityDemoService.getOne(new LambdaQueryWrapper<EntityDemo>().eq(EntityDemo::getPhone, encryptField));}

4: 如果要求传递phone字段是明文,查出结果phone是明文

4-1:EntityDemo数据库表对于字段

@Data
@Accessors(chain = true)
@TableName(value = "entity_demo")
public class EntityDemo implements Serializable {private static final long serialVersionUID = 1L;@TableIdprivate Integer id;private String age;private String name;private String phone;
}

4-2:EntityDemoThree查询结果对于字段

@Data
public class EntityDemoThree implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String age;private String name;private EncryptField phone;}
    @GetMapping("/getTypeHandler")public EntityDemo typeHandler(String phone) {EncryptField encryptField = new EncryptField(phone);EntityDemoThree entityDemoThree = entityDemoService.typeHandler3(encryptField);EntityDemo entityDemo = new EntityDemo();BeanUtils.copyProperties(entityDemoThree, entityDemo);entityDemo.setPhone(entityDemoThree.getPhone().getValue());return entityDemo;}
EntityDemoThree typeHandler(EncryptField phone);
    @Overridepublic EntityDemoThree typeHandler(EncryptField phone) {return entityDemoMapper.typeHandler3(phone);}
    <select id="typeHandler3" resultType="com.example.poi.entity.EntityDemoThree">select *from entity_demowhere phone = #{phone}</select>

5:对于需要更新的字段最好进行如下条件更新操作

    <update id="refresh">UPDATE entity_demo<set ><if test="age != '' and age != null">age = #{age},</if><if test="name != '' and name != null">name = #{name},</if><if test="phone.value != '' and phone.value != null">phone = #{phone},</if></set>WHERE id = #{id}</update>

6:如果需要对其他类型进行加密,可以再添加多一个typeHandler类,添加一个List类加密如下:

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListTypeHandler extends BaseTypeHandler<List<String>> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {if (null == parameter || parameter.isEmpty()) {ps.setString(i, null);return;}ps.setString(i, String.join(",", parameter));}@Overridepublic List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {final String value = rs.getString(columnName);if (StringUtils.hasText(value)) {return Arrays.asList(value.split(","));}return null;}@Overridepublic List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {final String value = rs.getString(columnIndex);if (StringUtils.hasText(value)) {return Arrays.asList(value.split(","));}return null;}@Overridepublic List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {final String value = cs.getString(columnIndex);if (StringUtils.hasText(value)) {return Arrays.asList(value.split(","));}return null;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3+vite+ts项目适配各种分辨率解决方案

现在的电脑屏幕和尺寸越来越多样化&#xff0c;对于前端开发来说&#xff0c;适配各种屏幕成了大难题&#xff0c;开发中一个实际例子&#xff1a;开发一个导航栏&#xff0c;ui给的是1920*60的尺寸&#xff0c;前端开发的时候&#xff0c;在自己电脑缩放比例中开发的&#xff…

AOP到底是啥

AOP到底是啥 前言面向切面编程到底是啥意思那么要怎么实现面向切面编程呢&#xff1f;成果 前言 回忆起来&#xff0c;第一次听到这三字母是博主在上大二的时候&#xff0c;那时候看的一脸懵逼&#xff0c;现在马上研二了才想起来回顾下。 只记得当时面向对象编程还没整明白&…

TDengine(2):wsl2+ubuntu20.04+TDengine安装

一、ubuntu系统下提供了三种安装TDengine的方式&#xff1a; 二、通过 apt 指令安装失败 因为是linux初学者&#xff0c;对apt 指令较为熟悉&#xff0c;因此首先使用了该方式进行安装。 wget -qO - http://repos.taosdata.com/tdengine.key | sudo apt-key add -echo "…

【Linux】文件

Linux 文件 什么叫文件C语言视角下文件的操作文件的打开与关闭文件的写操作文件的读操作 & cat命令模拟实现 文件操作的系统接口open & closewriteread 文件描述符进程与文件的关系重定向问题Linux下一切皆文件的认识文件缓冲区缓冲区的刷新策略 stuout & stderr 什…

STM32 硬件IIC 控制OLED I2C卡死问题

#更新通知&#xff1a;2023-09-06 STM32L151 固件库 使用I2C 太难了&#xff0c;又宕机了&#xff0c;建议不要在固件库版本上尝试硬件IIC 了&#xff0c;一般人真用不了&#xff0c;直接使用软件模拟的&#xff0c;或者不要使用固件库了&#xff0c;用HAL 库吧&#xff0c;据说…

既要炫酷好看,又要出图快?可视化大屏模板了解下!

可视化大屏模板可以在很大程度上满足炫酷好看和出图快的需求。使用模板可以节约制作时间&#xff0c;像奥威BI系统就上线了大量的可视化大屏模板。这些模板实际上都是一张张完整的可视化大屏报表&#xff0c;从数据源到数据分析模型&#xff0c;再到数据可视化图表和智能分析功…

《vue3实战》运用push()方法实现电影评价系统的添加功能

目录 前言 电影评价系统的添加功能是什么&#xff1f; 电影评价系统的添加功能有什么作用&#xff1f; 一、push&#xff08;&#xff09;方法是什么&#xff1f;它有什么作用&#xff1f; 含义&#xff1a; 作用&#xff1a; 二、功能实现 这段是添加开始时点击按钮使…

支持CAN FD的Kvaser PCIEcan 4xCAN v2编码: 73-30130-01414-5如何应用?

这里是引用 Kvaser PCIEcan 4xCAN v2&#xff08;编码: 73-30130-01414-5&#xff09;是一款小巧而先进的多通道实时CAN接口&#xff0c;可发送和接收CAN总线上的标准和扩展CAN消息&#xff0c;时间戳精度高。其与所有使用Kvaser CANlib的应用程序兼容。 主要特性 PCI Express…

spring boot项目上传头像

应用还是验证码使用的原理&#xff1b;但是代码逻辑却有所不同。 逻辑前端传给后端&#xff0c;然后写入本机磁盘去&#xff0c;文件名用uuid避免重复。写完就可以顺带把文件名保存到数据库里。上传就这样子。 怎么取用的&#xff1b;还是通过配置映射的方式&#xff1b;通过sr…

vue3升级了些什么

Vue 3 升级了以下几个方面的内容&#xff1a; 响应式系统&#xff1a;Vue 3 使用了 Proxy 对象来替代 Vue 2 中的 Object.defineProperty&#xff0c;这使得响应式系统更加高效和灵活。Vue 3 的响应式系统可以追踪更细粒度的依赖关系&#xff0c;提供了更好的性能和更细致的响应…

OceanBase 单机租户最多能支持多少分区?

OceanBase 单机租户允许创建的最大分区数是多少&#xff1f;作者通过分区超限错误排查&#xff0c;计算出单机允许创建的最大分区数量。 作者&#xff1a;何文超&#xff0c;爱可生南区交付服务部 DBA 团队成员&#xff0c;主要负责 MySQL 故障处理&#xff0c;MySQL 高可用架构…

Bootstrap的行、列布局设计(网络系统设计)

目录 00-基础知识01-等宽列布局02-指定某一列的宽度03-根据内容自动改变列的宽度04-五种预定义列宽度 .col、.col-sm-*、.col-md-*、.col-lg-*、.col-xl-*05-不同视口宽度按不同的分列方案划分06-删除列内容的盒模型的外边距07-超过12列怎么办&#xff1f;08-重新排列各列的顺序…

继承(个人学习笔记黑马学习)

1、基本语法 #include <iostream> using namespace std; #include <string>//普通实现页面//Java页面 //class Java { //public: // void header() { // cout << "首页、公开课、登录、注册...(公共头部)" << endl; // } // void footer() …

【精品】NLP自然语言处理学习路线(知识体系)

当前&#xff0c;大规模预训练语言模型的强大对话问答、文本生成能力&#xff0c;将自然语言处理&#xff08;NLP&#xff09;的研究和应用推向了新一轮的热潮。NLP是计算机科学、人工智能和语言学等学科交叉的前沿领域。NLP的应用和研究范围非常的广泛&#xff0c;个人是没有找…

easyExcel合并单元格导出

一、导入maven依赖 &#xff08;很多旧项目自定义了一套Excel导出工具&#xff0c;poi版本可能不兼容&#xff0c;一般poi新旧版本不兼容分界线在3.17&#xff0c;选择3.17版本不会发生代码不兼容情况&#xff09; <dependency><groupId>com.alibaba</groupId&…

利用GitHub实现域名跳转

利用GitHub实现域名跳转 一、注册一个 github账号 你需要注册一个 github账号,最好取一个有意义的名字&#xff0c;比如姓名全拼&#xff0c;昵称全拼&#xff0c;如果被占用&#xff0c;可以加上有意义的数字. 本文中假设用户名为 UNIT-wuji(也是我的博客名) 地址: https:/…

Android使用osmdroid加载在线地图,离线地图以及各种填坑姿势

最近开发需要加载地图&#xff0c;包括离线瓦片和在线地图&#xff0c;因为百度和高德要掏钱并且不支持加载自己的瓦片&#xff0c;想着有没有开源的替代呢&#xff1f;发现了osmdroid这个开源库可以加载地图&#xff0c;但是关于开发资料中文少的可怜&#xff0c;有关博客都是…

Android——线程和线程池

线程和线程池 AsyncTaskIntentService线程池ThreadPoolExecutorFixedThreadPoolCachedThreadPoolScheduledExecutorSingleThreadExecutor AsyncTask 使用案例可看Android基础——异步消息处理&#xff0c;需要注意 AsyncTask必须在主线程中加载&#xff0c;在ActivityThread的…

装饰器模式简介

概念&#xff1a; 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;允许您在不改变现有对象结构的情况下&#xff0c;动态地将新功能附加到对象上。通过创建一个包装器类来扩展原始类的功能。这个包装器类具有与原始类相同的接口&#x…

对称二叉树(Leetcode 101)

题目 101. 对称二叉树 思路 使用层序遍历&#xff0c;遍历当前层的节点时&#xff0c;如该节点的左&#xff08;右&#xff09;孩子为空&#xff0c;在list中添加null&#xff0c;否则加入左&#xff08;右&#xff09;孩子的值。每遍历完一层则对当前list进行判断&#xff0c…