spring boot + mybaits 处理枚举类 enum

枚举:

//实现层调用

orderMapper.getOrder(OrderStatus.DISCOUNT);

sql打印:

实际sql: select * from order where orderStatus = DISCOUNT

预期sql: select * from order where orderSatus = 11;

在不使用更改写法

orderMapper.getOrder(OrderStatus.DISCOUNT.getCode());

前提条件下。

源码:org.apache.ibatis.type.BaseTypeHandler  抽象类

抽象方法 :

需要重写 继承 BaseTypeHandler 重写方法

package order.handler;

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;

import common.enums.BaseEnum;

public class StringEnumTypeHandler extends BaseTypeHandler<BaseEnum> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum parameter, JdbcType jdbcType)
            throws SQLException {
     //核心方法 指定枚举获取code的方法。同理 orderMapper.getOrder(OrderStatus.DISCOUNT.getCode());
        ps.setString(i, parameter.getCode().toString());

    }

    @Override
    public BaseEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String val = rs.getString(columnName);
        return getEnum(Integer.parseInt(val));
    }

    @Override
    public BaseEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

         return getEnum(Integer.parseInt(rs.getString(columnIndex)));
    }

    @Override
    public BaseEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

        return getEnum(Integer.parseInt(cs.getNString(columnIndex)));
    }

    private BaseEnum getEnum(int val) {
        Class<BaseEnum> sexClass = BaseEnum.class;
        BaseEnum[] sexs = sexClass.getEnumConstants();

        for (BaseEnum se : sexs) {
            if (se.getCode() == val) {
                return se;
            }
        }
        return null;
    }
}

配置mybatis.config

orderMapper.xml

修改前:where type = #{type,jdbcType = int}

修改后:

基类:

所有的枚举都实现这个接口,然后动态加载方法调用枚举的getCode()方法。即可

原文地址:https://www.cnblogs.com/1-Admin/p/10863703.html

时间: 2024-10-03 16:49:23

spring boot + mybaits 处理枚举类 enum的相关文章

spring boot + mybaits 操作数据库

spring boot 访问 mysql方式三:spring boot + mybaits pom 文件引入 依赖 <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version>

zend framework获取数据库中枚举类enum的数据并将其转换成数组

在model中建立这样的模型,在其中写入获取枚举类的方法 class Student extends Zend_Db_Table{ protected $_name ='student'; protected $_primary ='id'; function getPartyEnum($enumname){ //适配器并获取数据 $db = $this->getAdapter(); $db->query("SET NAMES GBK"); $sql = $db->q

Java枚举类enum详解

枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enum.和其它普通类一样,enum同样可以有成员变量.方法.构造器,也可以实现一个或多个接口,区别是: 如果有构造器,必须用private修饰. 枚举类不能派生子类. 枚举类所有的实例必须在第一行显示定义.系统会自动给这些实例加上public static final修饰,无须程序员显示定义. 枚举类默

java 枚举类 enum 总结

枚举定义: enum是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量说明为整型, 字符型或其它类型显然是不妥当的.为此,C语言提供了一种称为“枚举”的类型.在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变 量取值不能超过定义的范围.应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型. java中枚举类总

java 枚举 类 enum

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { private final String name; // 当前枚举常量名称 public final String name() { return name; } private final int ordinal; // 当前枚举常量次序,从0开始 public final int ordina

枚举类enum事例

新建一个枚举类: public enum enum1 { RED("红色"), BLACK, GREEN, YELLOW, BLUE; private String cum; private enum1() {//私有构造方法(必须设置为私有,因为枚举本身是单例模式.) } private enum1(String cum) { this.cum = cum; } public String getCum() { return cum; } } values()方法获取所有枚举常量,可

java枚举类Enum方法简介(valueof,value,ordinal)

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,   它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口.   当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征. 1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例. 2.所有枚举值都是public   ,   static   ,   final的.注意这一点只是针对于枚举值,我们可以和在普通类里面定义   变量一样定义其它任何类型的非枚举变量

Spring Boot @Autowired无法注入类 Consider defining a bean of type

SpringBoot 装备默认规则是根据Application类所在的包位置从上到下扫描, 例如 com.seed.controller com.seed.service com.seed.dao 如果 Application在com.seed.controller 这个包下, 就会无法扫描 service dao, 所以可以看到 很多博客写的spring整合mybatis 都在一个包下. 如果把Application 放在com.seed下 就可以扫描到其子包 service dao 就这个小

Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题

在写一个工具类的时候,因为要用到yml中的自定义参数,使用@Value发现值不能正常注入,都显示为null: yml文件中的自定义格式 调用工具类的时候不能new的方式 要使用@Autowired的方式注入进来, new会导致部分环境未加载,尽可能舍弃new的方式,交付spring管理 而工具类也是需要交给spring管理.需要在工具类上加上 @Component注解然后注意一下的是 在springframework下不能@Autowired静态变量 所以在变量上不能有 static 怎么扫描注