MyBatis 之七:Mybatis 的类型转换器和分页插件

2024-03-16 02:04

本文主要是介绍MyBatis 之七:Mybatis 的类型转换器和分页插件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

类型转换器

在 MyBatis 框架中,类型转换器(Type Handler)是处理 Java 类型和 JDBC 类型之间转换的关键组件。它主要用于以下两个场景:

  1. 将Java对象设置到PreparedStatement参数:当执行SQL插入、更新或删除操作时,MyBatis需要将Java对象的属性值转换为JDBC能够识别的数据类型,并设置到PreparedStatement的相应参数位置。

    • 例如,一个String类型的Java日期字符串需要通过DateTypeHandler转换成数据库可以接受的java.sql.Date格式。

  2. 从ResultSet获取数据并转换为Java对象:查询结果返回时,MyBatis从ResultSet读取数据,并根据映射配置将JDBC数据类型转换为相应的Java类型。

内置类型转换器和自定义类型转换器

自定义类型转换器实现方式:

  • 实现 TypeHandler
  • 继承 BaseTypeHandler

配置方式:

  • 全局配置
  • 局部配置

自定义类型转换器

  • 实现 TypeHandler
  • 继承 BaseTypeHandler
package com.wdzl.typehandler;import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** 性别类型转换* String 男 ---- JDBC : int* String -- int*  男 ---- 1*  女 ---- 2*  实现 实现接口**  insert into book(name,author,price,com)values(?,?,?,?)*  pst.setXXX(1,value)*/
public class SexTypeHanlder implements TypeHandler<String> {/**** @param preparedStatement* @param i   占位符位置* @param s   给占位符赋值的参数  “男”或女* @param jdbcType* @throws SQLException*/@Overridepublic void setParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {System.out.println(i+"=========setParameter======="+s);if("男".equals(s)){preparedStatement.setInt(i,1);}else if("女".equals(s)){preparedStatement.setInt(i,2);}}/*** select name,price form book*  *  rst.getString("price")*  * @param resultSet* @param s 列名* @return* @throws SQLException*/@Overridepublic String getResult(ResultSet resultSet, String s) throws SQLException {int sex = resultSet.getInt(s);if(sex == 1){return "男";}return "女";}/*** rst.getString(2)* @param resultSet* @param i 位置* @return* @throws SQLException*/@Overridepublic String getResult(ResultSet resultSet, int i) throws SQLException {return null;}@Overridepublic String getResult(CallableStatement callableStatement, int i) throws SQLException {return null;}
}

局部配置

在映射文件中,配置映射

插入转换:

<insert id="save" parameterType="author">insert into author(name,gender,birtday)values(#{name},#{gender,typeHandler=com.wdzl.typehandler.GenderTypeHander},#{birthday})
</insert>

查询转换:

 <resultMap id="authorMap" type="author"><result column="gender" property="gender" typeHandler="com.wdzl.typehandler.SexTypeHanlder"/><result column="birtday" property="birthday"/></resultMap><select id="queryAll" resultMap="authorMap">select name,gender,birtday from author</select>

全局配置

  1. 配置文件中添加自定义配置

    <!--全局类型转换器通过 javaType和jdbcType两者来匹配的。
    -->
    <typeHandlers><typeHandler handler="com.wdzl.typehandler.SexTypeHanlder" jdbcType="INTEGER" javaType="String"></typeHandler>
    </typeHandlers>
  2. 映射文件中

 <!--1. 查询:javaType="String" jdbcType="INTEGER"--><result column="gender" property="gender" javaType="String" jdbcType="INTEGER" />```<!--2. 更新:update、insert--><insert id="save" parameterType="author">insert into author(name,gender,birtday)values(#{name},#{gender,javaType=String,jdbcType=INTEGER},#{birthday})</insert>

分页插件

回顾自定义分页组件:

  • 当前页号-----前端传过来(已知条件)
  • 总记录数-----查出来,统计出来(通过SQL查询统计出来)
  • 每页显示记录数------(自定义设置)
  • 总页数-------(计算出来的,通过【总记录数/每页显示记录数】)
  • 当前页显示记录------截取提取出来记录
  1. 添加依赖

    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
    </dependency>
  2. 配置文件中,添加插件

<!--分页插件-->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
  1. 使用

    在查询之前,设置起始页和每页记录数即可

public void test(){int pageno = 2;int countPerPage = 3; //每页显示记录数Page page = PageHelper.startPage(2,3);// select count(bookname) from page.setCountColumn("bookname"); SqlSession sqlSession = MyBatisUtil.getSession();IBookDao mapper = sqlSession.getMapper(IBookDao.class);List<Book> list = mapper.queryAll();for (Book book : list) {System.out.println(book);}System.out.println(page.getPageNum());      //当前页号System.out.println(page.getPages());        // 总页数System.out.println(page.getPageSize());     // System.out.println(page.getTotal());        // 总记录数System.out.println(page.getResult());       //当前页记录列表MyBatisUtil.closeSession(sqlSession);}

这篇关于MyBatis 之七:Mybatis 的类型转换器和分页插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813946

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型