最近在做spring boot项目时接触到了jpa,简单介绍一下jpa在项目中便捷开发的用法。
JPA介绍
我们为什么要用jpa,jpa便捷开发在哪里。简单的说,我们在开发一款简单的项目时,大致的步骤就是建表,在Mapper中写sql语句,实体类,dao层,及业务层的开发。jpa的作用就是我们不再需要去创建表,不用再在Mapper中写sql语句,不用再写dao层,而我们只需要写的就是对应表的实体类,这样就可以更加专注于业务层的开发,极大的节省了在基础增删改查方面开发的时间。
配置JPA
首先,我们需要一个spring boot项目,在pom文件中导入JPA相对应的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
然后在application.yum中进行相应的配置。
spring:
dynamic:
primary: a01
datasource:
a01:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//localhost:1521/orcl
username:
password:
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.Oracle10gDialect
这里我用的是oracle数据库配置,mysql只需要改一下上面的datasource配置就可以了。
这样在spring boot项目对JPA的基本配置就完成了,接下来介绍一下代码部分。
项目代码
上面介绍中我们说过,配置JPA后我们只需要写实体类就好了,下面介绍一下实体类怎么写。
JPA是需要根据实体类在数据库中创建表的,所以实体类一定不能写错。先看一下我写的一个简单例子:
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "student")
public class StudentDO implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "StudentSeqGenerator")
@SequenceGenerator(name = "StudentSeqGenerator", sequenceName = "T_Student")
private Long id;
/**
* 创建时间
*/
@CreatedDate
@Column(name = "GMTCREATED")
private Date gmtCreated;
/**
* 修改时间
*/
@LastModifiedDate
@Column(name = "GMTUPDATED")
private Date gmtUpdated;
/**
* 姓名
*/
@Column(name = "T_name" ,length =8,nullable = false)
private String tname;
/**
* 学号
*/
@Column(name = "T_num" ,length =12,nullable = false)
private Long tnum;
/**
* 说明
*/
@Column(name = "T_COMMENT" ,length =64)
private String tcomment;
}
首先实体类要实现 Serializable 接口,将对象序列化。
@Entity 用于定义对象将会成为被 JPA 管理的实体,将字段映射到指定的数据库表中。
@EntityListeners(AuditingEntityListener.class) 这是一个JPA Entity Listener,用于捕获监听信息,当Entity发生持久化和更新操作时。(监听实体类是否发生变化从而修改表结构)
@Table(name = “student”) 生成数据库表名。
@Id 表明字段id为数据库表主键id。
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “StudentSeqGenerator”)
@SequenceGenerator(name = “StudentSeqGenerator”, sequenceName = “T_Student”) 两个注解为创建序列实现主键id自动增长。
@CreatedDate @LastModifiedDate 当表数据增加或修改时,自动生成时间。
@Column(name = “T_XXX” ,length =12,nullable = false) 生成表中字段名,字段长度,是否为空。
这样一个实体类就创建成功了,当项目启动的同时就会根据实体类及数据库配置信息去自动创建表结构。
接下来就是JPA生成增删改查代码,我们知道这些都是JPA帮我们完成的,那么如何去运用他们呢,首先我们先根据实体类去创建对应的dao层,网上都把dao层改成Repository,这个按照习惯就好,只是一个名字。
@Repository
public interface StudentDao extends JpaRepository<StudentDO, Long> {
}
@Repository 交给spring管理方便注入(不多说)
和之前dao层一样 ,extends JpaRepository
public class StudentServiceImpl {
@Autowired
StudentDao studentDao;
public void test(Map<String, Object> params) {
studentDao.delete();
studentDao.save();
studentDao.findAll();
studentDao.getOne();
}
}
delete()删除方法,传参为实体类对象。
save()增加和修改方法,传参为实体类对象。
findAll()查找方法,不用传参。
getOne()根据id查找,传id。
一套根据JPA生成增删改查的方法就完成了,是不是特别的方便呢。
JPA实现分页:
JPA是自带分页的,代码如下:
Pageable pageable = new PageRequest(Integer.parseInt(pageNum)-1, Integer.parseInt(pageSize), Sort.Direction.DESC, "id");
Page<StudentDO> page = (Page<StudentDO>) BranchAcqCodeDao.findAll(pageable);
List<StudentDO> list = page.getContent();
传入pageNum,pageSize,对查询的数据分页,Sort.Direction.DESC, "id"为根据id排序。这样就分页完成了。
JPA实现模糊查询:
平常我们的模糊查询是直接修改sql语句的,但在JPA中没有sql语句,这种方法就行不通了,所以我们就需要自己写sql语句了,因为JPA中是没有模糊查询的。将sql语句写在dao层的接口下:
public interface StudentDao extends JpaRepository<StudentDO, Long> {
@Query(value = "select * from T_student t where t.name like %:name% and t.num like %:num%",nativeQuery = true)
Page<StudentDO> searchByParams(Pageable pageable, @Param("name") String cardNo, @Param("num") String processMode);
}
sql语句写在@Query()中的value中,后面加上nativeQuery = true,否则报错。模糊查询也是需要分页的,所以我们分页就不需要findAll()这个全部查询的方法了,自定义一个searchByParams()方法,将分页信息Pageable pageable传入,以及将要模糊查询的数据作为参数传入,这里是根据name和num模糊查询的,所以要传入name,num。分页就变成了:
Pageable pageable = new PageRequest(Integer.parseInt(pageNum)-1, Integer.parseInt(pageSize), Sort.Direction.DESC, "id");
Page<StudentDO> page = (Page<StudentDO>) BranchAcqCodeDao.searchByParams(pageable,name,num);
List<StudentDO> list = page.getContent();
这样关于JPA的生成表、增删改查、分页、模糊查询的全部代码就都介绍完了。
感谢支持。