Mybatis之TypeHandler使用教程
2024/1/13 18:02:27
本文主要是介绍Mybatis之TypeHandler使用教程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
引言
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1、typeHandles的基础知识
TypeHandler 在 MyBatis 中是一个用于处理 Java 类型和数据库类型之间映射转换的接口。简而言之,它负责:
-
Java到数据库的映射:在执行 SQL 语句时,TypeHandler 将 Java 类型转换为数据库可以理解的类型。
-
数据库到Java的映射:在读取数据库结果时,TypeHandler 将数据库类型转换回 Java 类型。
2、场景复现
首先建立了一个t_user表存储用户信息,这个表中有一栏favorites是记录个人爱好的,爱好包括篮球、足球、排球:
在Java的User对象对应的是一个String类型的List,而在数据库中是用分号分隔的字符表示,比如:"basketball;football;volleyball",
所以我们需要创建一个继承了BaseTypeHandler
@MappedTypes定义需要被拦截的java类型 @MappedJdbcTypes配置jdbc类型,这里的JdbcType必须org.apache.ibatis.type.JdbcType中的枚举类型,
然后还需要实现BaseTypeHandler
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class ListVarcharTypeHandler extends BaseTypeHandler<List<String>> { @Override public void setNonNullParameter(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType) throws SQLException { System.out.println("setNonNullParameter ...... "); //a,b,c,d //处理数据 将List转换为特定格式的字符串 StringBuffer sb = new StringBuffer(); String msg = null; if(list != null){ for(String p : list){ sb.append(p).append(";"); } msg = sb.toString(); msg = msg.substring(0,msg.length()-1); } ps.setString(i,msg); } /** * 获取非空的结果集 * @param rs * @param columnName * @return * @throws SQLException */ @Override public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException { System.out.println(111); System.out.println( Arrays.asList(rs.getString(columnName).split(";"))); return Arrays.asList(rs.getString(columnName).split(";")); } @Override public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { System.out.println(222); return Arrays.asList(rs.getString(columnIndex).split(";")); } @Override public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { System.out.println(333); return Arrays.asList(cs.getString(columnIndex).split(";")); } }
创建完类后,我们还需要配置xml文件,一个是映射文件,一个mybatis配置文件:
... <!-- 使用将集合转化为对应的数据类型的注解 --> <typeHandlers> <typeHandler handler="com.doing.typehandle.ListVarcharTypeHandler" /> </typeHandlers> ...
... <!-- 对指定的结果进行类型转换 --> <resultMap id="userMap" type="com.doing.pojo.User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="address" column="address"/> <result property="gender" column="gender"/> <result property="favorites" column="favorites" typeHandler="com.doing.typehandle.ListVarcharTypeHandler"/> </resultMap> <!-- 添加用户信息 --> <insert id="addUser" parameterType="com.doing.pojo.User" > insert into t_user (id,username,address,gender,favorites)values(#{id},#{username},#{address},#{gender},#{favorites,typeHandler=com.doing.typehandle.ListVarcharTypeHandler}) </insert> <!-- 查询所有用户信息 --> <select id="queryAll" resultMap="userMap"> select * from t_user </select> <!-- 根据用户编号查询用户信息 --> <select id="queryById" parameterType="java.lang.Integer" resultMap="userMap"> select * from t_user where id = #{id}; </select> ...
在配置完成之后,点击运行:
3、总结
TypeHandler是一个用于处理 Java 类型和数据库类型之间映射转换的接口,BaseTypeHandler
使用BaseTypeHandler
这篇关于Mybatis之TypeHandler使用教程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署
- 2024-04-14RAG应用开发实战02-相似性检索的关键 - Embedding