Java之SpringBoot数据库API Part2

title: Java之SpringBoot数据库API Part2

tags:

- Java

- SpringBoot

- Mysql

- Restful API

categories: 计算机编程

abbrlink: 1059130365

date: 2023-3-11

top_img: 'https://asucanyh-cn.github.io/img/post/springboot.png'

cover: 'https://asucanyh-cn.github.io/img/post/springboot.png'

description: 自用的学习笔记。

接上一节,SpringBoot数据库API

数据库事务

TestTransController.java
  • 事务,要么完全执行,要么完全不执行。

  • 添加@Transactional注解,表明操作为事务。

当不加注解运行时,第一条记录会被添加至表中,但第二条记录会报错。

package com.mysqlapi.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.mysqlapi.entity.User;
import com.mysqlapi.repository.UserRepository;

import jakarta.transaction.Transactional;
@RestController
@Transactional
public class TestTransController {
	//实例化接口
    @Autowired
	private UserRepository repository;
	//注意:数据库要改为InnoDB引擎
    @GetMapping("/create2Users")

	public void create2Users(){
	    User user1 = new User();
	    user1.setUserName("test1");
	    user1.setRole("3");
	    repository.save(user1);

	    User user2 = new User();
	    user1.setUserName("test2");
	    user2.setRole("10"); //此操作会报错
	    repository.save(user2);
	}
}

单元测试

对软件最小可测试单元(Java,即类)进行测试。

添加依赖工具

		<dependency>
			<groupId>junit</groupId>
			<artifactId>
				junit
				</artifactId>
			<scope>test</scope>
		</dependency>

进入单元测试

eclipse进入单元测试

在我们写好一个类时,我们可以使用单元测试对里面的方法进行测试。

可以借助junit中的Assert类,提供的方法。

执行单元测试类

在class <classname> {}前添加注解

  • @RunWith(SpringRunner.class)

  • @SpringBootTest

权限管理

不同的用户拥有不同的角色,不同角色的权限不同,可以执行的操作也不一样。如何在SpringBoot中实现对权限的控制呢?

实现简单的权限管理,我们可以使用cookie、session、线程存储、数据库等。

示例:线程本地存储

CurrentUserHolder.java

这个类创建了两个方法:

  1. get(),用户获取线程存储中的数据

  1. set(),设置线程存储中的数据

package com.mysqlapi.holder;

public class CurrentUserHolder {
	public static final ThreadLocal<String> holder = new ThreadLocal<>();
	public static String get() {
		return holder.get()==null?"null":holder.get();
	}
	public static void set(String username) {
		holder.set(username);
	}
}

!!! note ThreadLocal相关问题

ThreadLocal一个线程只能存放一个变量吗?想存多个怎么搞?

CheckUserService.java

service层

  • 进行身份的检查,若不匹配则抛出异常

package com.mysqlapi.service;

import org.springframework.stereotype.Service;

import com.mysqlapi.holder.CurrentUserHolder;

@Service
public class CheckUserService {
	public void check() throws Exception {
		String user=CurrentUserHolder.get();
		if(!user.equals("admin")) {
			throw new Exception("[异常]你不是管理员");
		}
	}
}
UserService.java

service层

  • 实例化CheckUserService

  • 在每个UserService的方法中(以findAll()为例),加入CheckUserService检查(调用check()方法),设置抛出异常(throws Exception)。

package com.mysqlapi.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
	@Autowired
	private CheckUserService checkUserService;
	public void findAll() throws Exception {
		checkUserService.check();
		System.out.println("查找成功!");
	}
	public void addUser() {
		System.out.println("插入成功!");
	}
}

!!! info ""

使用这种方法进行权限管理,我们会发现在UserService.java中,每有一个方法需要权限都要添加check()和throws Exception这样使得我们的代码显得冗余、低效。如何解决呢?这就需要我们学习AOP面向切面编程。在下一节将进行学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值