ibatis对枚举类的支持

pojo类

package com.sg.bean;

public class User {

    /**

     * 用户ID

     */

    private String userID;

    /**

     * 用户名 

     */

    private String userName;

    /**

     * 用户状态

     * @see com.sg.bean.EnumStatus

     */

    private EnumStatus status;

    public String getUserID() {

        return userID;

    }

    public void setUserID(String userID) {

        this.userID = userID;

    }

    public String getUserName() {

        return userName;

    }

    public void setUserName(String userName) {

        this.userName = userName;

    }

    public EnumStatus getStatus() {

        return status;

    }

    public void setStatus(EnumStatus status) {

        this.status = status;

    }

}

枚举类

package com.sg.bean;

public enum EnumStatus {

    NORMAL("1", "正常"),

    DELETE("2", "删除"),

    LOGICDEL("3", "注销");

    private EnumStatus(String code, String description) {

        this.code = code;

        this.description = description;

    }

    private String code;

    private String description;

    public String getCode() {

        return code;

    }

    public void setCode(String code) {

        this.code = code;

    }

    public String getDescription() {

        return description;

    }

    public void setDescription(String description) {

        this.description = description;

    }

}

重点来了——ibatis类型转换接口实现

先看一下源码中的注释

com.ultrapower.common.ibatis.sqlmap.client.extensions.TypeHandlerCallback

A simple interface for implementing custom type handlers. 

Using this interface, you can implement a type handler that will perform customized processing before parameters are set on a PreparedStatement and after values are retrieved from a ResultSet. Using a custom type handler you can extend the framework to handle types that are not supported, or handle supported types in a different way. For example, you might use a custom type handler to implement proprietary BLOB support (e.g. Oracle), or you might use it to handle booleans using "Y" and "N" instead of the more typical 0/1. 

EXAMPLE 

Here‘s a simple example of a boolean handler that uses "Yes" and "No". 

 public class YesNoBoolTypeHandlerCallback implements TypeHandlerCallback {

 <p/>

   private static final String YES = "Yes";

   private static final String NO = "No";

 <p/>

   public Object getResult(ResultGetter getter) throws SQLException {

     String s = getter.getString();

     if (YES.equalsIgnoreCase(s)) {

       return new Boolean (true);

     } else if (NO.equalsIgnoreCase(s)) {

       return new Boolean (false);

     } else {

       throw new SQLException ("Unexpected value " + s + " found where "+YES+" or "+NO+" was expected.");

     }

   }

 <p/>

   public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {

     boolean b = ((Boolean)parameter).booleanValue();

     if (b) {

       setter.setString(YES);

     } else {

       setter.setString(NO);

     }

   }

 <p/>

   public Object valueOf(String s) {

     if (YES.equalsIgnoreCase(s)) {

       return new Boolean (true);

     } else if (NO.equalsIgnoreCase(s)) {

       return new Boolean (false);

     } else {

       throw new SQLException ("Unexpected value " + s + " found where "+YES+" or "+NO+" was expected.");

     }

   }

 <p/>

 }

针对User对象中的EnumStatus,他的转换类如下

package com.sg.util;

import java.sql.SQLException;

import java.sql.Types;

import com.ibatis.sqlmap.client.extensions.ParameterSetter;

import com.ibatis.sqlmap.client.extensions.ResultGetter;

import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

import com.sg.bean.EnumStatus;

public class EnumStatusHandler implements TypeHandlerCallback {

    public Object getResult(ResultGetter getter) throws SQLException {

        EnumStatus result = null;

        if(!getter.wasNull() && getter.getObject()!= null) {

            for(EnumStatus status : EnumStatus.values()) {

                if(status.getCode().equals(getter.getObject())) {

                    result = status;

                    break;

                }

            }

        }

        return result;

    }

    public void setParameter(ParameterSetter setter, Object obj)

            throws SQLException {

        if(obj == null) {

            setter.setInt(Types.INTEGER);

        }else {

            EnumStatus status = (EnumStatus)obj;

            setter.setString(status.getCode());

        }

    }

    public Object valueOf(String s) {

        return s;

    }

}

ibatis配置文件声明

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig 

PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

	<settings cacheModelsEnabled="true" enhancementEnabled="true"

		lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"

		maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />

	<typeAlias alias="com.sg.bean.EnumStatus" type="com.sg.util.EnumStatusHandler"/>

	<transactionManager type="JDBC">

		<dataSource type="SIMPLE">

			<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />

			<property name="JDBC.ConnectionURL"

				value="jdbc:mysql://localhost:3306/sg" />

			<property name="JDBC.Username" value="root" />

			<property name="JDBC.Password" value="root" />

			<property name="Pool.MaximumIdleConnections" value="5" />

			<property name="Pool.MaximumCheckoutTime" value="120000" />

			<property name="Pool.TimeToWait" value="500" />

			<property name="Pool.PingQuery"

				value="select 1 from sample" />

			<property name="Pool.PingEnabled" value="false" />

			<property name="Pool.PingConnectionsOlderThan" value="1" />

			<property name="Pool.PingConnectionsNotUsedFor" value="1" />

		</dataSource>

	</transactionManager>

	<sqlMap resource="User.xml" />

</sqlMapConfig>

经过上述的配置,User对象中的EnumStatus枚举类就可以顺利的进行数据库操作了,以上方案有以下几个好处:

  1. 没有破坏pojo的纯净,pojo对象的扩展和可维护性更高;
  2. 枚举类加强了User对象对属性类型的把控,开发这不用担心其他人在status属性中放错值了;
  3. pojo的扩展性增强,比如现在前台展示需要展示名称,开发者只需对枚举进行简单的读取就可以将数据库中的0、1转为自然语言;
  4. 脱离实体的限制,比如前台需要展示status的可选值,枚举类便可以首当其冲

No tags for this post.

除非注明,本站文章均为原创或编译,转载请注明: 文章来自
KENGINE | Kankanews.com

时间: 2024-08-29 22:44:45

ibatis对枚举类的支持的相关文章

Java 之枚举类

在某些情况下,一个类的对象是有限而且是固定的,比如季节类,它只有4个对象.这种实例有限而且固定的类,在Java里被称为枚举类. 在早期,可能会直接使用简单的静态常量来表示枚举类,例如: public static final int SEASON_SPRING = 1; public static final int SEASON_SUMMER = 2; public static final int SEASON_FAIL = 3; public static final int SEASON

设计模式(一)单例模式:5-单元素枚举类模式

思想: 这是 Effective Java 极力推荐的一种,代码为各种实现中最简单的. 1 public enum EnumSingleton { 2 3 INSTANCE; 4 5 } 单元素枚举类模式 其实现,完全是基于枚举类的特性,可以说天生受到了 JVM 的支持,而且既不用思考反射,也不用考虑多线程,对于自身的循环引用,本质上也是一个对象. 1 @Test 2 public void test() throws Exception { 3 EnumSingleton singleton1

No enum constant org.apache.ibatis.type.JdbcType.Integer 【找不到这个枚举类,mybatis相关】

同事今天在用mybatis查询时候,报了上面这个问题.上网查了下,原来是mybatis封装类型的问题.原因是在resultMap中jdbcType写为了Integer,但是在MyBatis中没有这个数据类型 来查看了原码,发现MyBatis的jdbcType是一个枚举类,有以下类型: public enum JdbcType { ARRAY(2003), BIT(-7), TINYINT(-6), SMALLINT(5), INTEGER(4), BIGINT(-5), FLOAT(6), RE

MyBatis里字段到枚举类的映射

一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是枚举,在DB存储时我们想存的枚举的代号,从DB拿出来时想直接映射成目标枚举类型,也即代号字段与Java枚举类的相互类型转换. 当然,你可以为每个枚举写一个MyEnumTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐. 有了泛型,一个通用的TypeHandler直接搞定. 二.源码 源码详见:spring-mybatis-test package com.adu.spring_test

JAVA枚举类

一.枚举的作用 枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念 枚举像一个类,又像一个数组. Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口. 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征. 1.,这样做可以保证客户代码没有办法新建一个enum的实例.  2..注意这一点只是针对于枚举值,我们可以和在普通类里面定

Java基础15:深入剖析Java枚举类

Java基础15:深入剖析Java枚举类 枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 初探枚举类 在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红.黄.绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素.此时,可将这些数据集合定义为枚举类型. 因此,枚举类型是某类数据可能取值的集合,如一周内星期可能取值的

Kotlin 枚举类

枚举类最基本的用法是实现一个类型安全的枚举. 枚举常量用逗号分隔,每个枚举常量都是一个对象. enum class Color{ RED,BLACK,BLUE,GREEN,WHITE } 枚举初始化 每一个枚举都是枚举类的实例,它们可以被初始化: enum class Color(val rgb: Int) {     RED(0xFF0000),     GREEN(0x00FF00),     BLUE(0x0000FF) } 默认名称为枚举字符名,值从0开始.若需要指定值,则可以使用其构造

JavaSE复习_6 枚举类

△单例类是指只有一个实例,而枚举类实际上就是有有限个实例的类,在类里已经把实例定义好了. △枚举类的三种创建形式: 1) enum Week { MON,TUE,WED;//枚举类有默认构造函数创建的三个实例} } 2) enum Week { MON("星期一"), TUE( "星期二"),WED ("星期三" ); //具有参数的构造函数 private String name; Week(String name) { this. name=

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