@Modifying 注解使用

@Modifying 结合 @Query注解进行更新操作

咱们单单的一个查询注解是没有办法完成事务的操作的

我们还要结合一点就是@Transaction 在springdata的使用

话不多说 我们开始

  开始之前我先讲下上篇文章的 漏了一个 查询总记录数的  本来想给大家写个例子   今天在这里补上

  还是在 EmployeeRepository.java 该类增加新的方法

 //获取总记录数
    //nativeQuery =true  表示支持本地sql查询
    @Query(nativeQuery = true,value = "select count(*) from employee")
    public long getCount();

编写一个测试方法

 @Test
    public void tesquerayParams(){
        List<Employee> employees = employeeRepository.querayParams("wangwu",12);
        for (Employee employee: employees) {
            System.out.println("id:" + employee.getId()
                    + " , name:" + employee.getName()
                    + " ,age:" + employee.getAge());
        }
    }

执行结果

  

进入正题  咱们讲下事务的操作

  还是一样 通过例子给大家展示

  还是在EmployeeRepository.java  ---------->update方法

  

package org.springdata.repository;

import org.springdata.domain.Employee;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.RepositoryDefinition;
import org.springframework.data.repository.query.Param;

import java.util.List;

/***
 *
 */
@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
public interface EmployeeRepository /*extends Repository<Employee,Integer>*/ {
    /**
     * 根据名字找员工
     * desc  大家可以发现  我只声明了一个方法  并没有写任何的实现类   哦了  就这样  咱们写个实现类
     * @param name
     * @return
     */
    public Employee findByName(String name);

    // name 根据模糊查询  并且 年龄<多少岁的员工
    public List<Employee> findByNameIsStartingWithAndAgeLessThan(String name, Integer gae);

    // names in ('','','') 年龄小于多少
    public List<Employee> findByNameInOrAgeLessThan(List<String> names,Integer age);

    //获取年龄最大的信息
    @Query(" select o  from  Employee o where o.age=(select max(age) from Employee t1)")
    public Employee getEmployeeByAge();

    //获取name包含 哪些 并且年龄等于多少岁
    @Query("select o from Employee o where o.name like %?1% and o.age = ?2")
    public List<Employee> querayParams(String name,Integer age);

    //获取总记录数
    //nativeQuery =true  表示支持本地sql查询
    @Query(nativeQuery = true,value = "select count(*) from employee")
    public long getCount();

    //根据id修改年龄
    @Modifying //该注解表示允许修改
    @Query("update Employee o set o.age=:age where o.id = :id")
    public void update(@Param("id")Integer id, @Param("age")Integer age);
}

写完之后是不是可以马上测试呢?  不是的

  咱们做过javaee开发的同学都知道  我们事务都是放在service 里面控制的 所以这次也是一样  咱们新建一个service包  见一个EmployeeService类

所以咱们新建一个EmployeeService.java 进行事务控制

  

编写一下代码:

package org.springdata.service;

import org.springdata.repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

/**
 * Employee 事务的控制
 */
@Service
public class EmployeeService {
    @Autowired
    private EmployeeRepository employeeRepository;

    @Transactional //事务注解
    public void update(Integer id,Integer age){
        employeeRepository.update(id,age);
    }
}

编写测试类-----------testupdate

  

package org.springdata.service;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springdata.repository.EmployeeRepository;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 */
public class SpringDataTransaction {

    private ApplicationContext ctx = null;

    private EmployeeService employeeService = null;

    @Before
    public void setup(){
        ctx = new ClassPathXmlApplicationContext("beans_news.xml");
        employeeService = ctx.getBean(EmployeeService.class);
        System.out.println("setup");
    }

    @After
    public void tearDown(){
        ctx = null;
        System.out.println("tearDown");
    }

    @Test
    public void testUpdate(){
        employeeService.update(1,52);
    }
}

测试结果

  

  

最新文章

  1. 2016年12月31日 星期六 --出埃及记 Exodus 21:26
  2. BulkSqlCopy 批量导入数据(Ef支持)
  3. Android -- EditText方法
  4. ftp客户端命令使用简记
  5. pthread_key_t和pthread_key_create()详解
  6. 在Silverlight中的DispatcherTimer的Tick中使用基于事件的异步请求
  7. apache开源项目--Apache Commons Imaging
  8. Android数据存储(1)少量数据保存之SharedPreferences接口实例
  9. Deep Learning(深度学习)学习笔记整理系列之(四)
  10. BZOJ 1801 AHOI2009 中国象棋 递归
  11. 1.2 如何使用LINQ
  12. 定时且周期性的任务研究II--ScheduledThreadPoolExecutor
  13. bootstrap 基础表单 内联表单 横向表单
  14. 杭电2000——ASCII码排序
  15. 精通CSS+DIV网页样式与布局--CSS段落效果
  16. Errors running builder &#39;Integrated External Tool Builder&#39; on project xxx
  17. win下开机不登陆系统自动运行程序的解决方案
  18. [Swift]LeetCode462. 最少移动次数使数组元素相等 II | Minimum Moves to Equal Array Elements II
  19. 一篇文让你看懂NB-IoT、LoRa、eMTC、Sigfox及ZigBee的应用场景【转】
  20. 微服务之:从零搭建ocelot网关和consul集群

热门文章

  1. 页面跳转时候拼接在url后面的多个 参数获取
  2. ASP.NET基础(一)
  3. 网页尺寸offsetHeight,offsetWidth
  4. windows下wim配置成IDE
  5. Python入门教程 超详细1小时学会Python
  6. am335x 打开内部 RTC
  7. Android——UI和View——控制方式
  8. rsync+inotify-tools
  9. http://jadethao.iteye.com/blog/1926525
  10. Linux - 静默安装oracle数据库总结