有時候,我們在數據庫中會插入一些字段的值時固定的,比如性別字段,它的值固定只有2個,男或者女; 或者季節字段,只有春夏秋冬4種。有時候在Java類中會采用枚舉類型來表達相應的數據庫字段,比如如下數據表:
create table student( id int auto_increment comment '學生ID', name varchar(50), gender varchar(10), primary key(id));
枚舉類定義如下:
package com.example.demo.dao; public enum Gender { FEMAIL("女"), MAIL("男"); private String sex; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } Gender(String s){ this.sex=s; } }
實體類定義如下:

1 package com.example.demo.dao; 2 3 public class Student { 4 private int id; 5 private String name; 6 private Gender gender; 7 8 public int getId() { 9 return id; 10 } 11 12 public void setId(int id) { 13 this.id = id; 14 } 15 16 public String getName() { 17 return name; 18 } 19 20 public void setName(String name) { 21 this.name = name; 22 } 23 24 public Gender getGender() { 25 return gender; 26 } 27 28 public void setGender(Gender gender) { 29 this.gender = gender; 30 } 31 }
一.存儲枚舉的名稱,Gender在數據庫中值為:FEMAIL
此方式是mybatis對枚舉類型的默認處理方式,使用的類型處理器是org.apache.ibatis.type.EnumTypeHandler
SQL如下:
<insert id="insertStudent" parameterType="com.example.demo.dao.Student"> insert into student(name,gender) values(#{name},#{gender}) </insert>
對應的Mapper為:

1 package com.example.demo.dao.mapper; 2 3 import com.example.demo.dao.Student; 4 import org.apache.ibatis.annotations.Mapper; 5 6 7 @Mapper 8 public interface StudentMapper { 9 int insertStudent(Student student); 10 }
對應的Controller為:

1 package com.example.demo.controller; 2 3 import com.example.demo.dao.Gender; 4 import com.example.demo.dao.Student; 5 import com.example.demo.service.StudentService; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 8 import org.springframework.web.bind.annotation.GetMapping; 9 import org.springframework.web.bind.annotation.RequestMapping; 10 import org.springframework.web.bind.annotation.RestController; 11 12 @RestController 13 @EnableAutoConfiguration 14 @RequestMapping("/student") 15 public class StudentController { 16 @Autowired 17 StudentService studentService; 18 19 20 @GetMapping("/insertStudent") 21 int insertStudent(){ 22 Student student=new Student(); 23 student.setName("張三"); 24 student.setGender(Gender.FEMAIL); 25 return studentService.insertStudent(student); 26 } 27 }
對應的service為:

1 package com.example.demo.service.impl; 2 3 import com.example.demo.dao.Student; 4 import com.example.demo.dao.mapper.StudentMapper; 5 import com.example.demo.service.StudentService; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.stereotype.Service; 8 9 10 @Service 11 public class StudentServiceImpl implements StudentService { 12 @Autowired 13 StudentMapper studentMapper; 14 15 @Override 16 public int insertStudent(Student student) { 17 return studentMapper.insertStudent(student); 18 } 19 }
采用postman測試:
二.存儲枚舉的索引,FEMAIL在數據庫中值為:0
此方式使用的類型處理器是org.apache.ibatis.type.EnumOrdinalTypeHandler,使用 typeHandler 設置類型處理為org.apache.ibatis.type.EnumOrdinalTypeHandler
修改sql為:
<insert id="insertStudent" parameterType="com.example.demo.dao.Student"> insert into student(name,gender) values(#{name},#{gender,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}) </insert>
采用Postman測試:
三.存儲枚舉的值,這里存儲“女”
前面兩種方式使用mybatis提供的類型處理器,如果想存儲上面枚舉的值,比如:Gender.FEMAIL的值女,就需要創建一個自定義的類型處理器,只需要繼承BaseTypeHandler
自定義類型處理器如下:

1 package com.example.demo.dao; 2 3 import org.apache.ibatis.type.BaseTypeHandler; 4 import org.apache.ibatis.type.JdbcType; 5 import org.apache.ibatis.type.MappedJdbcTypes; 6 import org.apache.ibatis.type.MappedTypes; 7 8 import java.sql.CallableStatement; 9 import java.sql.PreparedStatement; 10 import java.sql.ResultSet; 11 import java.sql.SQLException; 12 13 /* 數據庫中的數據類型 */ 14 @MappedJdbcTypes(JdbcType.VARCHAR) 15 /* 轉化后的數據類型 */ 16 @MappedTypes(value = Gender.class) 17 public class MyEnumHandler extends BaseTypeHandler<Gender> { 18 @Override 19 public void setNonNullParameter(PreparedStatement preparedStatement, int i, Gender gender, JdbcType jdbcType) throws SQLException { 20 preparedStatement.setString(i,gender.getSex()); 21 } 22 23 @Override 24 public Gender getNullableResult(ResultSet resultSet, String s) throws SQLException { 25 String val=resultSet.getString(s); 26 return getEnum(val); 27 } 28 29 @Override 30 public Gender getNullableResult(ResultSet resultSet, int i) throws SQLException { 31 return getEnum(resultSet.getString(i)); 32 } 33 34 @Override 35 public Gender getNullableResult(CallableStatement callableStatement, int i) throws SQLException { 36 return getEnum(callableStatement.getNString(i)); 37 } 38 39 /** 40 * 根據值獲得對應的枚舉 41 * @param val 42 * @return 43 */ 44 private Gender getEnum(String val){ 45 Class<Gender> sexClass = Gender.class; 46 Gender[] sexs = sexClass.getEnumConstants(); 47 48 for(Gender se:sexs){ 49 if(se.getSex().equals(val)){ 50 return se; 51 } 52 } 53 return null; 54 } 55 }
修改sql:
<insert id="insertStudent" parameterType="com.example.demo.dao.Student"> insert into student(name,gender) values(#{name},#{gender,typeHandler=com.example.demo.dao.mapper.MyEnumHandler}) </insert>