SpringBoot整合Jpa

277 阅读1分钟

SpringBoot Data Jpa

创建项目

1620367455744.png

注意:mysql驱动这次不需要添加版本号

package org.southyin.springbootjpa.model;


import javax.persistence.*;

@Entity(name = "tab_user") // 默认使用类名作为表名
public class User {
    @Id // 指定主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
//    @Column(name = "username") 指定 字段名称
    private String name;
    private String address;
}

运行项目查看数据库,表就创建出来了

1620368692335.png

准备Dao

public interface UserDao extends JpaRepository<User,Long> {}

接口继承 JpaRepository ,泛型中第一个参数是这个Dao处理的数据类型,即User,第二个参数是主键类型,即Long,同时这个接口会自动注册进Spring容器当中,JpaRepository 中已经有基本的增删改查操作

测试

@SpringBootTest
class SpringbootJpaApplicationTests {
    @Autowired
    UserDao userDao;

    @Test
    void contextLoads() {
        User user = new User();
        user.setId(1001L);
        user.setAddress("www.southyin.top");
        user.setName("southyin");
        userDao.save(user);
    }

    @Test
    void contextLoads1() {
        List<User> all = userDao.findAll();
        System.out.println(all);
        Optional<User> user = userDao.findById(1L);
        System.out.println(user);
    }

    @Test
    void contextLoads2() {
        // 查询第1页,每页3条记录仪,按照id降序
        PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Order.desc("id")));
        Page<User> page = userDao.findAll(pageRequest);
        System.out.println("总记录数:"+page.getTotalElements());
        System.out.println("查到的数据:"+page.getContent());
    }
}

JpaRepository中的方法不满足我们的需求时,可以自定义方法,但是要满足一定的要求

以查询为例,方法的名字开头可以是getXXX,readXXX或findXXX

@Test
void contextLoads3() {
     List<User> list = userDao.getUsersByNameLike("%i%");
     System.out.println(list);
}

查询方法名称规则如下作为参考

19-5.png

当有特殊需求时,比如查找id最大的用户

public interface UserDao extends JpaRepository<User, Long> {
    List<User> getUsersByNameLike(String name);

    @Query(nativeQuery = true,value = "select * from tab_user where id = (select max(id) from tab_user)")
    User getMaxIdUser();

    @Query("update tab_user set name = :name where id = :id")
    @Modifying
    int updateUsernameById(String name, Long id);
}
@Service
public class UserService {
    @Autowired
    UserDao userDao;
    @Transactional
    public int updateUsername(String name,Long id) {
        return userDao.updateUsernameById(name, id);
    }
}
    @Test
    void contextLoads4() {
        User maxIdUser = userDao.getMaxIdUser();
        System.out.println(maxIdUser);
    }

    @Autowired
    UserService userService;
    @Test
    void contextLoads5() {
        userService.updateUsername("SouthYin", 1L);
    }

注意:DML操作涉及事务