5.8 mybatis之EnumTypeHandler详细使用

文章目录

  • 1. 把java中枚举数据插入到数据库中
  • 2. 把数据库中值查询到java对象中

在 Java 中,枚举类型是一种特殊的类,当我们在数据库和 Java 对象之间进行映射时,通常需要将数据库中的某个字段(如字符串或数字)映射到 Java 枚举类型上,或者更新插入数据库时,需要把java的枚举类型映射到数据库字段上,这就需要一种机制来在两者之间建立映射关系。EnumTypeHandler 就是这样一个机制,它能够帮助我们完成这一任务。

EnumTypeHandler的使用很简单,或者你没有刻意去使用,mybatis在枚举映射时也是默认使用了EnumTypeHandler类型处理机制进行处理枚举映射的,为什么这么说呢?因为在mybatis的setting配置中有个defaultEnumTypeHandler参数,是为mybatis处理枚举映射指定的类型转换机制的,如下所示,指定了EnumTypeHandler类型处理机制,即使你不配置下面的枚举转换机制,mybatis也是默认使用的EnumTypeHandler类型转换机制。当然你也可以使用其他类型的枚举转换机制或者自定义枚举转换机制,然后在下面显示指定。

<settings><setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
</settings>

下面我们看下EnumTypeHandler具体用法

1. 把java中枚举数据插入到数据库中

以如下库表PERSON为例
在这里插入图片描述
对应的java的Person类为

package com.lzj.bean;public class Person {private int id;private String name;private Enum<SexEnum> sex;private int age;//省略get/set/toString}

对应的SexEnum枚举类如下所示

package com.lzj.bean;public enum SexEnum {MALE("男性"),FEMALE("女性");private String description;private SexEnum(String description){this.description = description;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic String toString() {return "SexEnum{" +"description='" + description + '\'' +'}';}
}

对应的Dao接口为

package com.lzj.dao;import com.lzj.bean.Person;import java.util.List;public interface PersonDao {public int insert(Person person);
}

对应的mapper中SQL为

<insert id="insert" parameterType="com.lzj.bean.Person" useGeneratedKeys="true" keyProperty="id" keyColumn="person_id">insert into PERSON(person_name, person_sex, person_age) values(#{name},#{sex},#{age});
</insert>

修改mybatis配置文件添加defaultEnumTypeHandler参数,并指定EnumTypeHandler,当然也可以配置,因为默认就是用的EnumTypeHandler枚举类型转换机制。

<settings><setting name="logImpl" value="STDOUT_LOGGING"/><setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
</settings>

下面执行下面测试案例,向数据库中插入一条数据

public void sqlSessionTest1(){SqlSessionFactory factory = mybatisUtil.getFactory();SqlSession sqlSession = factory.openSession(true);  //true表示自动提交Person person = new Person();person.setAge(25);person.setSex(SexEnum.MALE);person.setName("Tom");sqlSession.insert("com.lzj.dao.PersonDao.insert", person);System.out.println("自增逐渐为:" + person.getId());
}

最后再重新查数据库如下所示,发现已经向数据库中又插入了一条Tom的数据,并且插入的person_sex为MALE。说明EnumTypeHandler是直接把数据库中值直接和JAVA钟枚举的属性名直接进行映射的。
在这里插入图片描述

2. 把数据库中值查询到java对象中

还是以上面为例,查询peson_id>5的所有数据映射到Person类对应的对象中

对应的mapper的SQL为,注意要为sex属性指定javaType类型

<resultMap id="resultMap1" type="com.lzj.bean.Person"><result column="PERSON_ID" property="id"></result><result column="PERSON_NAME" property="name"></result><result column="PERSON_SEX" property="sex" javaType="com.lzj.bean.SexEnum"></result><result column="PERSON_AGE" property="age"></result>
</resultMap>
<select id="select1" resultMap="resultMap1">select * from PERSON where PERSON_ID > #{personId}
</select>

对应的dao接口为

public interface PersonDao {public List<Person> select1(int personId);
}

然后执行下面查询案例

public void sqlSessionTest2(){SqlSessionFactory factory = mybatisUtil.getFactory();SqlSession sqlSession = factory.openSession(true);  //true表示自动提交List<Person> persons = sqlSession.selectList("com.lzj.dao.PersonDao.select1", 5);System.out.println(persons);sqlSession.close();
}

输出结果如下所示,说明数据库中数据可以正常映射到Person对应的对象中。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 2259527.
==>  Preparing: select * from PERSON where PERSON_ID > ? 
==> Parameters: 5(Integer)
<==    Columns: person_id, person_name, person_age, person_sex
<==        Row: 13, Jerry, 20, FEMALE
<==        Row: 14, Tom, 25, MALE
<==      Total: 2
[Person{id=13, name='Jerry', sex=SexEnum{description='女性'}, age=20}, Person{id=14, name='Tom', sex=SexEnum{description='男性'}, age=25}]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@227a47]
Returned connection 2259527 to pool.

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

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

相关文章

Python基于大数据的微博的舆论情感分析,微博评论情感分析可视化系统,附源码

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

练习题(2024/4/13)

1长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&am…

Linux第89步_了解异步通知及其结构和函数

1、了解“异步通知” “异步通知”的核心就是信号。信号是采用软件模拟的“中断”&#xff0c;它由“驱动程序”主动向“应用程序”发送信号&#xff0c;并报告自己可以访问了&#xff0c;“应用程序”收到信号以后&#xff0c;就从“驱动设备”中读取或者写入数据。整个过程就…

杰发科技AC7840——CAN通信简介(3)_时间戳

0. 时间戳简介 时间戳表示的是收到该CAN消息的时刻&#xff0c;通过连续多帧的时间戳&#xff0c;可以计算出CAN消息的发送周期&#xff0c;也可以用于判断CAN消息是否被持续收到。 1. 使用步骤 注意分别是发送和接收的功能&#xff1a; 2. 现象分析_接收时间戳 看下寄存器的…

帝国cms仿《鳄鱼下载站》网站源码

仿《鳄鱼下载站》网站源码手机安卓软件网站模版 PHP网站源码 帝国cms内核 采用帝国cms7.5 环境PHPmysql 恢复数据库后如何修改密码: 双击表&#xff0c;进入对应的详细数据表&#xff0c;然后找到&#xff1a;www_96kaifa_com_enewsuser这个表&#xff0c;双击打开修改&…

mac 配置前端开发环境brew,git,nvm,nrm

我的电脑是mac 3 pro 一、配置Homebrew 打开终端&#xff0c;执行指令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"查看版本 brew -v 安装nvm brew install nvm 再执行 brew reinstall nvm 我这边安装好了…

Linux 中 CPU 利用率是如何算出来的?

在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下&#xff1a; 这个输出结果说简单也简单&#xff0c;说复杂也不是那么容易就…

线程池-异步编排-完成时回调-线程串行化

上图中用exceptionally可以感知异常也可以处理返回结果 同时 我们使用handle也可以做到这种情况 线程串行化

error:0308010C:digital envelope routines::unsupported(问题分析)

error:0308010C:digital envelope routines::unsupported 情况一&#xff1a;就是网上大部分人说的node 17版本的问题 出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制&#xff0c;可能会对生态系统造成一些影响…

vue iview table实现全选

之前我们在文章《iview Table实现跨页勾选记忆功能以及利用ES6的Map数据结构实现根据id进行对象数组的去重》里实现过全选功能,不过那有一个弊端就是需要调接口一次性获取全部的数据,这会造成请求数据响应超时或报错,因为数据量大的话这样体验也不好,于是我们改了一下,因为…

【数据结构与算法】:二叉树经典OJ

目录 1. 二叉树的前序遍历 (中&#xff0c;后序类似)2. 二叉树的最大深度3. 平衡二叉树4. 二叉树遍历 1. 二叉树的前序遍历 (中&#xff0c;后序类似) 这道题的意思是对二叉树进行前序遍历&#xff0c;把每个结点的值都存入一个数组中&#xff0c;并且返回这个数组。 思路&…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 &#xff08;1&#xff09;计算效率高 ReLU函数数学形式简单&#xff0c;仅需要对输入进行阈值操作&#xff0c;大于0则保留&#xff0c;小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快&#xff0c;降低了神经…

C++算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

滑动窗口例题

一、209:长度最小的子数组 209:长度最小的子数组 思路&#xff1a;1、暴力解法&#xff1a;两层for循环遍历&#xff0c;当sum > target时计算子数组长度并与result比较&#xff0c;取最小的更新result。提交但是超出了时间限制。 class Solution {public int minSubArray…

Object和Objects

Object Object是Java中的顶级父类.所有的类都直接或间接的继承Object类. Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法. Object的构造方法: Object的成员方法 public class test {public static void main(String[] args) {//1.toString 返回对象…

03 Git 之 远程仓库 + IDEA 集成使用 GitHub

1. 远程仓库 origin&#xff1a;即远程仓库 url 的指代。 从网上随意 clone 一个仓库&#xff0c;进入 .git/config 文件, 即可编辑远程仓库的 url&#xff0c;也可以自定义想要指代该 url 的名词。 1.1 本地仓库绑定远程仓库 并 推送、拉取 git remote add 【想要起的指代…

ruoyi单体+react+antdesign

基于ruoyi vue和Ruoyi-React实现的快速开发工具。 源码地址&#xff1a;GitHub - hebian1994/ruoyi-react-single: use ruoyi to generage java backend code and reacr front end code 前端&#xff1a;基于ant-design-pro 后端&#xff1a;单体springboot项目(非cloud)mysq…

人工智能——大语言模型

5. 大语言模型 5.1. 语言模型历史 20世纪90年代以前的语言模型都是基于语法分析这种方法&#xff0c;效果一直不佳。到了20世纪90年代&#xff0c;采用统计学方法分析语言&#xff0c;取得了重大进展。但是在庞大而复杂的语言信息上&#xff0c;基于传统统计的因为计算量巨大…

【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

架构设计-权限系统之通用的权限系统设计方案

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…