Spring Data JPA使用@Query與@Modifying註解自定義修改和刪除操作

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章