惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
T
Threatpost
T
Tenable Blog
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
C
Cisco Blogs
H
Heimdal Security Blog
Attack and Defense Labs
Attack and Defense Labs
A
About on SuperTechFans
Last Week in AI
Last Week in AI
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
V
V2EX
Cyberwarzone
Cyberwarzone
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
PCI Perspectives
PCI Perspectives
P
Privacy International News Feed
D
Docker

博客园 - SmilingEye

每天5分钟,用碎片时间搞定软考系统架构设计师600词 2025年9月Java后端招聘市场技术风向标:666份招聘数据深度解读 微信小程序PDF签名 DBLock 面试题:ReentrantLock 实现原理 docker 升级(软件包离线方式) tomcat设置https 使用fastjson时spring security oauth2获取token格式变化 springboot之cookie操作 使用sed将win换行符转linux与linux换行符转win linux修改权限后git pull出现冲突 JWT简介 jenkins之SSH Publishers连接windows Windows安装OpenSSH服务 jenkins从远程服务器下载 mybatis-sqlite日期类型对应关系 docker安装postgresql docker常用命令 java sqlite docker,sqlite出错
重写mybatis的字符串类型处理器
SmilingEye · 2019-12-13 · via 博客园 - SmilingEye

1.简介

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

StringTypeHandler是MyBatis默认的字符串类型处理器。下面我们将重新写一个字符串类型处理器。

mybatis官方文档:

https://www.w3cschool.cn/mybatis/7zy61ilv.html

https://mybatis.org/mybatis-3/zh/getting-started.html

2.实现目标

插入数据库的字符串类型,在后面加一个0-100的随机数,例如:“张三”插入数据变成“张三-10”。

读取数据库的字符串类型,去掉后面的随机数,例如:“张三-10”读取为“张三”。

3.实现步骤

3.1application.yml修改配置

mybatis: 
  mapper-locations: classpath:mybatis/*.xml
  type-handlers-package: com.springboot.springbootstart.mybatis

主要是需要加入mybatis.type-handlers-package: com.springboot.springbootstart.mybatis

com.springboot.springbootstart.mybatis为ExampleTypeHandler类的包名

3.2新增ExampleTypeHandler继承BaseTypeHandler

package com.springboot.springbootstart.mybatis;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Random;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
@MappedJdbcTypes(value = JdbcType.VARCHAR, includeNullJdbcType = true)
public class ExampleTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { Random r = new Random(); ps.setString(i, parameter + "-" + String.valueOf(r.nextInt(101))); } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return getNewField(rs.getString(columnName)); } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return getNewField(rs.getString(columnIndex)); } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return getNewField(cs.getString(columnIndex)); } private String getNewField(String field) { int index = field.lastIndexOf("-"); return field.substring(0, index); } }

完成以上两步就将StringTypeHandler替换ExampleTypeHandler了,下面做插入和查询测试。

3.3测试

mapper的写法

    <insert id="insert" parameterType="com.springboot.springbootstart.entity.User">
        insert into user
          (id, username, name, age)
        values
          (#{id},#{username},#{name},#{age})
    </insert>

    <select id="get" resultType="com.springboot.springbootstart.entity.User">
        SELECT t.id            ,
               t.username    ,
               t.name        ,
               t.age        ,
               t.create_time 
          FROM user t
    </select>

只贴测试方法的代码

    @Test
    @Transactional
    @Rollback(false)
    public void insert(){
        User user = new User();
        user.setId("8");
        user.setUsername("user1");
        user.setName("王五");
        user.setAge(18);
        userService.insert(user);
    }
    
    @Test
    public void get(){
        try{
            List<User> list = userService.get();
            for(User user : list){
                System.err.println(user);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

数据库结果

 查询结果

User(id=8, username=user1, name=王五, age=18, createTime=null)

4.其他配置和用法说明

4.1mybatis.type-handlers-package: com.springboot.springbootstart.mybatis可以使用在ExampleTypeHandler加上@Component替代

4.2@MappedJdbcTypes(value = JdbcType.VARCHAR, includeNullJdbcType = true)中includeNullJdbcType指不写jdbcType=VARCHAR是否使用此处理器,默认为false