文章目录
前言
本章学习类型别名、类型转换器和处理枚举类型。
一、类型别名
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写
1. 单个别名
<typeAliases>
<typeAlias alias="blog" type="org.example.mybatis.domain.Blog" />
</typeAliases>
2. 多个别名(扫描包)
<typeAliases>
<package name="org.example.mybatis.domain"/>
</typeAliases>
3. 内置别名
别名 | 映射的类型 |
---|---|
string | String |
byte | Byte |
char (since 3.5.10) | Character |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
biginteger | BigInteger |
object | Object |
object[] | Object[] |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
更多内置别名请查看官方文档
二、类型处理器
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。