JPQL是面向对象进行查询的语言,还可以通过自定义的JPQL完成UPDATE和DELETE操作。
JPQL操作注意事项:
(1)JPQL不支持使用 INSERT 操作。
(2)UPDATE 或 DELETE 操作,必须使用@Query与@Modifying注解进行修饰。
(3)UPDATE 或 DELETE 操作需要使用事务,需要在定义的业务逻辑层(Service层),在方法上使用@Transactional注解管理事务。
【示例】通过自定义的JPQL完成UPDATE和DELETE操作。
(1)数据库访问层(Dao层)
在数据库访问层(Dao层)中,创建UserDao.java(用户信息数据库访问接口),并继承JpaRepository接口。自定义UPDATE 和 DELETE 操作方法。
package com.pjb.jpauserdemo.dao;
import com.pjb.jpauserdemo.entity.User;
import com.pjb.jpauserdemo.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
/**
* 用户信息数据库访问接口
* @author pan_junbiao
**/
@Repository
public interface UserDao extends JpaRepository<UserInfo,Integer>
{
/**
* 修改用户
*/
@Modifying
@Query("UPDATE UserInfo u SET u.userName = :name WHERE u.userId = :id")
public int updateUser(@Param("id")int userId, @Param("name")String userName);
/**
* 删除用户
*/
@Modifying
@Query("DELETE FROM UserInfo u WHERE u.userId = :id")
public int deleteUser(@Param("id")int userId);
}
注意:在数据库访问层(Dao层)中,需要使用@Query与@Modifying这两个注解一起声明,定义个性化更新和删除操作。
(2)业务逻辑层(Service层)
在业务逻辑层(Service层)中,创建UserService.java(用户业务逻辑接口)。
package com.pjb.jpauserdemo.service;
/**
* 用户业务逻辑接口
* @author pan_junbiao
**/
public interface UserService
{
/**
* 修改用户
*/
public int updateUser(int userId, String userName);
/**
* 删除用户
*/
public int deleteUser(int userId);
}
业务逻辑层(Service层)下,创建 impl 目录,在该目录下创建UserServiceImpl.java(用户业务逻辑类)。
package com.pjb.jpauserdemo.service.impl;
import com.pjb.jpauserdemo.dao.UserDao;
import com.pjb.jpauserdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 用户业务逻辑类
* @author pan_junbiao
**/
@Service
public class UserServiceImpl implements UserService
{
@Autowired
private UserDao userDao;
/**
* 修改用户
*/
@Transactional
public int updateUser(int userId, String userName)
{
return userDao.updateUser(userId,userName);
}
/**
* 删除用户
*/
@Transactional
public int deleteUser(int userId)
{
return userDao.deleteUser(userId);
}
}
注意:在业务逻辑层(Service层)中实现方法,必须使用@Transactional注解管理事务。
(3)测试层(Test层)
在测试层(Test层)中,创建UserServiceTest.java (用户信息测试类)。
package com.pjb.jpauserdemo.service.impl;
import com.pjb.jpauserdemo.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 用户信息测试类
* @author pan_junbiao
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTest
{
@Autowired
private UserService userService;
/**
* 测试:修改用户
*/
@Test
public void updateUser()
{
userService.updateUser(1,"pan_junbiao的博客");
}
/**
* 测试:删除用户
*/
@Test
public void deleteUser()
{
userService.deleteUser(1);
}
}