MyBatis之自定义数据类型转换器

MyBatis之自定义数据类型转换器

  • 前言
  • 实现步骤
    • 1. 编写自定义类型转换器(Boolean到Int)
    • 2. 将自定义转换器注册到MyBatis-config.xml配置文件
    • 3. Mapper.xml文件中进行数据类型转换
    • 4. 定义PeronMapper接口
  • 编写测试类
    • 1. 测试代码
    • 2. 运行log
  • 总结

前言

到这里我们已掌握了,使用MyBatis完成数据库的增删改查,在实际项目中,还会遇到其他的需求,例如,向数据库的表字段插入数据时,根据flg的值,true的时候,插入1,false时,插入0,当然使用Java也能轻松实现,我们看看使用MyBatis是怎么实现的呢,就要聊聊我们今天的主题,自定义数据类型转换器,环境的搭建可以参看我之前的文章,我们今天主要聊聊实现步骤。


实现步骤

1. 编写自定义类型转换器(Boolean到Int)

继承MyBatis为我们提供的BaseTypeHandler类,它是一个泛型的类,定义元数据的类型:Boolean,重写该类的4个方法,getNullableResult和setNonNullParameter,根据方法名,我们就能看出,get数据和set数据时的处理,在setNonNullParameter方法中完成我们的需求,根据flg的值,插入0或1,具体实现参看下边的代码。

package xxx.xxx.mapper.coverter;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;public class Boolean2IntConverter extends BaseTypeHandler<Boolean> {@Overridepublic Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getInt(columnName) == 1 ? true : false;}@Overridepublic Boolean getNullableResult(ResultSet rs, int columnName) throws SQLException {return rs.getInt(columnName) == 1 ? true : false;}@Overridepublic Boolean getNullableResult(CallableStatement cs, int columnName) throws SQLException {return cs.getInt(columnName) == 1 ? true : false;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType arg3) throws SQLException {if (parameter) {ps.setInt(i, 1);} else {ps.setInt(i, 0);}}}

2. 将自定义转换器注册到MyBatis-config.xml配置文件

编写完数据类型转化器,使用< typeHandlers>< typeHandler>标签,交给MyBatis管理,底层逻辑还是使用Java反射机制。

MyBatis-config.xml代码如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 读取外部数据库信息文件 --><properties resource="db.properties" /><!-- 设置JavaBean类型的参数别名 --><typeAliases><package name="xxx.xxx.pojo"/></typeAliases><!-- 自定义类型转换器 --><typeHandlers><typeHandler handler="xxx.xxx.mapper.coverter.Boolean2IntConverter" javaType="Boolean" jdbcType="INTEGER"/></typeHandlers><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${my.driver}"/><property name="url" value="${my.url}"/><property name="username" value="${my.username}"/><property name="password" value="${my.password}"/></dataSource></environment></environments><mappers><mapper resource="xxx/xxx/mapper/PersonMapper.xml"/></mappers>
</configuration>

3. Mapper.xml文件中进行数据类型转换

在需要转换的字段上,使用javaType和jdbcType,完成boolean类型转INTEGER类型,具体实现,参照下边的代码。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxx.xxx.entry.personMapper"><insert id="addPerson" parameterType="person">insert into person values(#{id}, #{name}, #{age}, #{sex, javaType=boolean, jdbcType=INTEGER})</insert></mapper>

4. 定义PeronMapper接口

这里就是单纯的定义Insert方法。

package xxx.xxx.mapper;import java.util.List;import xxx.xxx.pojo.Person;public interface PersonMapper {public int addPerson(Person person);}

编写测试类

1. 测试代码

具体实现参看下边的代码。

package xxx.xxx.test;import java.io.IOException;
import java.io.Reader;
import java.util.List;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import xxx.xxx.mapper.PersonMapper;
import xxx.xxx.pojo.Person;public class TestMyBatis {public static void main(String[] args) throws IOException {Person person = new Person(1, "zs", 23, true);System.err.println("登录前");queryPersonById(1);addPerson(person);System.err.println("登录后");queryPersonById(1);}public static void queryPersonById(int id) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLPerson person = personMapper.queryPersonById(1);System.err.println(person);}}public static void addPerson(Person person) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLint count = personMapper.addPerson(person);System.err.println("登陆件数:" + count);// 6.增删改的场合,完成数据提交session.commit();}}}

2. 运行log

通过下边的运行log可以看出,完成对Person表的增删改查

登录前
null
登陆件数:1
登录后
Person [id=1, name=zs, age=23,sex=true]

总结

到这里,我们就完成了MyBatis的Boolean类型转Int类型的自定义数据类型转换器的学习,大家可以动手试试其他的类型转换,欢迎留言交流,下篇见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过写代码学习AWS DynamoDB (3)- 一致性hash

简介 在本文中&#xff0c;我们将简单介绍一致性hash&#xff08;consistent hash&#xff09;的概念&#xff0c;以及一致性hash可以解决的问题。然后我们将在模拟的DDB实现中实现一个简单版本的基于一致性harsh实现的partition。 问题 在《通过写代码学习AWS DynamoDB &am…

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令&#xff08;06h&#xff09; 2. 写禁…

【VTKExamples::PolyData】第二十八期 LinearExtrusion

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例LinearExtrusion,并解析接口vtkLinearExtrusionFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录…

react【三】受控组件/高阶组件/portals/fragment/严格模式/动画

文章目录 1、受控组件1.1 认识受控组件1.2 checkout1.3 selected1.4 非受控组件 2、高阶组件2.1 认识高阶组件2.2 应用1-props增强的基本使用2.3 对象增强的应用场景-context共享2.4 应用2-鉴权2.5 应用3 – 生命周期劫持2.6、高阶组件的意义 3、Portals4、fragment5、StrictMo…

Rust 学习笔记 - 详解数据类型

前言 任何一门编程语言几乎都脱离不了&#xff1a;变量、基本类型、函数、注释、循环、条件判断&#xff0c;这是一门编程语言的语法基础&#xff0c;只有当掌握这些基础语法及概念才能更好的学习 Rust。 标量类型&#xff08;Scalar Types&#xff09; 在 Rust 中&#xff…

12-资源注解annotations和安全行下文securityContext(了解即可)

一、资源注解annotations 资源注解&#xff0c;annotations就是对资源进行注释&#xff1b; 应用场景&#xff1a; 给资源&#xff08;例如pod资源&#xff09;提供配置信息&#xff0c;类似于帮助信息&#xff1b; 早期使用比较多&#xff0c;很多开源组件一般都会使用&#x…

交大论文下载器

原作者地址&#xff1a; https://github.com/olixu/SJTU_Thesis_Crawler 问题&#xff1a; http://thesis.lib.sjtu.edu.cn/的学位论文下载系统&#xff0c;该版权保护系统用起来很不方便&#xff0c;加载起来非常慢&#xff0c;所以该下载器实现将网页上的每一页的图片合并…

Lua:面向对象/C之间的交互

前段时间对平台的任务感兴趣&#xff0c;其要求是一周内12篇博文&#xff0c;尝试了之后发现还是太敷衍了&#xff0c;之后还是回归到内容本身上来&#xff0c;尽量保证一篇博文的内容能涵盖足够多的知识点或者足够深的思考成分。 面向对象 面向对象主要有三个方面&#xff1…

【JavaScript】Cookies

文章目录 1. 什么是Cookies2. Cookies的基本属性3. JavaScript中的Cookies操作设置Cookies读取Cookies获取特定Cookies的值删除Cookies 4. Cookies的应用场景记住用户登录状态存储用户偏好设置跨页面数据传递 5. 安全性注意事项6. 总结 在 Web 开发中&#xff0c; Cookies 是一…

索引失效场景

在数据库系统中&#xff0c;索引用于加速查询处理&#xff0c;但在某些情况下&#xff0c;即使存在索引&#xff0c;数据库查询优化器&#xff08;Query Optimizer&#xff09;可能选择不使用它们。这称之为“索引失效”。以下列出了常见的索引失效场景&#xff0c;并进行了解析…

GPU独显下ubuntu屏幕亮度不能调节解决方法

GPU独显下屏幕亮度不能调节&#xff08;假设你已经安装了合适的nvidia显卡驱动&#xff09;&#xff0c;我试过修改 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT"quiet splash acpi_backlightvendor" &#xff0c;没用。修改和xorg.conf相关的文件&#xff0c;…

不花一分钱,在 Mac 上跑 Windows(M1/M2 版)

这是在 MacOS M1 上体验最新 Windows11 的效果&#xff1a; VMware Fusion&#xff0c;可以运行 Windows、Linux 系统&#xff0c;个人使用 licence 免费 安装流程见 &#x1f449; https://zhuanlan.zhihu.com/p/452412091 从申请 Fusion licence 到下载镜像&#xff0c;再到…

MySQL性能调优篇(10)-数据库备份与恢复策略

MySQL数据库备份与恢复策略 数据库备份与恢复是数据库管理中非常重要的一环&#xff0c;对于保障数据的安全性和可靠性起着至关重要的作用。本文将介绍MySQL数据库备份与恢复的策略&#xff0c;包括备份类型、备份方法以及恢复策略。 1. 备份类型 1.1 完整备份 完整备份是备…

安装 Windows Server 2019

1.镜像安装 镜像安装:Windows Server 2019 2.安装过程(直接以图的形式呈现) 先选择""我没有产品密钥"",选择桌面体验 选择自定义 设置密码后继续 安装成功

SpringUtils 工具类,方便在非spring管理环境中获取bean

应用场景&#xff1a; 1 可用在工具类中&#xff0c; 2 spring【Controller,service】环境中&#xff0c; 3 其中的一个方法getAopProxy可获得代理对象&#xff0c;需要将 EnableAspectJAutoProxy(exposeProxy true) 允许获取代理对象 import org.springframework.aop.framew…

07-k8s中secret资源02-玩转secret

一、回顾secret资源的简单实用 第一步&#xff1a;将想要的数据信息【key&#xff1a;value】中的value值&#xff0c;使用base64编码后&#xff0c;写入secret资源清单中&#xff1b; 第二步&#xff1a;创建secret资源&#xff1b; 第三步&#xff1a;pod资源引用secret资源&…

第2讲springsecurity+vue通用权限系统

阿里云 maven阿里云镜像 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for addition…

MySQL的配置文件my.cnf正常的配置项目

my.cnf&#xff08;或my.ini&#xff09;是MySQL的配置文件&#xff0c;其中包含了多种设置&#xff0c;用于控制MySQL服务器的运行方式。以下是my.cnf中一些常见的配置项目&#xff1a; 服务器设置 - [mysqld]&#xff1a;服务器的配置部分。 - user&#xff1a;指定M…

C++,stl,常用排序算法,常用拷贝和替换算法

目录 1.常用排序算法 sort random_shuffle merge reverse 2.常用拷贝和替换算法 copy replace replace_if swap 1.常用排序算法 sort 默认从小到大排序 #include<bits/stdc.h> using namespace std;int main() {vector<int> v;v.push_back(1);v.push_ba…

速盾网络:cdn加速服务器代理分销

CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;旨在提供快速、安全和高效的内容传输和分发服务。CDN加速服务器代理分销是指将CDN网络资源转售给其他企业或个人&#xff0c;以帮助他们实现内容加速和分发的目标。 CDN加速服务器代理分…