IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Springboot项目:连接mysql数据库,使用aop进行日志捕获 -> 正文阅读

[Java知识库]Springboot项目:连接mysql数据库,使用aop进行日志捕获

本次项目主要由三个部分组成
一、搭建基础的springboot的项目
二、与mysql连接,进行最基础的增删改查的操作
三、使用aop切面,进行参数的捕获和日志的打印

一、搭建最基础的springboot项目

搭建一个由maven项目创建的springboot项目:springboot-demo-bwd
创建基础的spring项目
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
maven的配置如下所示,此处三项式配置maven的路径,setting文件的位置和maven包的存放位置。
在这里插入图片描述
pom文件的配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bwd</groupId>
    <artifactId>springboot-demo-bwd</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--指定父级依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
    </parent>

    <!---->
    <dependencies>

        <!--开发springboot的web应用,需要引入starter-web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--加入链接mysql数据库需要的依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--引入jdbc的依赖包-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

        <!--在前端把用map接收的参数转换成vo-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.8</version>
        </dependency>

        <!--引入log4j的依赖包-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>

        <!--引入aop的依赖包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>


    </dependencies>


</project>

配置启动该springboot项目的端口:
创建application.yml文件,把启动端口置成8088:
在这里插入图片描述

创建一个TestController,启动该springboot项目,具体代码如下所示:
package com.bwd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestController {
    public static void main(String[] args) {
        SpringApplication.run(TestController.class,args);
    }
}

如图所示,项目启动成功
在这里插入图片描述
项目创建成功之后,可以在这个main方法直接打印语句,简单执行该程序。

二、与mysql连接,进行最基础的增删改查的操作

本次主要采用jdbctemplate的方式执行数据库的操作,主要操作为增删改查用户clerk的信息。
mysql的表信息如下所示:
此处采用了id作为主键的方式
在application.yml中增加以下的数据库连接信息:

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    #druid 数据源配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true

ClerkDao接口里的接口方法(增删改查,没有什么技术含量)

package com.bwd.dao;

import com.bwd.bean.Clerk;

import java.util.List;

public interface ClerkDao {

    public int addClerk(Clerk clerk);

    public int deleteClerkById(String id);

    public List<Clerk> queryAllClerks();

    public Clerk queryClerkById(String id);

    public int updateClerkById(Clerk clerk);
}

Dao接口的实现类ClerkDaoImpl
此处在增加一条用户信息时,id采用了uuid随机生成的形式

package com.bwd.dao.impl;

import com.bwd.bean.Clerk;
import com.bwd.dao.ClerkDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.UUID;

@Repository
public class ClerkDaoImpl implements ClerkDao {

    public static String QUERY_SQL = "select * from test_clerk where id = ?";

    public static String QUERY_ALL_SQL = "select * from test_clerk";

    public static String INSERT_SQL = "insert into test_clerk values(?,?,?,?)";

    public static String DETELE_SQL = "delete from test_clerk where id = ? ";

    public static String UPDATE_SQL = "update test_clerk set clerkNo = ?, clerkName = ?, clerkAge = ?  where id = ?";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int addClerk(Clerk clerk) {
        UUID uuid = UUID.randomUUID();
        clerk.setId(uuid.toString().substring(2, 10));
        return jdbcTemplate.update(INSERT_SQL,new Object[]{clerk.getId(),clerk.getClerkNo(),clerk.getClerkName(),clerk.getClerkAge()});
    }

    @Override
    public int deleteClerkById(String id) {
        return jdbcTemplate.update(DETELE_SQL,new Object[]{id});
    }

    @Override
    public List<Clerk> queryAllClerks() {
        return jdbcTemplate.query(QUERY_ALL_SQL,new BeanPropertyRowMapper<Clerk>(Clerk.class));
    }

    @Override
    public Clerk queryClerkById(String id) {
        List<Clerk> res =  jdbcTemplate.query(QUERY_SQL,new BeanPropertyRowMapper<Clerk>(Clerk.class),new Object[]{id});
        return res.size()>0?res.get(0):new Clerk();

    }

    @Override
    public int updateClerkById(Clerk clerk) {
        return jdbcTemplate.update(UPDATE_SQL,new Object[]{clerk.getClerkNo(),clerk.getClerkName(),clerk.getClerkAge(),clerk.getId()});    }
}

ClerkService的接口方法:

package com.bwd.service;

import com.bwd.bean.Clerk;

import java.util.List;

public interface ClerkService {

    public int addClerk(Clerk clerk);

    public int deleteClerkById(String id);

    public List<Clerk> queryAllClerks();

    public Clerk queryClerkById(String id);

    public int updateClerkById(Clerk clerk);

}

ClerkService的的接口实现类ClerkService,此处给该接口类加上了事务注解,因为该类涉及到的所有方法都想做事务控制;

package com.bwd.service.impl;

import com.bwd.bean.Clerk;
import com.bwd.dao.ClerkDao;
import com.bwd.service.ClerkService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
@Transactional
@Service("clerkService")
public class ClerkServiceImpl implements ClerkService{

    @Autowired
    private ClerkDao clerkDao;

    @Override
    public int addClerk(Clerk clerk) {
        return clerkDao.addClerk(clerk);
    }

    @Override
    public int deleteClerkById(String id) {
        return clerkDao.deleteClerkById(id);
    }

    @Override
    public List<Clerk> queryAllClerks() {
        return clerkDao.queryAllClerks();
    }

    @Override
    public Clerk queryClerkById(String id) {
        return clerkDao.queryClerkById(id);
    }

    @Override
    public int updateClerkById(Clerk clerk) {
        return clerkDao.updateClerkById(clerk);
    }
}

ClerkController中的方法。此处的参数除了get方法外,post方法采用的接收参数统一为map。因为后续想在controller类中加上一个aop切面,用于打印所有从前端发过来的请求参数,map类型的参数是可以直接打印出来的(vo类型的如果要打印估计要重写toString方法)

package com.bwd.controller;

import com.alibaba.fastjson.JSON;

import com.bwd.bean.Clerk;
import com.bwd.service.ClerkService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping(value = "/clerk")
public class ClerkController {

    @Autowired
    private ClerkService clerkService;

    @PostMapping("/queryAllClerks")
    @ResponseBody
    public List<Clerk> queryAllClerks(){
        return clerkService.queryAllClerks();
    }

    @GetMapping("/queryClerkById")
    @ResponseBody
    public Clerk queryClerkById(@RequestParam String id){
        return clerkService.queryClerkById(id);
    }

    @PostMapping("/addClerk")
    @ResponseBody
    public String addClerk(@RequestBody Map<String,Object> params) {
        Clerk clerk = JSON.parseObject(JSON.toJSONString(params),Clerk.class);
        int res = 0;
        try{
            res = clerkService.addClerk(clerk);
        }catch(Exception e){

        }finally {
            return "此次共插入了" + res + "条数据";
        }
    }

    @PostMapping("/updateClerkById")
    @ResponseBody
    public String updateClerkById(@RequestBody Map<String,Object> params){
        Clerk clerk = JSON.parseObject(JSON.toJSONString(params),Clerk.class);

        int res = 0;
        try{
            res = clerkService.updateClerkById(clerk);
        }catch(Exception e){

        }finally {
            return "此次共修改了" + res + "条数据";
        }
    }

    @GetMapping("/deleteClerkById")
    @ResponseBody
    public String deleteClerkById(@RequestParam String id){
        int res = 0;
        try{
            res = clerkService.deleteClerkById(id);
        }catch(Exception e){

        }finally {
            return "此次共删除了" + res + "条数据";
        }
    }
}

切面方法。目的是为了在前端的请求参数过来的时候能把请求参数打印出来:

package com.bwd.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Aspect
@Component
public class LinkAspect {

    private org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass());


    @Pointcut("execution(public * com.bwd.controller.ClerkController.*(..))")
    public void linKAspect(){
        logger.info("执行aop方法");
    }


    //在执行方法之前打印获取的参数内容
    @Before("linKAspect()")
    public void before(JoinPoint joinPoint)
    {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("URL: {}",request.getRequestURL().toString());
        logger.info("HTTP请求类型: {}",request.getMethod());
        logger.info("执行方法: {}",joinPoint);
        logger.info("传递参数: {}", Arrays.toString(joinPoint.getArgs()));
    }


//    @After("linKAspect()")
//    public void after(){
//    }


}

最终执行结果:
postman发送请求
打印参数及执行方法
项目的整体目录如下所示:
在这里插入图片描述

项目名称是男朋友的名字缩写,感谢他的大力支持。为了写这篇文章周末的时间基本都在重装系统和各种环境,男朋友隔着视频即使再想玩游戏也都在等我忙完。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:50:24  更:2022-08-19 18:50:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:23:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码