MyBatis05:类型转换器 您所在的位置:网站首页 sql中将字符串数字转换成数字 MyBatis05:类型转换器

MyBatis05:类型转换器

2024-03-26 13:14| 来源: 网络整理| 查看: 265

系列文章目录

MyBatis01:创建、运行、测试一个mybatis项目 MyBatis02:使用MyBatis查询数据 MyBatis03:嵌套查询、嵌套结果、延迟加载 MyBatis04:动态SQL MyBatis05:类型转换器 MyBatis06:分页插件、MyBatis配置文件中的标签 MyBatis07:MyBatis注解

文章目录 系列文章目录前言一、什么是类型转换器二、如何设置类型转换器1. 场景说明2. 分析——如何实现字符串和数组类型的相互转化3. 具体实现3.1 添加一个类型转化器的类继承BaseTypeHandler3.2 配置MyBatis框架的主配置文件3.3 自定义的类型转换器的使用 4. 测试 总结

前言

今天学的是类型转换器,在实际工作中需要我们做的不多,主要由项目领导来做,是整个项目共享的资源。

一、什么是类型转换器

类型转换器是用来做Java属性和数据库字段之间的类型转换的。在MyBatis框架中,有很多类型转换器,框架已经帮我们做好了,我们只需要设置一下Java属性和数据库字段的映射关系就可以了。但是如果我们有一些特殊的类型需要转换,就需要自己设定类型转换关系,也就是需要自己定义一个类型转换器。

二、如何设置类型转换器 1. 场景说明

例如,学生有一个属性hobbies,在Java中是一个数组类型的属性,在数据库中是字符串。我们该如何实现数组和字符串的类型转换。

2. 分析——如何实现字符串和数组类型的相互转化

数组转化为字符串,只需要拼接即可 而字符串转换为数组元素,就需要一个分割符,用来划分各数组元素,这里我们采用“,”来分隔

3. 具体实现

实现类型转换器的两种方式: ①重写TypeHandler接口 ②继承BaseTypeHandler实现类

3.1 添加一个类型转化器的类继承BaseTypeHandler

继承后需要重写四个方法。各参数的含义,以及字符串如何转换为数组,数组如何转化为字符串的具体实现如下:

package com.tentact.common; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /*String[] 是Java的数据类型*/ public class StringArrayTypeHandler extends BaseTypeHandler { /*这个方法获取 Java属性值 赋值给 数据库的字段*/ /*psmt是预处理命令,可以将Java属性赋值给数据库字段;i是第i个数据库字段;strings是Java属性*/ @Override public void setNonNullParameter(PreparedStatement psmt, int i, String[] strings, JdbcType jdbcType) throws SQLException { // 首先判断一下这个字符数组是否为空 if(strings != null) { // 如果不为空的话,就拼接字符串 String strs = ""; for (String str : strings) { strs += str + ","; } // 最后将这个字符串赋值给数据库字段 psmt.setString(i, strs); } } /*以下三个方法是 查询数据库字段 赋值给 Java属性*/ /*rs是从数据库中查询到的结果集;columnName是数据库的字段名或列名;通过列名获取数据库里的字段*/ @Override public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException { // 从数据库中获取到拼接的字符串 String strings = rs.getString(columnName); // 获取到的字符串不为空的话,利用逗号来分隔该字符串,将这个字符串分隔为字符串数组 if (strings != null) { return strings.split(","); } // 否则就返回空 return null; } /*rs是从数据库中查询到的结果集;columnIndex是数据库列号;通过列号获取数据库里的字段*/ @Override public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String strings = rs.getString(columnIndex); if (strings != null) { return strings.split(","); } return null; } /*这个是通过存储过程来获取数据库里的字段*/ @Override public String[] getNullableResult(CallableStatement csmt, int i) throws SQLException { String strings = csmt.getString(i); if (strings != null) { return strings.split(","); } return null; } } 3.2 配置MyBatis框架的主配置文件

为定义好的类型转换器做全局配置。需要注意的是,configuration中添加各标签是有顺序的,否则或报错。

注意:javaType="[Ljava.lang.String;" 后面的 ;不要丢掉

3.3 自定义的类型转换器的使用

需要注意的是,在使用到自定义的类型转换器时,一定要添加 jdbcType 这个属性。如下图所示 在这里插入图片描述

4. 测试

这里给出可以参考的测试代码

// 通过主键查询到对象,然后看是否能获取到爱好,用来测试StringArrayTypeHandler里后三个重写的方法 @Test public void selectByPrimaryKey() { Student student = this.studentService.selectByPrimaryKey(1); String[] hobbies = student.getHobbies(); for (int i=0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有