SpringBoot-整合Spring Data JPA

1,361 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

JPA(Java Persistence API)是Sun官方提出的Java持久化规范,主要实现有Hibernate、OpenJpA等。Spring Data JPA是Spring Data的一个子项目,通过提供基于JPA的Respositoty极大地减少了JPA作为数据访问方案的代码量。

创建表

CREATE TABLE `tb_user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(32) NULL DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) NULL DEFAULT NULL COMMENT '密码',
  `sex` varchar(2) NULL DEFAULT NULL COMMENT '性别 1-男 2-女 3-未知',
  `age` int NULL DEFAULT NULL COMMENT '年龄',
  `email` varchar(64) NULL DEFAULT NULL COMMENT '邮箱',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_username`(`user_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 COMMENT = '用户表' ROW_FORMAT = Dynamic;

引入依赖

        <!--Spring data JPA-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!--mysql connector-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

添加配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/miracle
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

添加实体类和Dao

@Data
@Entity
@Table(name = "tb_user")
public class User {

    @Id
    @GeneratedValue
    private Integer id;
    @Column
    private String userName;
    @Column
    private String password;
    @Column
    private String sex;
    @Column
    private Integer age;
    @Column
    private String email;
    @Column
    private LocalDateTime createTime;
    @Column
    private LocalDateTime updateTime;
}

  • @Entity :每个持久化 POJO 类都是一个实体 Bean ,通过在类的定义中使用Entity 注解来进行声明

  • Table :声明此对象映射 数据库 数据表。该 不是必需的,如果没有,系统就会使用默认值(实体的短类名)。

  • Id :指定表的主键

我们创建一个UserRepository接口类继承JpaRepository

public interface UserRepository extends JpaRepository<User, Integer> {

    User findByUserName(String userName);

}

JpaRepository接口是PagingAndSortingRepositoryCrudRepository的子类,CrudRepository类提供了基本的增删改查等接口,PagingAndSortingRepository类提供了基本的分页和排序等接口。除此之外,我们还可以自定义查询方法。比如上面的findByUserName方法,就是根据用户名进行查询。Spring Data JPA为我们预定了一系列规范,只要我们按照规范编写代码,Spring Data JPA就会根据代码翻译成相关的SQL语句,进行数据库查询。比如可以使用findBy、Like、In等关键字,其中findBy可以用read、readBy、query、queryBy、get、getBy来代替。更多查询方式可以参见官方文档

服务类实现

public interface UserService {

    Optional<User> findById(int id);

    User findByUsername(String username);

    List<User> findAll();

    Page<User> findAll(Pageable pageable);
    
    void save(User user);
    
    void delete(User user);
}

@Service
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserRepository userRepository;

    @Override
    public Optional<User> findById(int id) {
        return userRepository.findById(id);
    }

    @Override
    public User findByUsername(String username) {
        return userRepository.findByUserName(username);
    }

    @Override
    public List<User> findAll() {
        return userRepository.findAll();
    }

    @Override
    public Page<User> findAll(Pageable pageable) {
        return userRepository.findAll(pageable);
    }

    @Override
    public void save(User user) {
        userRepository.save(user);
    }

    @Override
    public void delete(User user) {
        userRepository.delete(user);
    }
}

就这几行代码已经实现了一个比较完整的增删查逻辑了,下面我们来测试一下,可以写个Controller,这里我们使用SpringBoot Test来测试。

测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserServiceImplTest {

    @Autowired
    private UserService userService;

    @Test
    public void test() {
        User user = new User("miracle", "123456", "男", 20, "kevl5sha@163.com");
        User user1 = new User("miracle1", "123456", "男", 20, "kevl5sha@163.com");
        userService.save(user);
        userService.save(user1);
        List<User> users = userService.findAll();
        System.out.println(users);
        User miracle = userService.findByUsername("miracle");
        System.out.println(miracle);
        Pageable pageable = PageRequest.of(1, 10);
        userService.findAll(pageable);
        userService.delete(user);
    }

}