SpringBoot Jpa操作
JPA简介:JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
1、构建Spring Boot基础项目,引入JPA依赖和数据库连接支持
添加pom文件的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
2、添加application.ym的配置文件【注意格式】
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/yh01_boot_jpa?serverTimezone=GMT%2B8 username: root password: 123456 jpa: hibernate: ddl-auto: update show-sql: true
3.编写实体类User
/* @Entity 表示当前类为实体类 @Table 表示和数据库中哪张表对应,name的值表示数据库中的表名,如果没有系统会使用默认值(实体的短类名) @Id 表示主键 @GeneratedValue 表示主键生成策略,在此使用的是主键自增 @Column 表示类属性和表里面的那个列映射关系 @ManyToOne 指User实体和Department实体是多对一的关系 @JoinColumn 与ManyToOne配合使用,说明外键字段是department_id @JsonIgnoreProperties 防止Controller控制层直接返回实体json串报错 */ @Entity @Table(name = "user") @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name = "password") private String password; @Column(name = "createdate") private Date createDate; //部门 @Column(name = "partname") private String partName; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", createDate=" + createDate + ", partName='" + partName + '\'' + '}'; } 。。。。。此处省略get/set方法 }
4.实现Repository 接口
public interface UserRepository extends JpaRepository<User,Integer> { // 以下: 自定义查询方法 /* 描述:通过名字查询用户信息 相当于 select * from user where name= ? 1 */ List<User> findByName(String name); /* 描述:通过Like查询 ,参数位为name 注意 ?1 之间没有空格 相当于:select * from user where name like ?1 也可以写成:select * from user where name like :name 注意name与参数名一致 JPQL语句 :注意from后面跟的是实体类名,?1表示第一个参数 nativeQuery默认false,表示不是标准sql语句,将自动做转换处理 */ List<User> findByNameLike(String name); //SQL查询 //@Query(value = "select * from user where name like ?1",nativeQuery =true) @Query(value = "select * from user where name like :name",nativeQuery =true) List<User> findByNameLike2(String name); //JPQL查询 对应实体类[必须与实体类同名区分大小写] //@Query("select u from User u where u.name like ?1") @Query("select u from User u where u.name like :name") List<User> findByNameLike3(String name); /* 描述:通过主键id集合查询,参数为id集合 */ List<User> findByIdIn(Collection<Integer> ids); /* 更新语句 : @Query还允许更新、删除语句,此时必须搭配@Modifying使用 注意调用方法前需加上@Transactional 事务注解,不然go调用会出错 */ @Modifying @Query("update User u set u.name = ?1 where u.id = ?2 ") int updateUser(String name,Integer id); }
5.创建服务层UserService接口
public interface UserService { User save(User user); void deleteUserById(Integer id); User findUserById(Integer id); List<User> findAllUser(); /* 分页,查询时只需要传入一个Pageable接口实现的类, 指定pageNumber和pageSize即可。 */ Page<User> findAllUserPage(Pageable pageable); //自定义方法查询 List<User> findByName(String name); List<User> findByNameLike(String name); List<User> findByNameLike2(String name); List<User> findByNameLike3(String name); List<User> findByIdIn(Collection<Integer> ids); int updateUserNameById(String name,Integer id); }
6.实现服务层接口UserServiceImpl
/* @Service Spring Boot会自动扫描@Component注解的类,并且把这些类纳入Spring容器中管理。 也可以使用@Compoent注解,只是@Service注解更能表明该类是服务层类 */ @Service public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Override public User findUserById(Integer id) { return userRepository.getOne(id); } @Override public List<User> findAllUser() { return userRepository.findAll(); } @Override public User save(User user) { return userRepository.save(user); } @Override public void deleteUserById(Integer id) { userRepository.deleteById(id); } @Override public Page<User> findAllUserPage(Pageable pageable) { return userRepository.findAll(pageable); } @Override public List<User> findByName(String name) { return userRepository.findByName(name); } @Override public List<User> findByNameLike(String name) { return userRepository.findByNameLike(name); } @Override public List<User> findByNameLike2(String name) { return userRepository.findByNameLike2(name); } @Override public List<User> findByNameLike3(String name) { return userRepository.findByNameLike3(name); } @Override public List<User> findByIdIn(Collection<Integer> ids) { return userRepository.findByIdIn(ids); } @Override public int updateUserNameById(String name, Integer id) { return userRepository.updateUser(name,id); } }
7.创建UserControlle控制类测试
Controller测试:
@Controller @RequestMapping("/user") public class UserController { //模糊查询 @RequestMapping("/getUserListByNameLike") public @ResponseBody List<User> getUserListByNameLike(){ return userService.findByNameLike("%杨%"); } }
运行结果:
其他的请自行测试