最近一个项目在使用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值转为空字符串。
先写到这里,后面遇见新的用法会再添加。