SpringBoot整合JPA(六)上

日常生活中,我们并不使用 JdbcTemplate, 而是使用 JPA和MyBatis,MyBatis-Plus. 这一章节,我们讲解一下, JPA的相关操作。


一. SpringBoot 整合 JPA前期准备


按照老蝴蝶以前讲解的方式,采用Maven 构建SpringBoot项目。


一.一 pom.xml 添加依赖


 <!--引入MySql的驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--引入springboot与jpa整合的依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>


一.二 application.yml 添加JPA的配置


# 引入 数据库的相关配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: abc123
  # JPA的相关配置
  jpa:
    # 设置数据库平台
    database-platform: org.hibernate.dialect.MySQLDialect
    # 设置数据库
    database: mysql
    # 是否展示SQL语句
    show-sql: true
    hibernate:
      # 持久化规则是 update
      ddl-auto: update
      naming:
        # 物理命名策略类的全限定名称
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl


一.三 创建 User 表


DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(15) DEFAULT NULL,
  `sex` varchar(20) DEFAULT NULL,
  `age` int(6) DEFAULT NULL,
  `description` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;


二. 整合JPA应用


SpringBoot整合JPA时,需要创建相应的 实体类,工厂接口。


工厂接口有 Crud接口,有 PagingAndSorting,有 Jpa接口,也有 Specification 动态查询接口。


每一种接口,都有其特殊的功能。


二.一 创建 POJO 类和业务类


在 pojo 包下,创建 User.java


@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user")
@Entity
public class User implements Serializable {
    /**
     * @param id id编号
     * @param name 姓名
     * @param sex 性别
     * @param age 年龄
     * @param description 描述
     */
    @Id
    //指定生成策略
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "name")
    private String name;
    @Column(name="sex")
    private String sex;
    @Column(name="age")
    private Integer age;
    @Column(name="description")
    private String description;
}


在 service包下,创建相应的接口和实现类


public interface UserService {
    
}


@Service
public class UserServiceImpl implements UserService {
    
}


二.二 Crud 工厂接口


二.二.一 接口的相关定义


org.springframework.data.repository.CrudRepository


@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {

}


SpringBoot整合JPA(六)上


二.二.二. Crud 接口实现


在 repository 包下,创建 UserCrudRepository 接口。


public interface UserCrudRepository extends CrudRepository<User,Integer> {

}


二.二.三 Crud 测试


在 test测试目录下,创建对应的测试类和测试方法,进行测试。


@SpringBootTest
@Log4j2
public class CrudRepositoryTests {
    @Autowired
    private UserService userService;
}


二.二.三.一 插入 save 方法


测试方法:


  @Test
    public void addTest(){
        //1. 构建对象
        User user=new User();
        user.setName("欢欢");
        user.setAge(22);
        user.setSex("女");
        user.setDescription("一个非常可爱的女孩纸");
        //2. 添加方法
        userService.addUser(user);
       log.info("添加成功,{}",user);
    }


省略接口方法,其对应的实现方法


添加Crud接口注入


@Autowired
private UserCrudRepository userCrudRepository;




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


控制台打印输出:


SpringBoot整合JPA(六)上


二.二.三.二 更新 save 方法


测试方法


   @Test
    public void updateTest(){
        //1. 构建对象
        User user=new User();
        user.setId(1); //id不存在,会添加
        user.setName("欢欢");
        user.setDescription("岳泽霖最好的朋友");
        //2. 修改方法
        userService.updateUser(user);
        log.info("修改成功,{}",user);
    }


接口实现方法


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


控制台打印输出


SpringBoot整合JPA(六)上


先查询,发现有,就更新,如果没有的话,就插入。


二.二.三.三 删除 delete 方法


测试方法


  @Test
    public void deleteTest(){
        userService.deleteUser(1);
    }


接口实现方法


 @Override
    public void deleteUser(Integer id) {
        userCrudRepository.deleteById(id);
    }


SpringBoot整合JPA(六)上


数据库里面,没有此条数据了。


二.二.三.四 批量更新数据 saveAll


重新执行一下, save() 方法,插入一条数据, id=2.


测试方法:


   @Test
    public void batchAddTest(){
        //1. 构建对象
        User user=new User();
        user.setName("小欢欢");
        user.setAge(22);
        user.setSex("女");
        user.setDescription("一个小坏蛋");

        User user1=new User();
        user1.setName("小泽霖");
        user1.setAge(25);
        user1.setSex("男");
        user1.setDescription("一个大坏蛋");

        //这是修改的操作,id=2已经存在这条记录了。
        User user2=new User();
        user2.setName("岳泽霖");
        user2.setId(2);
        user2.setAge(25);
        user2.setSex("男性");
        user2.setDescription("一个快乐的程序员");

        //2. 放置到集合里面
        List<User> userList=new ArrayList<>();
        userList.add(user);
        userList.add(user1);
        userList.add(user2);
        userService.batchAddUser(userList);
    }


接口实现方法:


 @Override
    public void batchAddUser(List<User> userList) {
        userCrudRepository.saveAll(userList);
    }


SpringBoot整合JPA(六)上


会插入前两条,更新第三条记录。

上一篇:多数据源配置JdbcTemplate(十五)上


下一篇:一个线上SQL死锁异常分析:深入了解事务和锁