枚举类转jdbctype(spring boot下)

本文介绍了一种将枚举类型与MyBatis框架结合使用的方法,包括创建枚举类、实现类型处理器及在mapper文件中进行配置的具体步骤。

首先是创建一个枚举类(登录类型)

public enum LoginType {
	PASSWORD(0), WECHAT(1), ALIPAY(2);
	
	private int value;
	
	private LoginType(int value){
		this.value = value;
	}
	
	public boolean isHitRequired(LoginType loginType) {
		return (this.value - loginType.value)>=0;
	}
	
	@Override
	public String toString() {
		return Integer.toString(value);
	}
	
	public Integer getValue() {
		return this.value;
	}
	
	public static LoginType getClaim(int value) {
		switch(value) {
		case 0: 
			return PASSWORD;
		case 1: 
			return WECHAT;
		default:
			return ALIPAY;
		}
	}

}

然后写一个转换帮助类

@MappedJdbcTypes(JdbcType.INTEGER)
@MappedTypes(LoginType.class)
public class LoginTypeHandler extends BaseTypeHandler<LoginType>{
	
	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, LoginType parameter, JdbcType jdbcType)
			throws SQLException {
		ps.setInt(i, parameter.getValue());
		
	}

	@Override
	public LoginType getNullableResult(ResultSet rs, String columnName) throws SQLException {
		return LoginType.getClaim(rs.getInt(columnName));
	}

	@Override
	public LoginType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		return LoginType.getClaim(rs.getInt(columnIndex));
	}

	@Override
	public LoginType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		return LoginType.getClaim(cs.getInt(columnIndex));
	}

}

最后就是转换拉(在mapper文件里写)

<result property="loginType" column="login_Type" typeHandler="方法类的路径"/>

<select></select>   //和之前一样
<insert>
    insert into LOGIN values (#{loginType,jdbcType=integer,typeHandler=方法类的路径})
</insert>

 

Spring Boot 项目中集成枚举类型(Enum)入库,通常需要结合 **MyBatis** 或 **JPA** 框架进行配置。Spring Boot 本身并不直接处理枚举与数据库字段的换,需要通过类型处理器(TypeHandler)或 AttributeConverter 来完成。 --- ### 一、使用 MyBatis 实现枚举入库 #### 1. 定义枚举类 ```java public enum StatusEnum { ENABLED(1), DISABLED(0); private final int value; StatusEnum(int value) { this.value = value; } public int getValue() { return value; } public static StatusEnum fromValue(int value) { for (StatusEnum e : values()) { if (e.value == value) { return e; } } throw new IllegalArgumentException("Invalid value: " + value); } } ``` #### 2. 自定义 TypeHandler ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class StatusEnumTypeHandler extends BaseTypeHandler<StatusEnum> { @Override public void setNonNullParameter(PreparedStatement ps, int i, StatusEnum parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter.getValue()); } @Override public StatusEnum getNullableResult(ResultSet rs, String columnName) throws SQLException { return StatusEnum.fromValue(rs.getInt(columnName)); } @Override public StatusEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return StatusEnum.fromValue(rs.getInt(columnIndex)); } @Override public StatusEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return StatusEnum.fromValue(cs.getInt(columnIndex)); } } ``` #### 3. 注册 TypeHandler(`application.yml` 或 Java 配置) ```java @Configuration public class MyBatisConfig { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource, StatusEnumTypeHandler statusEnumTypeHandler) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setTypeHandlers(new TypeHandler[]{statusEnumTypeHandler}); return factoryBean.getObject(); } @Bean public StatusEnumTypeHandler statusEnumTypeHandler() { return new StatusEnumTypeHandler(); } } ``` --- ### 二、使用 JPA 实现枚举入库 #### 1. 使用 `@Enumerated` 注解(适合枚举为字符串) ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; @Enumerated(EnumType.STRING) private StatusEnum status; // Getter and Setter } ``` #### 2. 自定义 `AttributeConverter`(适合枚举为整数) ```java import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class StatusEnumConverter implements AttributeConverter<StatusEnum, Integer> { @Override public Integer convertToDatabaseColumn(StatusEnum attribute) { return attribute.getValue(); } @Override public StatusEnum convertToEntityAttribute(Integer dbData) { return StatusEnum.fromValue(dbData); } } ``` #### 3. 在实体类中使用换器 ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; @Convert(converter = StatusEnumConverter.class) private StatusEnum status; // Getter and Setter } ``` --- ### 三、数据库字段建议 - **INT 类型**:适合使用枚举(如 0、1、2),节省空间,查询效率高。 - **VARCHAR 类型**:适合使用枚举名称(如 "ENABLED", "DISABLED"),可读性高。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值