自定义DateTypeHandler实现

MyBatis核心配置文件深入_自定义DateTypeHandler实现

在Java文件夹下的com.ffyc包下创建一个handler包, 在handler包下创建一个自定义类DateTypeHandler, 要继承与我们的BaseTypeHandler< T>类

  • 此时我们是对Java中的Date数据进行一个类型转换, 所以这里T泛型要设置为Date类型
  • 这个转换器是用于将Java中的Date转到数据库中时转换为我们自己想转换的一种类型, 此时我们是转换为数据库中的bigInt类型

举例说明:

我们在user表中加一个birthday字段(bigint类型), 然后我们在User实体类中加入一个birthday属性(Date类型), 我们这里要将Java中的Date类型的数据和数据库中的bigint类型进行一个转换

给出DateTypeHandler类:

public class DateTypeHandler extends BaseTypeHandler<Date>{
    //将Java类型转换为数据库中的bigint类型
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType)throw SQLException{
        //将Date类型转为java中的long类型之后填充到占位符中
        long time = date.getTime();
        
        //这里其实就是执行了一个填充占位符的功能
        preparedStatement.setLong(i,time);
    }
    
    //将数据库中的BigInt类型转换为Java中类型时转换为Date类型
    public Date getNullableResult(ResultSet resultSet , String s)throws SQLException{
        long time = resultSet.getLong(s);
        Date date = new Date(time);
        returrn date;
    } 
    
    //注意: 对于数据库中的数据转Java类型时我们的BaseTypeHandler类中还提供了两个重载方法:
    
    public Date getNullableResult(ResultSet resultSet, int i)throws SQLException{
        long time = resultSet.getLong(i);
        Date date = new Date(time);
        return date;
    }
    
    public Date getNullableResult(CallableStatement callableStatement, int i)throws SQLException{
        long time = resultSet.getLong(i);
        Date date = new Date(time);
        return date;
    }
}
关于setNonNullParameter()方法的小结:
  1. 形参i 是我们要填充的占位符的索引位置

  2. 我们形参中的date就是我们Java中要转换的Date类型的数据, 我们要将这个date转为我们想要的BigInt类型, 填充到占位符中即可

    • 注意: 因为java中的long其实就相当于mysql中的bigint类型, 我们这类设置占位符的时候是在Java程序中, 所以肯定是调用setLong()方法, 而不是setBigInt()方法, 我们可以发现没有setBigInt()方法, 就是因为我们填充占位符的时候肯定是填充的Java中的数据, 所以肯定是Java中的数据类型, Java中是没有BigInt类型的, 只是我们将Java中的long类型数据填充之后最终真正使用到数据库中的时候就是会自动转换为对应的bigint类型
      • 所以: java中的long 对应了 mysql中的bigint
关于getNullableResult()方法的小结:
  1. 我们一共提供了三种getNullableResult()重载方法
  2. 第一个重载方法和第二个重载方法中形参中都提供了ResultSet接口类型的对象, 也就是结果集对象, 而第三个重载方法中提供的则是CallableStatement接口类型的对象
    • 之所以提供CallableStatement接口类型的对象也可以就是因为我们的CallableStatement接口中还定义有获取结果集数据的方法, 而PreparedStatement接口中则没有
  3. 第一个重载方法中提供了形参String类型的s是要转换的字段名称, 而第二个和第三个重载方法中则是提供了int类型的i 表示的是要转换的字段在结果集中的索引位置

注册类型处理器:

核心配置文件中:
<typeHandlers>
    <typeHandler handler = "com.ffyc.handler.DateTypeHandler"></typeHandler>
</typeHandlers>
  • typeHandlers标签是定义在configuration标签中的子标签, 在configuration标签中的子标签都是有顺序的, 所以我们一定要注意typeHandler标签的位置

最后我们编写一个测试类进行一个测试:

  1. 我们先进行一个添加操作, 将Java中某个实体类中的Date类型的属性值存储到数据库中, 看看是否变换为了数据库中的bigInt类型
  2. 再编写一个插叙操作, 将数据库中的对应记录查询出来封装到Java实体类中之后看看在数据库中的类型为biging的字段是否变为了Date类型的属性

补充:

  1. 我们的填充占位符的时候的占位符索引和获取结果集中某个索引位置的字段值时的索引都是从1开始的, 这个索引并不是Java中的索引

  2. 填充占位符的时候我们只能是通过索引定位到要填充的位置, 所以我们上面的setLong()方法中要传入的只能是要填充的占位符的索引和要填充的占位符的值, 而我们如果是获取结果集中某个字段的值的时候, 这个时候结果集中不仅仅我们可以通过索引位置来定位到某个字段, 还可以使用字段名来定位到某个字段, 所以我们使用结果集获得某个字段值的时候我们就可以使用索引来获取, 也可以通过字段名来获取

单词积累:

non-null : 不为空

nullable : 可为空

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以使用自定义注解来实现AOP(面向切面编程)。AOP是一种编程范型,它允许开发者在程序运行时动态地将代码切入到已有代码的特定位置。 下面是一个简单的示例,演示如何使用自定义注解实现AOP。 首先,我们需要定义一个自定义注解: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Loggable { } ``` 这个注解用来标记需要记录日志的方法。它的@Target注解指定了它只能用于方法上,@Retention注解指定了它的生命周期是运行时。 接下来,我们创建一个切面类,用来实现AOP的逻辑: ``` @Aspect @Component public class LoggingAspect { @Before("@annotation(com.example.Loggable)") public void logMethodCall(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("Method " + methodName + " called"); } } ``` 这个类使用Spring AOP框架提供的@Aspect注解来标记它是一个切面类。它的@Before注解指定了它要在被@Loggable注解标记的方法之前执行。JoinPoint参数包含了被拦截的方法的信息,我们可以从中获取方法名等信息。 最后,在需要记录日志的方法上加上@Loggable注解即可: ``` @Component public class MyService { @Loggable public void doSomething() { // do something } } ``` 当doSomething()方法被调用时,LoggingAspect中的logMethodCall()方法会被执行,记录方法调用信息。 这就是使用自定义注解实现AOP的基本步骤。当然,实际应用中会更加复杂,需要更多的切面逻辑和注解参数等。但是这个简单的示例可以帮助你理解如何使用自定义注解实现AOP。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值