springDataJPA的基本使用

简介: springDataJPA的基本使用

最近一个项目在使用jpa,因为之前都在用mybatis,所以记录一下jpa的基本使用,这里只讲一些基本的用法,不说实现原理。

jpa是一套ORM规范,hibernate是它的实现,所以JPA的基本用法和hibernate差不多。


因为是对象-关系的映射。就是库中的表和java类之间的映射,可以通过操作java类来操作数据库。


对于表的操作,JPA可以不用去写实现类,而是需要一个接口,去继承JpaRepository,还可以继承JpaSpecificationExecutor。


对于一个单表的增删改查,可以直接使用JpaRepository中的方法来实现。

比如 findAll() delete() findById() save()等方法可以直接调用。

注意,新增(insert)和修改(update)都是使用save方法,区别是如果类中没有ID,做新增操作,如果类中有了ID,则做修改操作。


除了一些因为继承接口而获得的针对单表的默认方法,更多的情况还是需要多表查询或者动态拼接sql的情况在。 对于使用mybatis习惯的人,还是比较习惯写sql语句。


在DAO接口中使用@Query接口,写JPQL语句来实现功能。注:jpql不支持insert。

例如,带参数的可以这么写:

@Query(“SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2”)

List testQueryAnnotationParams1(String lastName, String email);


如果在@Query注解中添加 nativeQuery=true ,则可以使用原生sql。

@Query(value = “SELECT count(id) FROM car”, nativeQuery = true);

如果是UPDATE 和DELETE 操作 ,记得还要添加@Modifying 注解,通知jpa,这是一个update或者delete操作。而且记得在调用的地方要添加事务,不然会报错。


如果想根据条件动态凭借sql语句的话。

要先注入一个EntityManager 对象,EntityManager是JPA中用于增删改查的接口,它的作用是用于连接内存中的java对象和数据库的数据存储。

还需要@PersistenceContext注解,注意@PersistenceContext和@Resource的区别,随手一查就有,这里不在赘述。 代码如下:


@PersistenceContext

private EntityManager entityManager;


然后要执行的sql语句是一个字符串,一般可使用StringBuilder的append方法来拼接sql语句

例子如下:

StringBuilder DataSql = new StringBuilder(“SQL语句”)

StringBuilder WhereSql = new StringBuilder(" WHERE 1 = 1 ");

if (判断条件 ){

WhereSql .append("AND 其他sql条件 ");

}

//拼接剩余的sql语句

DataSql .append(WhereSql ).append(“GROUP BY XXX ORDER BY XXX”);

Query query = entityManager.createNativeQuery(DataSql.toString());

List list = query .getResultList();


以查询为例,注意,query对象执行查询后返回的是List 的类型,其中的object又是一个object数组,如果想把查询结果存在自定义类的时候,要先转成object数组再操作。例子如下:


List list = query .getResultList();

for (Object obj : list ) {

Object[] o = (Object[]) obj;

Car c = new Car(o[0].toString(),o[1].toString(),o[2].toString());

最近一个项目在使用jpa,因为之前都在用mybatis,所以记录一下jpa的基本使用,这里只讲一些基本的用法,不说实现原理。

jpa是一套ORM规范,hibernate是它的实现,所以JPA的基本用法和hibernate差不多。


因为是对象-关系的映射。就是库中的表和java类之间的映射,可以通过操作java类来操作数据库。


对于表的操作,JPA可以不用去写实现类,而是需要一个接口,去继承JpaRepository,还可以继承JpaSpecificationExecutor。


对于一个单表的增删改查,可以直接使用JpaRepository中的方法来实现。

比如 findAll() delete() findById() save()等方法可以直接调用。

注意,新增(insert)和修改(update)都是使用save方法,区别是如果类中没有ID,做新增操作,如果类中有了ID,则做修改操作。


除了一些因为继承接口而获得的针对单表的默认方法,更多的情况还是需要多表查询或者动态拼接sql的情况在。 对于使用mybatis习惯的人,还是比较习惯写sql语句。


在DAO接口中使用@Query接口,写JPQL语句来实现功能。注:jpql不支持insert。

例如,带参数的可以这么写:

@Query(“SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2”)

List testQueryAnnotationParams1(String lastName, String email);


如果在@Query注解中添加 nativeQuery=true ,则可以使用原生sql。

@Query(value = “SELECT count(id) FROM car”, nativeQuery = true);

如果是UPDATE 和DELETE 操作 ,记得还要添加@Modifying 注解,通知jpa,这是一个update或者delete操作。而且记得在调用的地方要添加事务,不然会报错。


如果想根据条件动态凭借sql语句的话。

要先注入一个EntityManager 对象,EntityManager是JPA中用于增删改查的接口,它的作用是用于连接内存中的java对象和数据库的数据存储。

还需要@PersistenceContext注解,注意@PersistenceContext和@Resource的区别,随手一查就有,这里不在赘述。 代码如下:


@PersistenceContext

private EntityManager entityManager;


然后要执行的sql语句是一个字符串,一般可使用StringBuilder的append方法来拼接sql语句

例子如下:

StringBuilder DataSql = new StringBuilder(“SQL语句”)

StringBuilder WhereSql = new StringBuilder(" WHERE 1 = 1 ");

if (判断条件 ){

WhereSql .append("AND 其他sql条件 ");

}

//拼接剩余的sql语句

DataSql .append(WhereSql ).append(“GROUP BY XXX ORDER BY XXX”);

Query query = entityManager.createNativeQuery(DataSql.toString());

List list = query .getResultList();


以查询为例,注意,query对象执行查询后返回的是List 的类型,其中的object又是一个object数组,如果想把查询结果存在自定义类的时候,要先转成object数组再操作。例子如下:


List list = query .getResultList();

for (Object obj : list ) {

Object[] o = (Object[]) obj;

Car c = new Car(o[0].toString(),o[1].toString(),o[2].toString());

最近一个项目在使用jpa,因为之前都在用mybatis,所以记录一下jpa的基本使用,这里只讲一些基本的用法,不说实现原理。

jpa是一套ORM规范,hibernate是它的实现,所以JPA的基本用法和hibernate差不多。


因为是对象-关系的映射。就是库中的表和java类之间的映射,可以通过操作java类来操作数据库。


对于表的操作,JPA可以不用去写实现类,而是需要一个接口,去继承JpaRepository,还可以继承JpaSpecificationExecutor。


对于一个单表的增删改查,可以直接使用JpaRepository中的方法来实现。

比如 findAll() delete() findById() save()等方法可以直接调用。

注意,新增(insert)和修改(update)都是使用save方法,区别是如果类中没有ID,做新增操作,如果类中有了ID,则做修改操作。


除了一些因为继承接口而获得的针对单表的默认方法,更多的情况还是需要多表查询或者动态拼接sql的情况在。 对于使用mybatis习惯的人,还是比较习惯写sql语句。


在DAO接口中使用@Query接口,写JPQL语句来实现功能。注:jpql不支持insert。

例如,带参数的可以这么写:

@Query(“SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2”)

List testQueryAnnotationParams1(String lastName, String email);


如果在@Query注解中添加 nativeQuery=true ,则可以使用原生sql。

@Query(value = “SELECT count(id) FROM car”, nativeQuery = true);

如果是UPDATE 和DELETE 操作 ,记得还要添加@Modifying 注解,通知jpa,这是一个update或者delete操作。而且记得在调用的地方要添加事务,不然会报错。


如果想根据条件动态凭借sql语句的话。

要先注入一个EntityManager 对象,EntityManager是JPA中用于增删改查的接口,它的作用是用于连接内存中的java对象和数据库的数据存储。

还需要@PersistenceContext注解,注意@PersistenceContext和@Resource的区别,随手一查就有,这里不在赘述。 代码如下:


@PersistenceContext

private EntityManager entityManager;


然后要执行的sql语句是一个字符串,一般可使用StringBuilder的append方法来拼接sql语句

例子如下:

StringBuilder DataSql = new StringBuilder(“SQL语句”)

StringBuilder WhereSql = new StringBuilder(" WHERE 1 = 1 ");

if (判断条件 ){

WhereSql .append("AND 其他sql条件 ");

}

//拼接剩余的sql语句

DataSql .append(WhereSql ).append(“GROUP BY XXX ORDER BY XXX”);

Query query = entityManager.createNativeQuery(DataSql.toString());

List list = query .getResultList();


以查询为例,注意,query对象执行查询后返回的是List 的类型,其中的object又是一个object数组,如果想把查询结果存在自定义类的时候,要先转成object数组再操作。例子如下:


List list = query .getResultList();

for (Object obj : list ) {

Object[] o = (Object[]) obj;

Car c = new Car(o[0].toString(),o[1].toString(),o[2].toString());

}

  这种写法注意,如果查询结果中有null的话,object数组中不会有对应的下标。
  比如上面代码中,如果第二个参数查出来是null。那么object数组中直接就是o[0] 和 o[2]
  在取值o[1] 的时候会报空指针异常。所以在sql语句中要有一个去除null值的操作。

在mysql中 使用 IFNULL(字段名, “”) 可以把null值转为空字符串。

先写到这里,后面遇见新的用法会再添加。

目录
相关文章
|
4月前
|
SQL Java 数据库
SpringDataJpa(一)(下)
SpringDataJpa(一)
24 1
|
4月前
|
Java 数据库 Spring
SpringDataJpa(三)(下)
SpringDataJpa(三)(下)
23 0
|
4月前
|
SQL 安全 Java
SpringDataJpa(三)(上)
SpringDataJpa(三)(上)
22 0
|
4月前
|
Java 数据库连接 API
SpringDataJpa(一)(上)
SpringDataJpa(一)
36 0
|
JSON Java 数据库
SpringBoot整合SpringDataJPA
SpringBoot整合SpringDataJPA
152 0
|
SQL 存储 Oracle
JPA 概述及常用注解详解、SpringDataJpa 使用指南
JPA 概述及常注解详解、SpringDataJpa 使用指南
6945 2
JPA 概述及常用注解详解、SpringDataJpa 使用指南
|
Java Maven Spring
SpringBoot中整合SpringDataJPA
SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块 SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以
107 0
|
JSON Java 测试技术
一分钟上手SpringBootTest
您好,我是码农飞哥,感谢您阅读本文!本文主要讲述如何在SpringBoot框架上进行单元测试。也就是使用SpringBootTest进行单元测试。
678 0
|
Java
SpringDataJPA如何CRUD?
SpringDataJPA如何CRUD?
100 0
|
SQL Java 数据库连接
SpringDataJpa:JpaRepository增删改查
SpringDataJpa:JpaRepository增删改查
297 0
SpringDataJpa:JpaRepository增删改查