mybatis對枚舉類型的處理


有時候,我們在數據庫中會插入一些字段的值時固定的,比如性別字段,它的值固定只有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 }
View Code

一.存儲枚舉的名稱,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 }
View Code

對應的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 }
View Code

 

對應的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 }
View Code

采用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 }
View Code

修改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>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM