2013-04-14 16 views
8

我已经和enum一起努力了一段时间,但它不会按我的方式。 有没有人可以给我提示? 我想在MySql中使用枚举类型,我也在我的代码中使用Enum类。如何使用typeHandler在插入中映射枚举类型在mybatis中

由于现在的代码它会插入MONDAY,但它也会尝试在workdayID上插入MONDAY ...我没有得到workdayID。 我相信我必须以索姆的方式处理DAY_TYPE ...定义一个typeHandler也许? 但我试过,它不会工作,或者它的becouse我不能做到正确?

我也试过org.apache.ibatis.type.EnumTypeHandler但没有成功,这样

#{DAY_TYPE,typeHandler=org.apache.ibatis.type.EnumTypeHandler} 

DAY_TYPE.java

package tut.model; 
    import java.io.Serializable; 
    public enum DAY_TYPE implements Serializable{ 
     MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7); 
     private int id; private int workdayID; 

     private DAY_TYPE(int id) { this.id = id; } 

     public int getId() { return id; } 
     public void setId(int id) { this.id = id; } 

     public int getWorkdayID() { return workdayID; } 
     public void setWorkdayID(int workdayID) {this.workdayID = workdayID;} 
    } 

DAY_TYPE_Mapper.xml

<insert id="insert" parameterType="DAY_TYPE" useGeneratedKeys="true" keyProperty="iddaytaype"> 
     INSERT INTO daytaype (DAY_TYPE, workdayID) 
     VALUES (#{DAY_TYPE},#{workdayID}) 
     <selectKey keyProperty="iddaytaype" resultType="long" order="AFTER"> 
      SELECT LAST_INSERT_ID(); 
     </selectKey> 
    </insert> 

<!-- <insert id="insert" parameterMap="insert-params" useGeneratedKeys="true" keyProperty="iddaytaype"> --> 
    <parameterMap id="insert-params" type="DAY_TYPE"> 
     <parameter property="DAY_TYPE" javaType="DAY_TYPE" typeHandler="mappings.XenumTypeHandler" /> 
     <parameter property="workdayID" javaType="int" /> 
    </parameterMap> 

我的数据库表

CREATE TABLE `daytaype` (
     `iddaytaype` int(11) NOT NULL AUTO_INCREMENT, 
     `DAY_TYPE` enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY') NOT NULL, 
     `workdayID` int(11) unsigned DEFAULT NULL, 
     PRIMARY KEY (`iddaytaype`), 
     KEY `fk_workDayID_idWorkDay` (`workdayID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;=InnoDB DEFAULT CHARSET=utf8;  
+0

也许你不能使用枚举作为parameterType? 像这样'parameterType =“DAY_TYPE”' – user2279869

+0

好的,任何人? 至少告诉我,如果我很不耐烦,或者没有做我的功课或者还有其他东西丢失了,是的,我知道有些人说,通常不会在代码和数据库中存储枚举值,而只是将ID存储在数据库中。 – user2279869

+0

http://stackoverflow.com/questions/10219253/mybatis-enum-usage – jalopaba

回答

7

工作日存在,因为这

public class Workday implements Serializable{ 
     private long idWorkDay; 
     private Date start; 
     private Date end; 
     private List<Workbreak> workBreaks; 
     private DAY_TYPE DAY_TYPE; 
     private long workweekID; 
     getter setter.... 

正确的解决方法当然是在工作日表中添加枚举......它会reduse数据库抓住了很多我相信。

<insert id="insert" parameterType="workday" useGeneratedKeys="true" keyProperty="idWorkDay"> 
     INSERT INTO workday 
     (start , end , workweekID , DAY_TYPE) 
     VALUES (
     #{start}, 
     #{end}, 
     #{workweekID}, 
     #{DAY_TYPE, typeHandler=org.apache.ibatis.type.EnumTypeHandler} 
    ) 
     <selectKey keyProperty="idWorkDay" resultType="long" order="AFTER"> 
      SELECT LAST_INSERT_ID(); 
     </selectKey> 
    </insert> 

现在删除daytaype表 并直接在工作日表中添加枚举来代替。

CREATE TABLE `workday` (
     `idworkday` int(11) NOT NULL AUTO_INCREMENT, 
     `start` time DEFAULT '08:00:00', 
     `end` time DEFAULT '17:00:00', 
     `workweekID` int(11) DEFAULT NULL, 
     `DAY_TYPE` enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY') DEFAULT NULL, 
     PRIMARY KEY (`idworkday`), 
     KEY `fk_workweek_workweekID` (`workweekID`), 
     CONSTRAINT `fk_workweek_workweekID` FOREIGN KEY (`workweekID`) REFERENCES `workweek` (`idworkweek`) ON DELETE CASCADE ON UPDATE NO ACTION 
    ) ENGINE=InnoDB AUTO_INCREMENT=139 DEFAULT CHARSET=utf8 ; 
0

您的案例中的DAY_TYPE包含成员ID。 现在,如果您将ENUM作为ID存储在数据库中,则即使您没有将Enum与数据库同步,也可以始终使用可为您处理DAY_TYPE的CustomEnumTypeHandler。