SpringBoot Data Jpa
创建项目
注意: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;
}
运行项目查看数据库,表就创建出来了
准备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);
}
查询方法名称规则如下作为参考
当有特殊需求时,比如查找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操作涉及事务