四联问:
- 什么是JPA
- 解决什么问题
- 怎么用?使用场景是哪些
- 有哪些优缺点
什么是JPA
JPA(Java persistence API )java持久性应用程序接口;可以通过xml或者注解描述对象-关系表之间的隐射关系;可以将对象持久化到数据库中;
解决什么问题
日常编程过程中,我们需要操作数据库,通常controller、service、serviceImpl、dao、mapper写一通才可以去操作数据库;有了jpa就可以省略mapper层,不需要自己去写sql,只要写dao层就可以实现对数据库的访问和操作,除了日常的CRUD之外的功能,还提供了分页,排序、复杂查询等等;
怎么用?使用场景
JPA其实是一种标准和规范,在这个标准规范之上,需要有一种技术或者说框架来实现JPA,那么常见的Spring data jpa 应运而生,spring data jpa就是一种基于jpa标准规范的开发框架,只需要写dao层接口就可以在不写接口实现的情况下对数据库进行访问和操作。
- 引入jpa的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- 增加yml配置
jpa:
#数据库类型
database: mysql
#是否显示sql
show-sql: true
hibernate:
#ddl-auto的参数有none、update、create、create-drop、validate;none默认值:表示什么都不做,不会对数据库进行任何操作;update:表示每次启动时都会根据entity中定义的属性去更新数据库中的表,有则更新,没有则创建表;create:表示每次启动时都会去创建表,如果表内有数据,则会被清除,create-drop:标志每次都会先清空;validate:表示每次启动都会去校验,不一致则会报错;
ddl-auto: update
properties:
hibernate:
#数据库方言:主要解决MyISAM不支持外键,如果有外键的话就会创建失败的问题
dialect: org.hibernate.dialect.MySQL5Dialect
- 创建entity
注意:@id是必须的
package com.ht.erp.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* jpa test entity
* @author yugan
*/
@Entity
@Getter
@Setter
public class Test {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
Integer id;
String mark;
}
然后启动项目;在控制台上面会看到如下日志:说明jpa已经通过我们定义的test帮我们创建好了表,
2021-07-01 10:11:29 |INFO |restartedMain |Dialect.java:175 |org.hibernate.dialect.Dialect |HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM
Hibernate: insert into hibernate_sequence values ( 1 )
Hibernate: create table test (id integer not null, mark varchar(255), primary key (id)) engine=MyISAM
- 下面以已创建好的t_message表为例:CRUD
@Service
public interface IMessageService {
/**
* findById
* @param id
* @return
*/
void findById(int id);
}
@Service
public class MessageServiceImpl implements IMessageService {
@Autowired
MessageMapper messageMapper;
/**
* findById
*
* @param id
* @return
*/
@Override
public void findById(int id) {
Message message = messageMapper.findById(Integer.valueOf(1)).get();
System.out.println(JSONObject.toJSONString(message));
}
}
MessageMapper 要继承JpaRepository才可以
@Repository
public interface MessageMapper extends JpaRepository<Message,Integer> {
}
test 类
public class MessageTest extends ErpApplicationTests {
@Resource
IMessageService iMessageService;
@Test
public void findById(){
iMessageService.findById(1);
}
}
使用JPA有什么优缺点
优点:
- 方便,省去了繁琐的JDBC去操作数据库。直接通过ORM技术去操作数据库,使我们更关注业务逻辑的实现,而不必去写复杂的SQL语句;
- 简单集成;只需要通过简单的注解@Table、@entity、@Id等注解即可将java对象与数据库之间的关系映射好;使用JPA不需要去关注使用的是什么数据库;
- JAP可持久化djava对象;
- JPA规范标准。
- JAP性能比直接JDBC操作数据库的性能再访问大数据量时更高;