发布时间:2018-11-08
 
技术:springboot+aop
 

概述

springBoot集成了自定义的jdbc操作类及AOP,因为spring自带的JdbcTemplate在实际项目中并不是那么好用,比如在分页和将数据转为对象时,所以才写了这个工具。另外在使用AOP切点时我们一般使用的execution 这个用法颗粒度有点大,不能很自由的选择指定的方法,但基于自定义注解的切点就很好的解决了这个问题。

详细

1,项目搭建

新建maven项目这里不多说,这里主要看pom.xml文件

<?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.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>demo</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot jdbc模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql连接数据库jar-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency> <!--springboot aop模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency> <!-- springJdbcTemplate操作封装类 超级好用
引入前执行如下命令,在项目redare-devframework-common-2.0.jar 的当前路径下
mvn install:install-file -Dfile=redare-devframework-common-2.0.jar -DgroupId=com.redare.devframework.common -DartifactId=lijin -Dversion=2.0 -Dpackaging=jar
start-->
<dependency>
<groupId>com.redare.devframework.common</groupId>
<artifactId>lijin</artifactId>
<version>2.0</version>
</dependency>
<!-- springJdbcTemplate操作封装类 超级好用 end--> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

项目结构如下图:

2 功能讲解:

1,配置数据库连接参数:在resources/application.properties中

//数据库连接地址,端口号,连接名,设置编码格式
jdbc.url=jdbc:mysql://localhost:3306/boot
//用户名
jdbc.username=root
//密码
jdbc.password=123456
//数据库驱动
jdbc.driverClassName=com.mysql.jdbc.Driver

2,读取配置文件,由于springboot会自动加载resources/application.properties文件,所以直接使用@value注解即可获取,记得写get set 方法。

@Component
public class MyConfig { @Value("${jdbc.url}")
private String url; @Value("${jdbc.username}")
private String username; @Value("${jdbc.password}")
private String password; @Value("${jdbc.driverClassName}")
private String driverClassName;

3,配置数据库操作工具类

//这个类起着配置文件的作用 需要用@Configuration 注解
@Configuration
public class MySpringJdbc { @Autowired
MyConfig myConfig; //配置数据库数据源
@Bean
public DataSource masterDataSource() {
DataSource dataSource = new DriverManagerDataSource(myConfig.getUrl(),myConfig.getUsername(),myConfig.getPassword());
return dataSource;
}
@Bean
public SpringJdbcHelper jdbcHelper(){
//根据数据库类型选择myslq还是Orcle
SpringJdbcHelper jdbcHelper=new MySqlJdbcHelper();// new OracleJdbcHelper()
jdbcHelper.setDataSource(masterDataSource());
return jdbcHelper;
} }

4,自定义注解,这样可以加上我们需要的方法上,将该方法作为切点

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyLogService {
String description() default "";
}

5,aop切面处理类

package com.example.demo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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;
import java.util.Date; /**
* Created by Administrator on 2018/11/7.
*/
@Aspect
@Component
public class MyAspect { //这里定义了一个切点,凡是加了这个注解的方法都会被进行增加(进行额外的处理)
//这个注解我加在控制层的方法上,所以对方法前后进行拦截,获取的都是请求参数
@Pointcut("@annotation(com.example.demo.aop.MyLogService)")
public void lockAspect() {
} /**
* 请求开始前处理方法
* @param result Object
* @author zhoukai
*/
@Before(value = "lockAspect()")
public void doBefore(JoinPoint joinPoint) {
//通过RequestContextHolder 获取当前请求的request
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
System.out.println("\n");
System.out.println("URL: " + request.getRequestURL().toString());//获取当前请求url
System.out.println("request method: " + request.getMethod());//获取请求的方法
System.out.println("remote address: " + request.getRemoteAddr());//获取请求地址
System.out.println("remote port: " + request.getRemotePort());//获取请求的端口
Signature signature = joinPoint.getSignature();
System.out.println("CLASS_METHOD: " + signature.getDeclaringTypeName() + "." + signature.getName());
String params = Arrays.toString(joinPoint.getArgs());//获取方法参数
} /**
* 请求拦截后处理方法
* @param result Object
* returning 表示被拦截方法的返回值
* 这里的returning 表示返回值,如果方法结束后 我们想获得返回值进行额外操作
*/
@AfterReturning(value = "lockAspect()",returning = "result")
public void doAfterReturning(Object result) {
System.out.println("end============");
} }

6,将注解应用到方法上

@RestController
public class TestController { @MyLogService
@GetMapping("/test")
public String test(){
return "hello world";
} }

7,jdbc辅助类操作示例,由于笔者也不是很喜欢mybatis,还是喜欢直接操作sql。所以用这个还是很方便的。主要包括不带参数插入,带占位符参数插入(含批量操作),查询单条数据,查询多条数据,查询多条数据带占位符参数,分页查询。

package com.example.demo;

import com.example.demo.domain.Post;
import com.redare.devframework.common.pojo.Page;
import com.redare.devframework.common.spring.db.SpringJdbcHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.ArrayList;
import java.util.List; /*
实现DemoApplication 接口,以便在启动后执行我们的方法
*/
@SpringBootApplication
public class DemoApplication implements CommandLineRunner { /*
自动注入jdbcHelper
*/
@Autowired
SpringJdbcHelper jdbcHelper; public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} //方法演示 分别展示增删改和查 毕竟业务都是围绕这几个方面展开的
@Override
public void run(String... strings) throws Exception { //不带参数insert
insertDemoNoParam(jdbcHelper);
//带参数insert
insertDemoWithParam(jdbcHelper);
//查询单条数据
queryOneObject(jdbcHelper);
//查询多条数据
queryListObject(jdbcHelper);
//查询多条数据带占位符参数
queryListObjectWithParam(jdbcHelper);
//分页查询
queryPageObject(jdbcHelper); } private void queryListObjectWithParam(SpringJdbcHelper jdbcHelper) {
int id=3;
String sql="select id,uid,user_id as userId,created_at as createAt from posts where id < ?";
List<Post> post= jdbcHelper.queryForListBean(sql, Post.class,new Object[]{id});
System.out.println(post.size()); } //和queryForListBean 非常相似,只是多了两个分页参数
private void queryPageObject(SpringJdbcHelper jdbcHelper) {
int curpage=1;
int pageSize=5;
String sql="select id,uid,user_id as userId,created_at as createAt from posts where id <3";
Page<Post> post= jdbcHelper.queryForPageBean(sql,Post.class,curpage,pageSize);
System.out.println(post.getResult().size());
} private void queryListObject(SpringJdbcHelper jdbcHelper) {
String sql="select id,uid,user_id as userId,created_at as createAt from posts where id <3";
List<Post> post= jdbcHelper.queryForListBean(sql, Post.class);
System.out.println(post.size()); } //注意这个的查询结果必须是一条 否则报错 多条结果请用queryForListBean
private void queryOneObject(SpringJdbcHelper jdbcHelper) {
String sql="select id,uid,user_id as userId,created_at as createAt from posts where id =1";
Post post= jdbcHelper.queryForBean(sql,Post.class);
System.out.println(post);
} public void insertDemoNoParam(SpringJdbcHelper jdbcHelper){
/*
不带参数 以下两种方式都可以
*/
String sql="insert into employ(cus_firstname,cus_surname)values('tom','jack')";
String sql2="insert into employ(cus_firstname,cus_surname)values('tom','jack')";
jdbcHelper.insert(sql);
jdbcHelper.update(sql2);
} public void insertDemoWithParam(SpringJdbcHelper jdbcHelper){
/*
带参数 通过占位符传递 执行单条sql
*/
String [] arr={"jack","tome"};
String sql="insert into employ(cus_firstname,cus_surname)values(?,?)";
//jdbcHelper.insert(sql, arr);
/*
带参数 通过占位符传递 批量执行
*/
//构造参数list
List<Object[]> list =new ArrayList<>();
list.add(new String[]{"aa","bb"});
list.add(new String[]{"aa","bb"});
jdbcHelper.batchUpdate(sql,list); } }

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

springboot自定义jdbc操作库+基于注解切点AOP的更多相关文章

  1. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  2. Spring_Spring与AOP_AspectJ基于注解的AOP实现

    一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...

  3. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  4. Spring基础知识之基于注解的AOP

    背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法 ...

  5. AspectJ框架基于注解的AOP实现

    AspectJ的AOP实现:有两种方式,一种是基于XML配置文件,一种是基于注解的,由于注解更为常用,这里 这里只针对注解来学习. ---------------------------------- ...

  6. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

    复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...

  7. 阶段3 2.Spring_10.Spring中事务控制_3 作业-基于注解的AOP实现事务控制及问题分析_下

    此时没有异常 测试我们的方法 执行报错 注解在实际的测试过程中,实际的执行顺序是有问题的.会先调用最终通知.然后再调用后置通知 最终通知已经关闭了连接.再调用后置通知肯定报错. getThreadCo ...

  8. Spring AspectJ基于注解的AOP实现

    对于AOP这种编程思想,很多框架都进行了实现.Spring就是其中之一,可以完成面向切面编程.然而,AspectJ也实现了AOP的功能,且实现方式更为简捷,使用更加方便,而且还支持注解式开发.所以,S ...

  9. Spring 基于注解的AOP实现

    在本文开始之前,我要引入一张图,这张图的来源 https://blog.csdn.net/chenyao1994/article/details/79708496 ,版权归原作者所有,我借鉴了原作者的 ...

随机推荐

  1. 从客户端(ctl00$ContentPlaceHolder1$result="<?xml version="1.0" ...")中检测到有潜在危险的 Request.Form 值。

    ylbtech-Error-WebForm:从客户端(ctl00$ContentPlaceHolder1$result="<?xml version="1.0" . ...

  2. [填坑]解决"Your MaintenanceTool appears to be older than 3.0.2. ."问题

    之前我写过QT5.9版本在更新组件时出现“要继续此操作,至少需要一个有效且已启用的储存库”问题,得到了网友的热心转载,说明遇到此问题的人不在少数. 原文地址:https://blog.csdn.net ...

  3. google的transformer模型的解释

    参考这篇文章: https://blog.csdn.net/mijiaoxiaosan/article/details/73251443 看了下: 最核心的如下:其最重要的创新应该就是Self-Att ...

  4. go语言之进阶篇创建goroutine协程

    1.goroutine是什么 goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现 ...

  5. IIS7.5配置Gzip压缩解决方案(转)

    开启配置HTTP压缩(GZip) 在IIS7中配置Gzip压缩相比IIS6来说实在容易了许多,而且默认情况下就是启用GZip压缩的.如果没有,则可以再功能视图下找到“压缩”项,进入之后就会看到“静态内 ...

  6. Ajax 中正常使用jquery-easyui (转)

    一.ASP.NET Ajax 页面中应用了 jquery-easyui,当页面进行回发操作后只是局部刷新,原本的EASYUI 样式无法生效.解决这个问题的思路是让页面在回发后重新调用EASYUI进行重 ...

  7. 记录Activity启动时间 ActivityLifecycleCallbacks

    ActivityStackManager 定义一个集合(Stack)保存所有还未销毁的 Activity public class ActivityStackManager { private Sta ...

  8. 【GRPC】GRPC-负载均衡

    GRPC-负载均衡 grpc nginx_百度搜索 grpc(1):Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持 - freewebsys的专栏 - CS ...

  9. TinyCore Nginx server with php-cgi and vsftpd

    http://blog.matchgenius.com/tinycore-nginx-server-with-php-cgi-and-vsftpd/ Create fast testing serve ...

  10. Android Volley 库的使用

    本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库的使用 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 Ht ...