南昌做网站公司有哪些,在线公司网站查询,专门做娱乐场所的设计网站,媒体网站推广方法From: https://blog.csdn.net/fighterandknight/article/details/51520595
前言 在上一篇博客#xff0c;mybatis枚举自动转换实现#xff0c;已经介绍自动转换的实现步骤#xff0c;并通过例子告诉大家如何实现枚举的自动转换了。 那么在博客的最后想到#xff0c;定义一…From: https://blog.csdn.net/fighterandknight/article/details/51520595
前言 在上一篇博客mybatis枚举自动转换实现已经介绍自动转换的实现步骤并通过例子告诉大家如何实现枚举的自动转换了。 那么在博客的最后想到定义一个万能的枚举转换处理器具体怎么实现呢相信大神们也应该有思路了使用泛型实现没错就是使用泛型实现具体请看下面例子。 mybatis万能枚举转换处理器 定义枚举接口 为什么要定义枚举的接口呢定义接口的好处其实主要目的是为了在万能枚举转换器中方便泛型的使用而且还可以规范枚举类的实现。 package net.itaem.less; /** * author Fighter168 */ public interface BaseEnumE extends Enum?, T { public T getValue(); public String getDisplayName(); } 实现枚举接口定义枚举 实现BaseEnum接口定义PersonType枚举 package net.itaem.less; import java.util.HashMap; import java.util.Map; /** * author Fighter168 */ public enum PersonType implements BaseEnumPersonType, String{ student(1,学生), teacher(2,教师); private String value; private String displayName; static MapString,PersonType enumMapnew HashMapString, PersonType(); static{ for(PersonType type:PersonType.values()){ enumMap.put(type.getValue(), type); } } private PersonType(String value,String displayName) { this.valuevalue; this.displayNamedisplayName; } public String getValue() { return value; } public void setValue(String value) { this.value value; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName displayName; } public static PersonType getEnum(String value) { return enumMap.get(value); } } 定义万能枚举转换处理器 package net.itaem.handler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import net.itaem.less.BaseEnum; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; /** * author Fighter168 */ public final class UniversalEnumHandlerE extends BaseEnum extends BaseTypeHandlerE { private ClassE type; private E [] enums; /** * 设置配置文件设置的转换类以及枚举类内容供其他方法更便捷高效的实现 * param type 配置文件中设置的转换类 */ public UniversalEnumHandler(ClassE type) { if (type null) throw new IllegalArgumentException(Type argument cannot be null); this.type type; this.enums type.getEnumConstants(); if (this.enums null) throw new IllegalArgumentException(type.getSimpleName() does not represent an enum type.); } Override public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException { //BaseTypeHandler已经帮我们做了parameter的null判断 ps.setObject(i,(String)parameter.getValue(), jdbcType.TYPE_CODE); } Override public E getNullableResult(ResultSet rs, String columnName) throws SQLException { // 根据数据库存储类型决定获取类型本例子中数据库中存放String类型 String i rs.getString(columnName); if (rs.wasNull()) { return null; } else { // 根据数据库中的value值定位PersonType子类 return locateEnumStatus(i); } } Override public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // 根据数据库存储类型决定获取类型本例子中数据库中存放String类型 String i rs.getString(columnIndex); if (rs.wasNull()) { return null; } else { // 根据数据库中的value值定位PersonType子类 return locateEnumStatus(i); } } Override public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // 根据数据库存储类型决定获取类型本例子中数据库中存放String类型 String i cs.getString(columnIndex); if (cs.wasNull()) { return null; } else { // 根据数据库中的value值定位PersonType子类 return locateEnumStatus(i); } } /** * 枚举类型转换由于构造函数获取了枚举的子类enums让遍历更加高效快捷 * param value 数据库中存储的自定义value属性 * return value对应的枚举类 */ private E locateEnumStatus(String value) { for(E e : enums) { if(e.getValue().equals(value)) { return e; } } throw new IllegalArgumentException(未知的枚举类型 value ,请核对 type.getSimpleName()); } } 测试 接下来我们就修改原来的例子上一篇博客的例子mybatis枚举自动转换实现只需修改typeHandler修改成 typeHandler handlernet.itaem.handler.UniversalHandler javaTypenet.itaem.less.PersonType jdbcTypeCHAR/
然后我们再次运行测试用例会发现我们的查询得到的结果还是一样这样我们就不需要为每一个枚举创建一个Handler去自动转换数据库中的枚举了。 自动扫描枚举注册想法 做到这里或许我们又想了要是我们一个项目特别大有几十个甚至是上百个枚举呢那怎么办难道我要一个个在typeHandler里面去加加一百几十行个人觉得非常麻烦影响我们的开发速度so能不能实现我们想要的像扫描下枚举的所在的包目录就可以注册的枚举做自动转换呢具体怎么实现下篇博客我会教大家如何实现。