使用@Convert註解將List等不是基本資料型別的變數存入的資料庫中
阿新 • • 發佈:2019-02-09
@Convert 可將不是基本資料型別的資料按照一定的格式轉換成可存入資料庫的基本型別,類似於自動拆裝箱操作。
1、新建Converter類
2、實現javax.persistence.AttributeConverter包下的AttributeConverter介面
3、重寫convertToDatabaseColumn()和convertToEntityAttribute()
4、在實體類的需要轉換到的屬性上加@Convert註解
示例:
Convert
import javax.persistence.AttributeConverter;
import java.sql.Timestamp;
import java.time.Instant;
/**
* Instant 轉換成 Timestamp
* @author peter
* 2018/09/12 22:46
*/
public class InstantConverter implements AttributeConverter<Instant, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(Instant attribute) {
return Timestamp.from(attribute);
}
@Override
public Instant convertToEntityAttribute(Timestamp dbData) {
return dbData.toInstant();
}
}
import org.springframework.util.StringUtils;
import javax.persistence.AttributeConverter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 將List<String> 轉化成字串入庫,按","來區分
* @author peter
* 2018/09/12 23:14
*/
public class ListToStringConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatabaseColumn(List<String> attribute) {
if (attribute == null || attribute.isEmpty()){
return "";
}
StringBuilder sb = new StringBuilder();
attribute.stream().limit(attribute.size()-1).forEach(s -> sb.append(s).append(","));
sb.append(attribute.get(attribute.size()-1));
return sb.toString();
}
@Override
public List<String> convertToEntityAttribute(String dbData) {
if (StringUtils.isEmpty(dbData)){
return new ArrayList<>();
}
String[] data = dbData.split(",");
return Arrays.stream(data).map(String::trim).collect(Collectors.toList());
}
}
實體類
import com.test.utils.InstantConverter;
import com.test.utils.ListToStringConverter;
import lombok.Data;
import javax.persistence.*;
import java.time.Instant;
import java.util.List;
/**
* @author peter
* 2018/09/12 23:12
*/
@Entity
@Data
public class TestObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Convert(converter = InstantConverter.class)
private Instant createTime;
@Convert(converter = ListToStringConverter.class)
private List<String> listName;
}
測試
@Test
public void saveTest() {
TestObject testObject = new TestObject();
List<String> list = Arrays.asList("小明", "小紅", "小妹妹");
testObject.setCreateTime(Instant.now());
testObject.setListName(list);
dao.save(testObject);
}
結果