关于SpringDataJPA通过查询数据直接修改数据库

总结 通过使用@Transactional 和实体类set方法 直接修改数据库

  • @Transactional 用在Controller 和service中可以实现修改
  • 用在mapper中不能实现修改

代码测试

yml配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jpa?serverTimezone=Asia/Shanghai
    username: root
    password: wlj123456
  jpa:
    show-sql: true  
    hibernate:
      ddl-auto: update  //会通过实体类更新数据库

server:
  port: 5555

实体类

package com.wyc.up.entity;

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "account")
public class Account {
    @Id //主键
    @Column(name = "id") //数据库列
    @GeneratedValue(strategy = GenerationType.IDENTITY) //自动生成策略
            int id;
    @Column(name = "name") //数据库列
            String name;
    @Column(name = "password") //数据库列
            String password;

 
    @Column(name = "accountde_id") //数据库列
            String accountId;

    @Column(name = "accountde_de") //数据库列
            String accountDe;


}

mapper

package com.wyc.up.dao;
import com.wyc.up.entity.Account;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;


@Repository
public interface AccountMapper extends JpaRepository<Account,Integer> {

}

service

package com.wyc.up.service;

import com.wyc.up.dao.AccountMapper;
import com.wyc.up.entity.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service

public class UserService {
    @Autowired
    AccountMapper mapper;


    public Account aaa(Account point) {
        Account account = mapper.findById(point.getId()).get();
        account.setPassword("aaa");
        return null;
    }



    public void bbb( ) {
        Account account = mapper.findById(1).get();
        account.setPassword("bbb");

    }
    @Transactional
    public void ccc( ) {
        Account account = mapper.findById(1).get();
        account.setPassword("ccc");

    }
}

controller

package com.wyc.up.controller;

import com.wyc.up.dao.AccountMapper;
import com.wyc.up.entity.Account;
import com.wyc.up.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    UserService service;
    @RequestMapping("aaa")
    public String updata(){
        Account account = new Account();
        account.setId(1);
        service.aaa(account);
        return "没有 @Transactional 所以没有修改成功";
    }

    @RequestMapping("bbb")
    @Transactional
    public String bbb(){

        service.bbb();
        return "Controller 有注解@Transactional 所以修改成功";
    }

    @RequestMapping("ccc")
    public String ccc(){

        service.ccc();
        return "Service 有注解@Transactional 所以修改成功";
    }
}

调用aaa 没有被 @Transactional注解修饰的接口
-只有查询语句 没有修改语句
在这里插入图片描述
调用bbb接口 Controller 有注解@Transactional

  • 修改成功
  • 值得注意的是 如果修改的值和数据库一样 则不会调用修改
    在这里插入图片描述
    测试修改的值和数据库一致
  • 再次调用bbb接口 发现没有调用修改接口
    在这里插入图片描述
    调用ccc 接口Service 有注解@Transactional 所以修改成功
  • 同样调用了 update的语句
    在这里插入图片描述
    测试在mapper中添加 @Transactional是否生效
    添加注解@Transactional
@Repository
@Transactional
public interface AccountMapper extends JpaRepository<Account,Integer> {

}

重启项目,调用aaa接口 因为aaa接口没有被@Transactional修饰
发现无修改语句,数据库无修改
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值