MyBatis本身并不直接提供数据加密的功能,但你可以通过自定义类型处理器(TypeHandler)来实现数据的加密和解密。以下是一个简单的示例,展示如何使用自定义类型处理器实现数据加密和解密:
public class EncryptUtil {
private static final String KEY = "your_key";
public static String encrypt(String data) {
if (data == null) {
return null;
}
StringBuilder encryptedData = new StringBuilder();
for (int i = 0; i < data.length(); i++) {
char originalChar = data.charAt(i);
char keyChar = KEY.charAt(i % KEY.length());
char encryptedChar = (char) (originalChar ^ keyChar);
encryptedData.append(encryptedChar);
}
return encryptedData.toString();
}
public static String decrypt(String encryptedData) {
if (encryptedData == null) {
return null;
}
StringBuilder decryptedData = new StringBuilder();
for (int i = 0; i < encryptedData.length(); i++) {
char encryptedChar = encryptedData.charAt(i);
char keyChar = KEY.charAt(i % KEY.length());
char decryptedChar = (char) (encryptedChar ^ keyChar);
decryptedData.append(decryptedChar);
}
return decryptedData.toString();
}
}
BaseTypeHandler:import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@MappedTypes(String.class)
public class EncryptDecryptTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, EncryptUtil.encrypt(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String encryptedData = rs.getString(columnName);
return encryptedData == null ? null : EncryptUtil.decrypt(encryptedData);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String encryptedData = rs.getString(columnIndex);
return encryptedData == null ? null : EncryptUtil.decrypt(encryptedData);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String encryptedData = cs.getString(columnIndex);
return encryptedData == null ? null : EncryptUtil.decrypt(encryptedData);
}
}
<typeHandlers>
<typeHandler handler="com.example.EncryptDecryptTypeHandler" javaType="String"/>
</typeHandlers>
public class User {
private Integer id;
private String name;
private String encryptedPassword; // 使用加密后的密码
// getter 和 setter 省略
}
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="encryptedPassword" column="encrypted_password" typeHandler="com.example.EncryptDecryptTypeHandler"/>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
这样,当你从数据库查询数据时,encryptedPassword字段会被自动解密;当你插入或更新数据时,password字段会被自动加密。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。