• MyBatis-进阶2


    typeHandler

    typeHandler有什么用?

    你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型

    用法

    参考官网的示例:

    package com.xh.mybatisLearn.utils;
    
    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.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * Created by root on 3/2/18.
     */
    @MappedJdbcTypes(JdbcType.VARCHAR)
    @MappedTypes(String.class)
    public class ExampleTypeHandler extends BaseTypeHandler<String> {
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
            preparedStatement.setString(i, "in>>" + s);
        }
    
        public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
            return resultSet.getString(s);
        }
    
        public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
            return resultSet.getString(i);
        }
    
        public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            return callableStatement.getString(i);
        }
    }
    
    

    注册TypeHandler

        <typeHandlers>
            <typeHandler  handler="com.xh.mybatisLearn.utils.ExampleTypeHandler"/>
        </typeHandlers>
    

    插入时指定TypeHandler

        <insert id="addUser" useGeneratedKeys="true"
                keyProperty="id">
            insert into user_tb (username,age) VALUES (#{username,typeHandler=com.xh.mybatisLearn.utils.ExampleTypeHandler},#{age})
        </insert>
    
    

    结果:

    getAll>>User{id=17, username='in>>u1', age=21}
    

    plugin

    plugin有什么用?

    MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
    Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
    ParameterHandler (getParameterObject, setParameters)
    ResultSetHandler (handleResultSets, handleOutputParameters)
    StatementHandler (prepare, parameterize, batch, update, query)

    用法

    通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定了想要拦截的方法签名即可。
    参考官网示例:

    package com.xh.mybatisLearn.utils;
    
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.plugin.*;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.Properties;
    
    /**
     * Created by root on 3/2/18.
     */
    @Intercepts({@Signature(
            type = Executor.class,
            method = "query",
            args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
    public class ExamplePlugin implements Interceptor {
        private final Logger logger = LoggerFactory.getLogger(ExamplePlugin.class);
    
        public Object intercept(Invocation invocation) throws Throwable {
    
            MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
            BoundSql boundSql = ms.getBoundSql(invocation.getArgs()[1]);
            logger.info("==================== sql:{}", boundSql.getSql());
            return invocation.proceed();
        }
    
        public Object plugin(Object target) {
            return Plugin.wrap(target, this);
        }
    
        public void setProperties(Properties properties) {
            String some_string = properties.getProperty("some_string");
            logger.info("==================== some_string:{}", some_string);
        }
    }
    

    这个插件就是打印查询的sql,
    其中type对应:
    Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
    ParameterHandler (getParameterObject, setParameters)
    ResultSetHandler (handleResultSets, handleOutputParameters)
    StatementHandler (prepare, parameterize, batch, update, query)
    method对应:上面各项括号的方法
    args对应:method的参数

    plugin注册

        <plugins>
            <plugin interceptor="com.xh.mybatisLearn.utils.ExamplePlugin">
                <property name="some_string" value="some_string_xxxxxx"/>
            </plugin>
        </plugins>
    

    logger

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.21</version>
            </dependency>
    

    输出

    [main] INFO com.xh.mybatisLearn.utils.ExamplePlugin - ==================== some_string:some_string_xxxxxx
    [main] INFO com.xh.mybatisLearn.utils.ExamplePlugin - ==================== sql:select * from user_tb where id=?
    getOne>>User{id=12, username='u1', age=21}
    
  • 相关阅读:
    正则表达式
    webfrom 母版页
    repeater的command事件用法
    JVM进程cpu飙高分析
    @Transactional导致无法动态数据源切换
    mysql分页查询优化(索引延迟关联)
    MAC下安装Homebrew 和 @权限的问题
    RabbitMQ安装以及集群部署
    RabbitMQ 延时消息队列
    java 实现生产者-消费者模式
  • 原文地址:https://www.cnblogs.com/lanqie/p/8493704.html
Copyright © 2020-2023  润新知