需求: 数据入库前过滤emoji表情
1.编写typeHandler类
@MappedJdbcTypes({JdbcType.VARCHAR})
public class EmojiStringTypeHandler extends StringTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
super.setNonNullParameter(ps, i, StringUtils.filterEmoji(parameter), jdbcType);
}
}
其中emoji过滤:
public static String filterEmoji(String source) {
int len = source.length();
StringBuilder buf = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (isNotEmojiCharacter(codePoint)) {
buf.append(codePoint);
}
}
return buf.toString();
}
private static boolean isNotEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}
3.在mapper.xml中,对要过滤的字段进行显式的type声明,如:
INSERT INTO table (
id,
apply_no,
cert_id,
customer_name,
app_remark,
pc_remark
) VALUES (
#{id},
#{applyNo},
#{certId},
#{customerName, jdbcType=VARCHAR},
#{appRemark, jdbcType=VARCHAR},
#{pcRemark, jdbcType=VARCHAR}
)