java 如何在插入时使用typeHandler在mybatis中映射枚举类型
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16000709/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to map Enum type in mybatis using typeHandler on insert
提问by user2279869
I have strugled with enum for a while now but it will not go my way. Is there anyone that can give me hint? I am trying to use Enum type in MySql and I also use an Enum class in my code.
我已经与 enum 斗争了一段时间,但它不会按照我的方式进行。有没有人可以给我提示?我正在尝试在 MySql 中使用 Enum 类型,并且在我的代码中也使用了 Enum 类。
As the code is now It will insert MONDAY but it will also try to insert MONDAY on workdayID... I do not get the workdayID. I belive I have to handle the DAY_TYPE in som way ... define a typeHandler maybe?? but I tried that and it would not work, or its becouse I can not do it correct?
由于代码现在它会插入 MONDAY 但它也会尝试在 workdayID 上插入 MONDAY...我没有得到 workdayID。我相信我必须以某种方式处理 DAY_TYPE ......定义一个 typeHandler 也许??但我试过了,它不起作用,还是因为我不能正确地做?
I also tried the org.apache.ibatis.type.EnumTypeHandler but with no success, like this
我也试过 org.apache.ibatis.type.EnumTypeHandler 但没有成功,就像这样
#{DAY_TYPE,typeHandler=org.apache.ibatis.type.EnumTypeHandler}
DAY_TYPE.java
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
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>
My database table
我的数据库表
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;
采纳答案by user2279869
Workday exists as this
工作日是这样存在的
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....
The correct solution is of course to add enum in the workday table ... and it will reduse database seize a lot I belive.
正确的解决方案当然是在工作日表中添加枚举......它会重新使用数据库,我相信它会占用很多。
<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>
And now delete daytaype table And add enum directly in workday table instead.
现在删除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 ;
回答by Hymany.cheng
override getter setter. my like this:
覆盖 getter setter。我喜欢这样:
@Column(name = "type")
private MailType type;
public String getType(){
return type.name();
}
public void setType(String type){
this.type = MailType.valueOf(type);
}
public MailType getTypeEnum(){
return type;
}
public void setTypeEnum(MailType type){
this.type = type;
}
回答by faizan
DAY_TYPE in your case contains a member id. Now if you store your ENUM as id in the database you can always use a CustomEnumTypeHandler which can handle the DAY_TYPE for you even if you don't have your Enum synced with your database.
您的案例中的 DAY_TYPE 包含成员 ID。现在,如果您将 ENUM 作为 id 存储在数据库中,您始终可以使用 CustomEnumTypeHandler ,即使您没有将 Enum 与数据库同步,它也可以为您处理 DAY_TYPE。