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);
}
}