【第3章】Mybatis配置篇之类型别名、转换器和枚举类型


前言

本章学习类型别名、类型转换器和处理枚举类型。


一、类型别名

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

1. 单个别名

<typeAliases>
 <typeAlias alias="blog" type="org.example.mybatis.domain.Blog" />
</typeAliases>

2. 多个别名(扫描包)

<typeAliases>
    <package name="org.example.mybatis.domain"/>
</typeAliases>

3. 内置别名

别名映射的类型
stringString
byteByte
char (since 3.5.10)Character
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
bigintegerBigInteger
objectObject
object[]Object[]
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection

更多内置别名请查看官方文档

二、类型处理器

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

1.自定义处理器

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

1.1 准备

正巧,mysql8.0增加了json字段类型,json不在mybatis支持的范围内,我们可以自定义一个处理器完成json类型的解析。

CREATE TABLE  blog (
  `id` int NOT NULL,
  `data` json NULL,
  PRIMARY KEY (`id`)
);

insert into blog(id,data)value(1,'{"name":"张三","age":17}');

1.2 Blog

package org.example.mybatis.domain;

import com.alibaba.fastjson2.JSONObject;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * Create by zjg on 2024/5/7
 */
@Getter
@Setter
@ToString
public class Blog {
    private int id;
    private JSONObject data;
}

1.3 BlogMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatis.mapper.BlogMapper">
    <select id="selectBlog" resultType="blog">
        select * from blog where id = #{id}
    </select>
</mapper>

1.4 JsonTypeHandler

package org.example.mybatis.type;

import com.alibaba.fastjson2.JSONObject;
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;

/**
 * Create by zjg on 2024/5/8
 */
public class JsonTypeHandler extends BaseTypeHandler<JSONObject> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toString());
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JSONObject.parseObject(rs.getString(columnName));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return JSONObject.parseObject(rs.getString(columnIndex));
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return JSONObject.parseObject(cs.getString(columnIndex));
    }
}

1.5 查找类型处理器

<!-- mybatis-config.xml -->
<typeHandlers>
   <package name="org.example.mybatis.type"/>
</typeHandlers>

更多类型转换器请查看官方文档

三、处理枚举类型

1.数据准备

CREATE TABLE users  (
  `id` int NOT NULL,
  `name` varchar(255) NULL,
  `funkyNumber` int NULL,
  `roundingMode` int NULL,
  PRIMARY KEY (`id`)
);
CREATE TABLE users2  (
  `id` int NOT NULL,
  `name` varchar(255) NULL,
  `funkyNumber` int NULL,
  `roundingMode` varchar(255) NULL,
  PRIMARY KEY (`id`)
);

2. 配置

<typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
    <package name="org.example.mybatis.type"/>
</typeHandlers>
<mappers>
    <mapper resource="mapper/UserMapper.xml"/>
</mappers>

3. User

package org.example.mybatis.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.RoundingMode;

/**
 * Create by zjg on 2024/5/8
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int funkyNumber;
    private RoundingMode roundingMode;
}

4. UserMapper

package org.example.mybatis.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis.domain.User;

/**
 * Create by zjg on 2024/5/8
 */
@Mapper
public interface UserMapper {
    User getUser();
    int insert(User user);
    User getUser2();
    int insert2(User user);
}

5. UserMapper.xml

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.example.mybatis.mapper.UserMapper">
    <resultMap type="User" id="userMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="funkyNumber" property="funkyNumber"/>
        <result column="roundingMode" property="roundingMode"/>
    </resultMap>

    <select id="getUser" resultMap="userMap">
        select * from users
    </select>
    <insert id="insert">
        insert into users (id, name, funkyNumber, roundingMode) values (
        #{id}, #{name}, #{funkyNumber}, #{roundingMode}
        )
    </insert>

    <resultMap type="User" id="userMap2">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="funkyNumber" property="funkyNumber"/>
        <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
    </resultMap>
    <select id="getUser2" resultMap="userMap2">
        select * from users2
    </select>
    <insert id="insert2">
        insert into users2 (id, name, funkyNumber, roundingMode) values (
        #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
        )
    </insert>

</mapper>

6.

package org.example.mybatis.controller;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.example.mybatis.config.MybatisConfig;
import org.example.mybatis.domain.Blog;
import org.example.mybatis.domain.User;
import org.example.mybatis.mapper.BlogMapper;
import org.example.mybatis.mapper.UserMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.RoundingMode;

/**
 * Create by zjg on 2024/5/7
 */
@RestController
@RequestMapping("/mybatis/")
public class MybatisController {
    SqlSessionFactory sessionFactory=MybatisConfig.sqlSessionFactory;
    @RequestMapping("002")
    public void mybatis002() {
        try (SqlSession sqlSession = sessionFactory.openSession(true)){
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            User user = new User(1,"张三",1, RoundingMode.DOWN);
            int insert = userMapper.insert(user);
            System.out.println(insert);
            System.out.println(userMapper.getUser());

            User user2 = new User(2,"李四",2, RoundingMode.CEILING);
            int insert2 = userMapper.insert2(user2);
            System.out.println(insert2);
            System.out.println(userMapper.getUser2());
        }
    }
}

7. 数据格式

在这里插入图片描述

8. 后台输出

1
[2024-05-08 21:03:27.490][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==>  Preparing: select * from users
[2024-05-08 21:03:27.491][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==> Parameters: 
[2024-05-08 21:03:27.640][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - <==      Total: 1
User(id=1, name=张三, funkyNumber=1, roundingMode=DOWN)
[2024-05-08 21:03:27.656][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==>  Preparing: insert into users2 (id, name, funkyNumber, roundingMode) values ( ?, ?, ?, ? )
[2024-05-08 21:03:27.658][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==> Parameters: 2(Integer), 李四(String), 2(Integer), CEILING(String)
[2024-05-08 21:03:27.693][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - <==    Updates: 1
1
[2024-05-08 21:03:27.693][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==>  Preparing: select * from users2
[2024-05-08 21:03:27.694][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - ==> Parameters: 
[2024-05-08 21:03:27.696][http-nio-8080-exec-3][DEBUG]- org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:135) - <==      Total: 1
User(id=2, name=李四, funkyNumber=2, roundingMode=CEILING)

EnumTypeHandler存取的是Enum的name,EnumOrdinalTypeHandler存取的是Enum的ordinal。


总结

回到顶部

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值