总结 通过使用@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修饰
发现无修改语句,数据库无修改