乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      mybatis自定義枚舉轉(zhuǎn)換類(lèi)

       KILLKISS 2014-05-13
      摘要 mybatis自定義枚舉轉(zhuǎn)換類(lèi)的實(shí)現(xiàn)示例。

           mybatis提供了EnumTypeHandler和EnumOrdinalTypeHandler完成枚舉類(lèi)型的轉(zhuǎn)換,兩者的功能已經(jīng)基本滿足了日常的使用。但是可能有這樣的需求:由于某種原因,我們不想使用枚舉的name和ordinal作為數(shù)據(jù)存儲(chǔ)字段。mybatis的自定義轉(zhuǎn)換類(lèi)出現(xiàn)了。

      前提知識(shí)

      1. mybatis廢棄了ibatis的TypeHandlerCallback接口,取而代之的接口是TypeHandler,它與原來(lái)的接口略有不同,但是方法類(lèi)似。(見(jiàn)說(shuō)明 https://code.google.com/p/mybatis/wiki/DocUpgrade3

      2. BaseTypeHandler是mybatis提供的基礎(chǔ)轉(zhuǎn)換類(lèi),該類(lèi)實(shí)現(xiàn)了TypeHandler接口并提供很多公用方法,建議每個(gè)自定義轉(zhuǎn)換類(lèi)都繼承它。


      示例

          使用一段代碼,將枚舉類(lèi)EnumStatus中的code屬性存儲(chǔ)到數(shù)據(jù)庫(kù)對(duì)應(yīng)字段statusCustom。

      自定義轉(zhuǎn)換類(lèi)

      01package com.sg.util.typehandler;
      02 
      03import java.sql.CallableStatement;
      04import java.sql.PreparedStatement;
      05import java.sql.ResultSet;
      06import java.sql.SQLException;
      07 
      08import org.apache.ibatis.type.BaseTypeHandler;
      09import org.apache.ibatis.type.JdbcType;
      10 
      11import com.sg.bean.EnumStatus;
      12 
      13/**
      14 * 自定義EnumStatus轉(zhuǎn)換類(lèi) <br>
      15 * 存儲(chǔ)屬性:EnumStatus.getCode() <br>
      16 * JDBCType:INT
      17 * @author yanlei
      18 */
      19public class EnumStatusHandler extends BaseTypeHandler<EnumStatus> {
      20 
      21    private Class<EnumStatus> type;
      22 
      23    private final EnumStatus[] enums;
      24 
      25    /**
      26     * 設(shè)置配置文件設(shè)置的轉(zhuǎn)換類(lèi)以及枚舉類(lèi)內(nèi)容,供其他方法更便捷高效的實(shí)現(xiàn)
      27     * @param type 配置文件中設(shè)置的轉(zhuǎn)換類(lèi)
      28     */
      29    public EnumStatusHandler(Class<EnumStatus> type) {
      30        if (type == null)
      31            throw new IllegalArgumentException("Type argument cannot be null");
      32        this.type = type;
      33        this.enums = type.getEnumConstants();
      34        if (this.enums == null)
      35            throw new IllegalArgumentException(type.getSimpleName()
      36                    " does not represent an enum type.");
      37    }
      38 
      39    @Override
      40    public EnumStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {
      41        // 根據(jù)數(shù)據(jù)庫(kù)存儲(chǔ)類(lèi)型決定獲取類(lèi)型,本例子中數(shù)據(jù)庫(kù)中存放INT類(lèi)型
      42        int i = rs.getInt(columnName);
      43         
      44        if (rs.wasNull()) {
      45            return null;
      46        else {
      47            // 根據(jù)數(shù)據(jù)庫(kù)中的code值,定位EnumStatus子類(lèi)
      48            return locateEnumStatus(i);
      49        }
      50    }
      51 
      52    @Override
      53    public EnumStatus getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
      54        // 根據(jù)數(shù)據(jù)庫(kù)存儲(chǔ)類(lèi)型決定獲取類(lèi)型,本例子中數(shù)據(jù)庫(kù)中存放INT類(lèi)型
      55        int i = rs.getInt(columnIndex);
      56        if (rs.wasNull()) {
      57            return null;
      58        else {
      59            // 根據(jù)數(shù)據(jù)庫(kù)中的code值,定位EnumStatus子類(lèi)
      60            return locateEnumStatus(i);
      61        }
      62    }
      63 
      64    @Override
      65    public EnumStatus getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
      66        // 根據(jù)數(shù)據(jù)庫(kù)存儲(chǔ)類(lèi)型決定獲取類(lèi)型,本例子中數(shù)據(jù)庫(kù)中存放INT類(lèi)型
      67        int i = cs.getInt(columnIndex);
      68        if (cs.wasNull()) {
      69            return null;
      70        else {
      71            // 根據(jù)數(shù)據(jù)庫(kù)中的code值,定位EnumStatus子類(lèi)
      72            return locateEnumStatus(i);
      73        }
      74    }
      75 
      76    @Override
      77    public void setNonNullParameter(PreparedStatement ps, int i, EnumStatus parameter, JdbcType jdbcType)
      78            throws SQLException {
      79        // baseTypeHandler已經(jīng)幫我們做了parameter的null判斷
      80        ps.setInt(i, parameter.getCode());
      81 
      82    }
      83     
      84    /**
      85     * 枚舉類(lèi)型轉(zhuǎn)換,由于構(gòu)造函數(shù)獲取了枚舉的子類(lèi)enums,讓遍歷更加高效快捷
      86     * @param code 數(shù)據(jù)庫(kù)中存儲(chǔ)的自定義code屬性
      87     * @return code對(duì)應(yīng)的枚舉類(lèi)
      88     */
      89    private EnumStatus locateEnumStatus(int code) {
      90        for(EnumStatus status : enums) {
      91            if(status.getCode().equals(Integer.valueOf(code))) {
      92                return status;
      93            }
      94        }
      95        throw new IllegalArgumentException("未知的枚舉類(lèi)型:" + code + ",請(qǐng)核對(duì)" + type.getSimpleName());
      96    }
      97 
      98}


      枚舉類(lèi)

      01package com.sg.bean;
      02 
      03 
      04public enum EnumStatus {
      05    NORMAL(1"正常"),
      06    DELETE(0"刪除"),
      07    CANCEL(2"注銷(xiāo)");
      08     
      09    private EnumStatus(int code, String description) {
      10        this.code = new Integer(code);
      11        this.description = description;
      12    }
      13    private Integer code;
      14     
      15    private String description;
      16 
      17     
      18    public Integer getCode() {
      19     
      20        return code;
      21    }
      22 
      23     
      24    public String getDescription() {
      25     
      26        return description;
      27    }
      28}


      實(shí)體類(lèi)

      01package com.sg.bean;
      02 
      03 
      04public class User {
      05 
      06    private String id;
      07     
      08    private String accountID;
      09     
      10    private String userName;
      11     
      12    private EnumStatus statusDef; //枚舉屬性,使用mybatis默認(rèn)轉(zhuǎn)換類(lèi)
      13     
      14    private EnumStatus statusOrdinal; //枚舉屬性,使用EnumOrdinalTypeHandler轉(zhuǎn)換
      15     
      16    private EnumStatus statusCustom; // 枚舉屬性,自定義枚舉轉(zhuǎn)換類(lèi)
      17     
      18    public String getId() {
      19        return id;
      20    }
      21 
      22     
      23    public void setId(String id) {
      24        this.id = id;
      25    }
      26 
      27     
      28    public String getAccountID() {
      29        return accountID;
      30    }
      31 
      32     
      33    public void setAccountID(String accountID) {
      34        this.accountID = accountID;
      35    }
      36 
      37     
      38    public String getUserName() {
      39        return userName;
      40    }
      41 
      42     
      43    public void setUserName(String userName) {
      44        this.userName = userName;
      45    }
      46 
      47     
      48    public EnumStatus getStatusDef() {
      49        return statusDef;
      50    }
      51 
      52    public void setStatusDef(EnumStatus statusDef) {
      53        this.statusDef = statusDef;
      54    }
      55 
      56    public EnumStatus getStatusOrdinal() {
      57        return statusOrdinal;
      58    }
      59 
      60    public void setStatusOrdinal(EnumStatus statusOrdinal) {
      61        this.statusOrdinal = statusOrdinal;
      62    }
      63     
      64    public EnumStatus getStatusCustom() {
      65        return statusCustom;
      66    }
      67 
      68    public void setStatusCustom(EnumStatus statusCustom) {
      69        this.statusCustom = statusCustom;
      70    }
      71     
      72    @Override
      73    public String toString() {
      74        StringBuffer str = new StringBuffer();
      75        str.append("id:");
      76        str.append(id);
      77        str.append("\n");
      78         
      79        str.append("userName:");
      80        str.append(userName);
      81        str.append("\n");
      82         
      83        str.append("statusDef:");
      84        str.append(statusDef.name());
      85        str.append("\n");
      86         
      87        str.append("statusOrdinal:");
      88        str.append(statusOrdinal.name());
      89        str.append("\n");
      90         
      91        str.append("statusCustom:");
      92        str.append(statusCustom.name());
      93        str.append("\n");
      94         
      95        return str.toString();
      96    }
      97 
      98}


      mybatis配置文件

      01<?xml version="1.0" encoding="UTF-8" ?>
      02<!DOCTYPE mapper
      03  PUBLIC "-////DTD Mapper 3.0//EN"
      05<mapper namespace="com.sg.bean.User">
      06 
      07  <resultMap type="User" id="userMap">
      08    <id column="id" property="id"/>
      09    <result column="accountID" property="accountID"/>
      10    <result column="userName" property="userName"/>
      11    <result column="statusDef" property="statusDef"/>
      12    <result column="statusOrdinal" property="statusOrdinal" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
      13    <result column="statusCustom" property="statusCustom" typeHandler="com.sg.util.typehandler.EnumStatusHandler"/>
      14  </resultMap>
      15   
      16  <select id="selectUser" resultMap="userMap">
      17    select * from t_user where id = #{id}
      18  </select>
      19   
      20  <insert id="insertUser" parameterType="User">
      21      insert into t_user(id,accountID,userName,statusDef,statusOrdinal,statusCustom) 
      22      values(
      23      #{id}, #{accountID}, #{userName}, 
      24      #{statusDef},
      25      #{statusOrdinal, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
      26      #{statusCustom, typeHandler=com.sg.util.typehandler.EnumStatusHandler}
      27      )
      28  </insert>
      29</mapper>


      數(shù)據(jù)庫(kù)腳本
      1CREATE TABLE `t_user` (
      2  `id` varchar(45) NOT NULL,
      3  `accountID` varchar(45) DEFAULT NULL,
      4  `userName` varchar(45) DEFAULT NULL,
      5  `statusDef` varchar(45) DEFAULT NULL,
      6  `statusOrdinal` varchar(45) DEFAULT NULL,
      7  `statusCustom` int(11) DEFAULT NULL,
      8  PRIMARY KEY (`id`)
      9) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多