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

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

目录
相关文章
|
5月前
|
SQL Java 数据库
SpringDataJpa(一)(下)
SpringDataJpa(一)
27 1
|
5月前
|
Java 数据库 Spring
SpringDataJpa(三)(下)
SpringDataJpa(三)(下)
26 0
|
5月前
|
SQL 安全 Java
SpringDataJpa(三)(上)
SpringDataJpa(三)(上)
30 0
|
5月前
|
Java 数据库连接 API
SpringDataJpa(一)(上)
SpringDataJpa(一)
41 0
|
JSON Java 数据库
SpringBoot整合SpringDataJPA
SpringBoot整合SpringDataJPA
167 0
Springboot中@RequestParam和@PathVariable的用法与区别
Springboot中@RequestParam和@PathVariable的用法与区别
|
存储 Java Android开发
ExpandableListView的基本使用
Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。
135 0
|
存储 Java 数据安全/隐私保护
java包(package)
1.包的概念 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。 包的作用 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。 Java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等✨
97 0
java包(package)
|
Java Maven Spring
SpringBoot中整合SpringDataJPA
SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块 SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以
117 0
|
Java
Java面向对象(7)--package和import关键字
Java面向对象(7)--package和import关键字
122 0