作者:园园哚 | 来源:互联网 | 2024-10-20 16:29
JPA介绍JPA的全称是JavaPersistenceAPI,提供了一个规范,用于将数据通过Java对象持久化、读取和管理数据库中的关系表。所以JPA本质上就是一种ORM规
JPA介绍
JPA的全称是Java Persistence API,提供了一个规范,用于将数据通过Java对象持久化、读取和管理数据库中的关系表。所以JPA本质上就是一种ORM规范,它的目标是实现ORM的天下归一。
1、java数据库编程的进化史:
1)jdbc:
jdbc是jdk提供数据库操作最基础的api,它提供了一套操作数据库的标准规范,不同的数据库厂商通过自己的驱动jar来适配该规范。
Class.forName("com.mysql.cj.jdbc.Driver");
cOnn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
// 执行查询
Statement stmt = conn.createStatement();
String sql = "SELECT id, name, url FROM websites";
ResultSet rs = stmt.executeQuery(sql);
2)hibernate、mybatis 等ORM框架:
- Hibernate 可以认为是JPA规范的的一种实现,使用起来比较方便,但是不够灵活;
- Mybatis是一个持久层的sql mapping框架。 mybatis的优势在于可以灵活的写SQL,自由度比较高
3)spring data jpa:
spring data jpa不是像Hibernate那样对jpa的实现,而是对其更进一步做了封装,使用起来非常简单、灵活。
spring data jpa的目的就是不让程序员花太多时间在数据库层面的处理,所以要做的只是声明接口(类似于mybatis),而且spring data jpa会帮常用sql都帮你拼写好(不像mybatis那样,还需要自己写sql或者mapper)。基于spring data jpa编写持久层逻辑,一般分为如下几步:
- 定义实体类,关联数据库中的表。
- 声明持久层接口,接口需要继承Repository。
- 接口中声明需要的方法,spring data jpa会自动给我们生成实现代码
Spring data jpa有以下几个常用的接口:
- Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别, 一般不在程序中直接使用。
- CrudRepository:继承Repository,实现了一组CRUD相关的方法,这个用的比较多,一般如果上层业务只需要基本的增删改查,继承这个接口就可以了。
- JpaRepository:继承PagingAndSortingRepository,实现一组JPA规范相关的方法。这个也用的比较多,它和CrudRepository区别在于支持分页和排序。
简单示例
创建springboot项目:
1)pom.xm如下:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.qiyi.test
TestSpringBoot
0.0.1-SNAPSHOT
TestSpringBoot
org.springframework.boot
spring-boot-starter-parent
2.0.4.RELEASE
UTF-8
1.8
1.8
junit
junit
test
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-data-jpa
com.alibaba
fastjson
1.2.9
2)application.properties:
spring.jpa.show-sql = true
logging.level.org.springframework.data=DEBUG
spring.jpa.hibernate.ddl-auto=
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
3)定义实体类:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="test")
public class Test{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "service_code")
private String serviceCode;
private int status = 0;//0:正常、-1异常
//set get方法
}
4)dao接口:
import org.springframework.data.jpa.repository.JpaRepository;
import com.qiyi.test.TestSpringBoot.entity.WoodyService;
public interface TestDao extends JpaRepository {
}
5)controller层:
public class TestController {
@Autowired
private TestDao testDao;
@RequestMapping("/jpsTest")
@ResponseBody
public JSONObject jpsTest(HttpServletRequest request,HttpServletResponse httpResponse) {
JSONObject res = new JSONObject();
try {
List findAll = testDao.findAll();
Optional findById = testDao.findById(33);
System.out.println(findById);
System.out.println("==============");
long count = testDao.count();
System.out.println(count);
res.put("data",findAll);
res.put("code","success");
} catch (Exception e) {
res.put("code","error");
return res;
}
return res;
}
}
注:省略了service层.
可以看到,dao层接口继承了JpaRepository后,默认会有如下findXXX方法,以及count等方法。
查询规范
直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:
参考:http://www.machengyu.net/tech/2019/06/29/spring-data-jpa-demo.html
https://blog.csdn.net/hgx_suiyuesusu/article/details/80919171