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值转为空字符串。

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

目录
相关文章
|
7月前
|
Java
JavaBean基本使用
JavaBean的简单使用
56 2
JavaBean基本使用
|
2月前
|
Java 关系型数据库 MySQL
结合springboot+mybatis-plus+lombok,自定义Page封装类
结合springboot+mybatis-plus+lombok,自定义Page封装类
107 0
|
10月前
|
JSON Java 数据库
SpringBoot整合SpringDataJPA
SpringBoot整合SpringDataJPA
85 0
|
SQL 存储 Oracle
JPA 概述及常用注解详解、SpringDataJpa 使用指南
JPA 概述及常注解详解、SpringDataJpa 使用指南
4620 2
JPA 概述及常用注解详解、SpringDataJpa 使用指南
|
Java Maven Spring
SpringBoot中整合SpringDataJPA
SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块 SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以
84 0
|
Java
SpringDataJPA如何CRUD?
SpringDataJPA如何CRUD?
75 0
|
JSON Java Maven
SpringBoot+SparkSQL操作JSON字符串
在SpringBoot中通过maven来做包管理构建,有几个地方需要注意一下的,需要解决包之间的冲突,否则运行时会报错: (1)sparkSQL中需要先排除两个包:
SpringBoot+SparkSQL操作JSON字符串
|
SQL Java 数据库连接
SpringDataJpa:JpaRepository增删改查
SpringDataJpa:JpaRepository增删改查
257 0
SpringDataJpa:JpaRepository增删改查
|
Java Spring
【SpringDataJPA】——SpringDataJPA入门实例
  Spring经常喜欢做的事情就是封装,经过spring的封装结出的一大果实——SpringDataJPA可以很大程度上提高我们持久层的开发效率。
|
Java 数据库连接 测试技术
SpringDataJPA之快速入门
Spring Data JPA:Spring Data JPA 是 spring data 项目下的一个模块。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。 Spring Data JPA 的技术特点:我们只需要定义接口并集成 Spring Data JPA 中所提供的接口就可以了。不需要编写接口实现类。
SpringDataJPA之快速入门