使用mybatis自带的枚举类处理,有2种方式,一个是EnumTypeHandler,一个是EnumOrdinalTypeHandler。
区别如下:
EnumTypeHandler直接存储name值。它是mybatis默认的枚举类型转换器。
EnumOrdinalTypeHandler存储enum类里的序号值,此时数据库表字段一般对应用smallint/int类型的处理。
也可以使用 自定义的typeHandler来实现枚举映射:
一、EnumOrdinalTypeHandler
public enum Sex {
MALE(1,"男"),
FEMALE(2, "女");
private int id;
private String name;
Sex(int id, String name){
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Sex getSex(int id){
if(id == MALE.getId()){
return MALE;
}else if(id == FEMALE.getId()){
return FEMALE;
}
return null;
}
}
User类:
@Alias("user")
public class User {
private int id;
private String userName;
private String password;
private String email;
private String address;
private int age;
private int sex;
...setter、getter方法
}
mybatis-config.xml
<!--注册自定义的typeHandler-->
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="string" handler="typeHandler.MyStringTypeHandler"/>
<!-- EnumOrdinalTypeHandler -->
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="util.Sex" />
</typeHandlers>
userMapper.xml
<mapper namespace="mapper.UserMapper">
<resultMap type="user" id="userMap">
<!--定义结果类型转化标识,才能使用类型转换器-->
<id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
<id column="user_name" property="userName" javaType="string" jdbcType="VARCHAR"/>
<id column="password" property="password" javaType="string" jdbcType="VARCHAR"/>
<id column="email" property="email" typeHandler="typeHandler.MyStringTypeHandler"/>
<id column="address" property="address" typeHandler="typeHandler.MyStringTypeHandler"/>
<id column="age" property="age" javaType="int" jdbcType="INTEGER"/>
<id column="sex" property="sex" />
</resultMap>
<select id="getUserById" resultMap="userMap" parameterType="int">
select id, user_name, password, address, email, age, sex from user where id=#{id}
</select>
</mapper>
数据库中的数据存数:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`user_name` varchar(30) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'amy', 'amy123', 'amy@163.com', '北京市', '30', '2');
INSERT INTO `user` VALUES ('2', 'panda', '123456', 'panda@sina.com', '天津市', '27', '1');
INSERT INTO `user` VALUES ('3', 'balala', '54321', 'balala@163.com', '河北省', '10', '1');
工具类:
public class SqlSessionFactoryUtil {
//SqlSessionFactory对象
private static SqlSessionFactory sqlSessionFactory = null;
//类线程锁
private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;
private SqlSessionFactoryUtil(){}
/**
* 构建SqlSessionFactory
*/
public static SqlSessionFactory initSqlSessionFactory(){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try{
inputStream = Resources.getResourceAsStream(resource);
}catch (IOException ex){
Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.ERROR, null, ex);
}
synchronized (CLASS_LOCK) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
}
public static SqlSession openSqlSession(){
if (sqlSessionFactory == null) {
initSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
测试类:
public class UserTest {
public static void main(String[] args) {
SqlSession sqlSession = null;
try{
sqlSession = SqlSessionFactoryUtil.openSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user.getUserName());
System.out.println(user.getAddress());
System.out.println(user.getEmail());
System.out.println(user.getSex());
}finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
运行结果
amy
北京市
amy@163.com
2
二、EnumOrdinalTypeHandler
这里只写和EnumOrdinalTypeHandler不同的代码部分
1、User类中sex的定义
//其中sex也可以定义成String类型
private Sex sex;
2、mybatis-config.xml
<typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="util.Sex" />
3、userMapper.xml
<id column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
4、数据库中sex字段的定义:
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`user_name` varchar(30) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` enum('FEMALE','MALE') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'amy', 'amy123', 'amy@163.com', '北京市', '30', 'FEMALE');
INSERT INTO `user` VALUES ('2', 'panda', '123456', 'panda@sina.com', '天津市', '27', 'MALE');
INSERT INTO `user` VALUES ('3', 'balala', '54321', 'balala@163.com', '河北省', '10', 'MALE');
还是使用上面的UserTest类测试:
结果:
amy
北京市
amy@163.com
FEMALE