1. JPA相关简介
jpa 是
Java Persistence API
的简称,中文名 Java持久层API,在JDK5.0后提出的Java持久化规范。其目的是为了简化现有JAVA EE
和JAVA SE
应用开发工作,以及整合现有的ORM技术,然后实现规范统一化的伟大目标。jpa 只是一种规范,从功能上来说,jpa 就是 Hibernate 功能的一个子集。常见的ORM框架中 Hibernate 的 jpa 最为完整,因此
Spring Data JPA
是采用基于 jpa 规范的 Hibernate 框架基础下提供了Repository
层的实现。Spring Data Repository
极大地简化了实现各种持久层的数据库访问而写的样板代码量,同时CrudRepository
提供了丰富的CRUD功能。当然了,它也有自身的缺点,学习这玩意儿,我们需要学习hql语句,然后配置上来说相对复杂一些(特别是在多表查询上啊...),还有就是它的性能不如mybatis 和jdbc啦
2. 添加相关依赖
在
pom.xml
中添加spring-boot-starter-data-jpa
的依赖,添加 mysql 的依赖
<!-- spring-boot-starter-data-jpa 将会自动获得HikariCP依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
3. 配置数据源,连接数据库
在
application.properties
中添加如下配置。值得注意的是,SpringBoot默认会自动配置DataSource
,它将优先采用HikariCP
连接池,如果没有该依赖的情况则选取tomcat-jdbc
,如果前两者都不可用最后选取Commons DBCP2
。我们可以通过spring.datasource.type
属性来指定其它种类的连接池,这个就看个人喜好啦..
# JPA配置
spring.jpa.hibernate.ddl-auto=update
# 输出日志
spring.jpa.show-sql=true
# 数据库类型
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
# spring.datasource.type 该属性可指定其它种类的连接池
ddl-auto 几种属性
- create:每次运行程序时,都会重新创建表,所以数据会丢失
- create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
- upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(我们一般都用这个的...)
- validate:运行程序会校验数据与数据库的字段类型是否相同,所以当字段不同的时候会报错的...
4. 实体类
JPA规范注解在
javax.persistence
包下,注意@Id
注解不要引用错了。@GeneratedValue(strategy = GenerationType.IDENTITY)
是自增策略,还有就是不需要映射的字段可以通过@Transient
注解排除掉常见的几种自增策略
- TABLE:使用一个特定的数据库表格来保存主键
- AUTO:主键由程序控制,也是GenerationType的默认值。
- IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库)
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器。
@Setter //setter 和 getter 注解加上后可以不写get和set方法了
@Getter
@Entity // 指明这个是实体类,然后也可以写成这种 @Entity(name = "tb_user") tb_user 就是指的某张具体的表
public class TbUser implements Serializable {
private static final long serialVersionUID = 8655851615465363473L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private boolean sex;
@Transient // 返回的数据中忽略该字段
private String email;
}
5. Repository
创建
UserRepository
数据访问层接口,需要继承JpaRepository<T,K>
,第一个泛型参数是实体对象的名称,第二个是主键类型。JpaRepository
本身就包含了常用的crud功能,JPA支持@Query
注解写HQL,也支持findAllByUsername
这种根据字段名命名的方式
@Repository
public interface TbUserRepository extends JpaRepository<TbUser, Long> {
/**
* 根据用户名查询用户信息
*
* @param username 用户名
* @return 查询结果
*/
List<TbUser> findByUsername(String username);
}
6. 测试
我们在springboot自带的测试类中进行测试,下面的
findByUsername
试类是我们自己写的,当然JpaRepository
自带的CRUD我这里就没写了,你们可以自己试一下...
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private TbUserRepository tbUserRepository;
@Test
public void contextLoads() {
}
private static final Logger log = LoggerFactory.getLogger(SpringBootDataJpaApplicationTests.class);
@Test
public void test1() {
final List<TbUser> user = tbUserRepository.findByUsername("1111");
log.info("[根据用户名查询] - [{}]", user);
}
}
7. controller层
当然,也可写在controller层里,我们使用postman等测试工具模拟接口访问进行测试
@RestController
@RequestMapping("/TbUser")
public class AccountController {
@Autowired
TbUserRepository tbUserRepository;
@GetMapping(value = "/findAll")
public List<TbUser> getAccounts() {
return tbUserRepository.findByUsername("1111);
}
}
8. 结语
按照惯例写个结语,嗯...看了很多大佬的教程,结合我自己的总结了一波,当然了,不足之处请多包涵,也请多指教...如有雷同,也请多包涵...嘻嘻...
最近一周都在改需求... 嗯...超级想打死产品经理...
注:如有需要,可自行转载,但是要加上原创作者及原文章链接哦...