springDataJpa入门教程(9)-spring jpa实体属性类型转换器AttributeConverter的用法

springDataJpa入门教程

springDataJpa入门教程(9)-spring jpa实体属性类型转换器AttributeConverter的用法

有些情况下,实体类的属性和数据库的字段类型并不是一一对应的关系,比如说实体类的某个属性为枚举类型,而数据库字段是整型,这种情况下,需要借助JPA提供AttributeConverter接口来完全实体类属性和数据库字段之间的映射。下面以User实体类为例,讲讲AttributeConverter属性转换器的用法。
首先,来看一下User类的代码:

import com.thizgroup.jpa.study.converter.SexEnumAttributeConverter;
import com.thizgroup.jpa.study.enums.SexEnum;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "tb_user")
@Data//使用lombok生成getter、setter
@NoArgsConstructor//生成无参构造方法
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected Long id;

  @Column(name = "name",columnDefinition = "varchar(64)")
  private String name;

  @Column(name = "mobile",columnDefinition = "varchar(64)")
  private String mobile;

  @Column(name="sex",columnDefinition = "int(1)")
  private SexEnum sex;
}

User类中,有个性别属性sex,它的类型是枚举类型,SexEnum.java如下:

import lombok.Getter;

@Getter
public enum SexEnum {

  MAN(1,"男"),
  WOMAN(2,"女");

  private Integer code;

  private String msg;

  private SexEnum(Integer code,String msg){
    this.code = code;
    this.msg = msg;
  }

sex属性对应的数据库表字段类型为int(1),数据库中它是这样的,
在这里插入图片描述
为了解决属性转换的问题,我们来定义一个属性转换器类,并实现AttributeConverter接口。
AttributeConverter<X,Y>该接口中需要实现两个方法:

  • y convertToDatabaseColumn(x) 作用:将实体属性x转化为y存储到数据库中,即插入和更新操作时执行;
  • x convertToEntityAttribute(y) 作用:将数据库中的字段y转化为实体属性x,即查询操作时执行。
import com.thizgroup.jpa.study.enums.SexEnum;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)//autoApply为true表示这个转换器被自动应用到所有的entity
public class SexEnumAttributeConverter implements AttributeConverter<SexEnum,Integer> {

  @Override
  public Integer convertToDatabaseColumn(SexEnum sexEnum) {
    if(sexEnum == null) return null;
    return sexEnum.getCode();
  }

  @Override
  public SexEnum convertToEntityAttribute(Integer code) {
    if(code == null) return null;
    SexEnum[] values = SexEnum.values();
    for(SexEnum sexEnum : values) {
      if(code.equals(sexEnum.getCode())) return sexEnum;
    }
    throw new IllegalArgumentException("无效的SexEnum:"+code);
  }
}

AttributeConverter属性转换器要配合@Converter注解来使用,@Converter注解的作用是告诉JPA这是一个属性转换器,autoApply =true的作用是表示这是一个全局的属性转换器,也就是说这个转换器对所有的实体类都起作用,
AttributeConverter有两个泛型参数:

  • 第一个参数表示实体类中需要被转换的属性类型。
  • 第二个参数表示与数据库表字段对应的java类型。
    因此,这里的泛型分别是SexEnum和Integer。
    接下来就是重写AttributeConverter接口的两个方法来实现属性之间的转换。
    注意:SexEnumAttributeConverter 类必须位于@EntityScan注解的包路径下,否则转换器将不起作用。代码如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
//配置springDataJpa扫描Repository的包路径
@EntityScan(basePackages = {"com.thizgroup.jpa.study.model","com.thizgroup.jpa.study.dto"
,"com.thizgroup.jpa.study.converter"})
@EnableJpaRepositories("com.thizgroup.jpa.study.dao")
@EnableJpaAuditing//启动jpa审计功能
public class JpaApplication {

  public static void main(String[] args) {
    SpringApplication.run(JpaApplication.class,args);
  }

}

上面讲的这种方式是将AttributeConverter转化器作用于全局,对所有的实体类都起作用,但是在实际开发中,我们可能需要对某个实体类的属性的转换做特殊处理,那这种情况下,该怎么办呢?@Convert注解可以帮我们解决这个问题,将@Convert注解直接定义在实体类的属性上,也同样能实现属性之间的转换,代码如下:

import com.thizgroup.jpa.study.converter.SexEnumAttributeConverter;
import com.thizgroup.jpa.study.enums.SexEnum;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "tb_user")
@Data//使用lombok生成getter、setter
@NoArgsConstructor//生成无参构造方法
public class User{

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected Long id;

  @Column(name = "name",columnDefinition = "varchar(64)")
  private String name;

  @Column(name = "mobile",columnDefinition = "varchar(64)")
  private String mobile;

  @Convert(converter = SexEnumAttributeConverter.class)
  @Column(name="sex",columnDefinition = "int(1)")
  private SexEnum sex;
}

好了,AttributeConverter的用法介绍就到此结束了,有需要源码的朋友,请到git上下载源码,源码地址:https://github.com/hgq0916/springdatajpa-study.git。java学习交流群:184998348,欢迎大家一起交流学习。

上一篇:springDataJpa入门教程(8)-JPA EnableJpaAuditing 审计功能
下一篇:springDataJpa入门教程(10)-JPA使用过程中遇到的坑及解决方法
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Data JPA 是一个用于简化数据库访问的框架,它基于 JPA (Java Persistence API) 规范,提供了一种更简单、更高效的方式来访问和操作数据库。 下面是使用 Spring Data JPA 的一般步骤: 1. 添加依赖:在你的项目中,添加 Spring Data JPA 的依赖。你可以在 Maven 或 Gradle 配置文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据库连接:在 `application.properties` 或 `application.yml` 文件中配置数据库连接信息,包括数据库 URL、用户名、密码等。 3. 创建实体类:创建与数据库表对应的实体类,并使用 JPA 注解来映射实体类与数据库表之间的关系。 ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // getters and setters } ``` 4. 创建 Repository 接口:创建一个继承自 `JpaRepository` 的接口,并通过方法命名规则或自定义查询方法来定义数据库操作。 ```java public interface UserRepository extends JpaRepository<User, Long> { List<User> findByAgeGreaterThan(Integer age); } ``` 5. 使用 Repository:在需要访问数据库的地方,注入 Repository 接口,并调用其中的方法进行数据库操作。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByAgeGreaterThan(Integer age) { return userRepository.findByAgeGreaterThan(age); } } ``` 这只是 Spring Data JPA 的基本用法,你还可以使用更高级的特性,如分页、排序、复杂查询等。希望这些信息对你有帮助!如果你有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值