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);
    }
}
发布了377 篇原创文章 · 获赞 278 · 访问量 180万+

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/105346328