4.使用JPA(Hibernate)操作数据库

3. 使用JPA(Hibernate)操作数据库

在springboot中的JPA是依赖Hibernate实现的。在Maven中引入spring-boot-starter-data-jpa,就能够使用JPA编程了。在现在的技术潮流中,springboot已经基本转向Mybats来操作数据库了,较少的使用Hibernate,这里做简单的介绍。这里测试在数据库中建立一张user表,通过JPA实现用户查询操作。

3.1 配置数据库连接参数

在引入starter后会有默认的配置,但是我们需要修改数据连接的基本参数才能正确连接。

# 数据库连接驱动类,spring会自动判断,可以省略
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mxlei?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
# 最大等待连接中的数量,默认0表示没有限制
spring.datasource.tomcat.max-idle=10
# 最大活动连接数
spring.datasource.tomcat.max-active=50
# 最大等待毫秒数
spring.datasource.tomcat.max-wait=10000
# 数据库连接初始化连接数
spring.datasource.tomcat.initial-size=5
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

3.2 定义数据库表和POJO

POJO是指简单Java实体类,用于数据表和Java对象的映射关系。

@Entity(name = "user")
@Table(name = "user")
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;

    @Column(name = "name")
    private String name = null;

    @Column(name = "note")
    private String note = null;

    @Convert(converter = SexConverter.class)
    @Column(name = "sex")
    private SexEnum sex = null;
    //省略setter/getter
}

在数据中用户的性别是用int表示的,1代表男,0代表女。而在Java编程中不希望使用int表示性别,使用枚举会更方便,这里安装JPA的规则编写一个字段转行器。

public enum SexEnum {

    MALE(1, "男"),
    FEMALE(0, "女");

    private int id;
    private String name;

    SexEnum(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public static SexEnum getById(int id) {
        for (SexEnum sex : SexEnum.values()) {
            if (sex.id == id) {
                return sex;
            }
        }
        return null;
    }
}
public class SexConverter implements AttributeConverter<SexEnum, Integer> {
    //将枚举转换为序列
    @Override
    public Integer convertToDatabaseColumn(SexEnum sexEnum) {
        return sexEnum.getId();
    }
    //将数据库序列转换为枚举
    @Override
    public SexEnum convertToEntityAttribute(Integer integer) {
        return SexEnum.getById(integer);
    }
}

3.3 编写数据库操作接口

在JPA中有默认的数据库操作接口JpaRepository,该接口有操作数据库的基本方法,我们只需要继承该接口即可。

@Repository
public interface JpaUserRepository extends JpaRepository<User, Long> {

    List<User> findUserByNameLike(String name);

    User findUserById(Long id);

}

根据前面讲到的,spring使用动态代理的方式实现接口的织入流程。在这里我们只需要编写数据库操作接口,不需要编写任何的SQL语句、数据库连接、事务、关闭等代码即可实现数据库的操作。也不需要编写这个类的实现类。spring会自动扫描到这个接口,然后添加到IOC容器中,使用的时候只需要@AutoWired引用bean即可。

3.4 编写Controller测试

@Controller
@RequestMapping("/jpa")
public class JpaController {

    @Autowired
    private JpaUserRepository jpaUserRepository;

    @RequestMapping("/getUser")
    @ResponseBody
    public User getUser(Long id){
        User user = jpaUserRepository.findUserById(id);
        return user;
    }

    @RequestMapping("/getUserNameLike")
    @ResponseBody
    public List<User> getUser(String name){
        System.out.println(name);
        return jpaUserRepository.findUserByNameLike(name);
    }
}

正确返回结果

{"id":1,"name":"mxlei","note":"lei","sex":"MALE"}

你可能感兴趣的:(spring)