每天一个小知识

开发步骤:

  1. 新建springboot项目。
        2. 导入依赖 --> devtools,lombok,web,thymeleaf,mysql,aop,mybatisplus,druid,swagger。
        3. maven多环境配置。
        4. 编写application.yml --> 项目端口,项目路径名,mybatisplus配置,mysql多数据源配置。
        5. 新建DataSourceContextHolder 用于设置,获取,清空 当前线程内的数据源变量。
        6. 新建 MultipleDataSource 实现 AbstractRoutingDataSource 类。重写determineCurrentLookupKey(),通过
          DataSourceContextHolder 获取数据源变量,用于当作lookupKey取出指定的数据源。
        7. 新建DataSourceEnum 用于存放数据源名称。
        8. 新建注解 DataSource,用于aop类中当作切入点来选择数据源。
         编写aop类 --> DataSourceAspect.java
        9. 新建并配置DruidConfiguration,MybatisplusConfiguration,SwaggerConfiguration 三个类。
        DruidConfiguration --> StatViewServlet 和 WebStatFilter Druid监控配置和监控过滤器。
        MybatisplusConfiguration --> mybatisplus 分页插件,SQL执行效率插件
                        数据源Bean,MultipleDataSource 注入
                        SqlSessionFactory注入
        SwaggerConfiguration --> 常规配置。
        10. crud Controller接口。

详细步骤

  1. 新建springboot项目
        idea新建Empty项目 然后创建springboot项目 勾选 devtools,lombok,web,thymeleaf,mysql

crud Controller接口

1. Entity      Student.java
package com.seawaterbt.ssm.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Api(“学生实体对象”)
@Data
@TableName(“t_student”)
public class Student {

@ApiModelProperty("学生id")
@TableId(type = IdType.AUTO)
private Integer id;

@ApiModelProperty("学生姓名")
private String name;

@ApiModelProperty("学生年龄")
private Integer age;

@ApiModelProperty("学生班级")
private String classname;

}Student.java 
    
 Teacher.java
package com.seawaterbt.ssm.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Api(“老师实体对象”)
@Data
@TableName(“t_teacher”)
public class Teacher {

@ApiModelProperty("老师id")
@TableId(type = IdType.AUTO)
private Integer id;

@ApiModelProperty("老师姓名")
private String name;

@ApiModelProperty("老师年龄")
private Integer age;

@ApiModelProperty("老师所教学科")
private String subject;

}Teacher.java

  1. Mapper 接口及其xml
        
    StudentMapper.java package com.seawaterbt.ssm.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.seawaterbt.ssm.entity.Student;

public interface StudentMapper extends BaseMapper {
}StudentMapper.java    
  StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>

StudentMapper.xml      TeacherMapper.java package com.seawaterbt.ssm.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.seawaterbt.ssm.entity.Teacher;

public interface TeacherMapper extends BaseMapper {
}

TeacherMapper.java 
   
TeacherMapper.xml <?xml version="1.0" encoding="UTF-8"?>

TeacherMapper.xml   

3. Service 接口及其实现类    
   StudentService.java package com.seawaterbt.ssm.service;

import com.baomidou.mybatisplus.service.IService;
import com.seawaterbt.ssm.entity.Student;

public interface StudentService extends IService {
}

StudentService.java   
   StudentServiceImpl.java package com.seawaterbt.ssm.service.impl;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.seawaterbt.ssm.entity.Student;
import com.seawaterbt.ssm.mapper.StudentMapper;
import com.seawaterbt.ssm.service.StudentService;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper,Student> implements StudentService {
}StudentServiceImpl.java      TeacherService.java package com.seawaterbt.ssm.service;

import com.baomidou.mybatisplus.service.IService;
import com.seawaterbt.ssm.entity.Teacher;

public interface TeacherService extends IService {
}TeacherService.java      TeacherServiceImpl.java package com.seawaterbt.ssm.service.impl;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.seawaterbt.ssm.annotation.DataSource;
import com.seawaterbt.ssm.entity.Teacher;
import com.seawaterbt.ssm.enums.DataSourceEnum;
import com.seawaterbt.ssm.mapper.TeacherMapper;
import com.seawaterbt.ssm.service.TeacherService;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@Service
public class TeacherServiceImpl extends ServiceImpl<TeacherMapper,Teacher> implements TeacherService {

@Override
@DataSource(DataSourceEnum.DB2)
public boolean insert(Teacher entity) {
    return super.insert(entity);
}

@Override
@DataSource(DataSourceEnum.DB2)
public boolean deleteById(Serializable id) {
    return super.deleteById(id);
}

@Override
@DataSource(DataSourceEnum.DB2)
public boolean updateById(Teacher entity) {
    return super.updateById(entity);
}

@Override
@DataSource(DataSourceEnum.DB2)
public Teacher selectById(Serializable id) {
    return super.selectById(id);
}

@Override
@DataSource(DataSourceEnum.DB2)
public List<Teacher> selectList(Wrapper<Teacher> wrapper) {
    return super.selectList(wrapper);
}

@Override
@DataSource(DataSourceEnum.DB2)
public Page<Teacher> selectPage(Page<Teacher> page) {
    return super.selectPage(page);
}

@Override
@DataSource(DataSourceEnum.DB2)
public Page<Teacher> selectPage(Page<Teacher> page, Wrapper<Teacher> wrapper) {
    return super.selectPage(page, wrapper);
}

}
TeacherServiceImpl.java

4. Vo      
   StudentVo.java
    package com.seawaterbt.ssm.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(“学生vo”)
public class StudentVo {

@ApiModelProperty("学生姓名")
private String name;

@ApiModelProperty("学生年龄")
private Integer age;

@ApiModelProperty("学生班级")
private String classname;

}StudentVo.java   
  
 TeacherVo.java
 package com.seawaterbt.ssm.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(“老师vo”)
public class TeacherVo {

@ApiModelProperty("老师姓名")
private String name;

@ApiModelProperty("老师年龄")
private Integer age;

@ApiModelProperty("老师教的学科")
private String subject;

}TeacherVo.java    5. Controller      StudentController.java package com.seawaterbt.ssm.controller;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.seawaterbt.ssm.entity.Student;
import com.seawaterbt.ssm.service.StudentService;
import com.seawaterbt.ssm.vo.StudentVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(“对学生表CRUD”)
@RestController
@RequestMapping("/student")
public class StudentController {

@Autowired
private StudentService studentService;

@ApiOperation("添加学生")
@PostMapping("/add")
public String add(@RequestBody StudentVo student){
    Student stu = new Student();
    stu.setName(student.getName());
    stu.setAge(student.getAge());
    stu.setClassname(student.getClassname());
    return studentService.insert(stu)?"添加成功":"添加失败";
}

@ApiOperation("删除学生")
@DeleteMapping("/delete/{id}")
public String delete(@ApiParam("学生的主键id")@PathVariable(value = "id") Integer id){
    return studentService.deleteById(id)?"删除成功":"删除失败";
}

@ApiOperation("修改学生")
@PostMapping("/update")
public String update(@RequestBody Student student){
    return studentService.updateById(student)?"修改成功":"修改失败";
}

@ApiOperation(value = "查询学生")
@GetMapping("/list")
public List<Student> list(){
    Wrapper<Student> wrapper = new EntityWrapper<>();
    return studentService.selectList(wrapper);
}

}StudentController.java      TeacherController.java package com.seawaterbt.ssm.controller;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.seawaterbt.ssm.entity.Teacher;
import com.seawaterbt.ssm.service.TeacherService;
import com.seawaterbt.ssm.vo.TeacherVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(“对老师表CRUD”)
@RestController
@RequestMapping("/teacher")
public class TeacherController {

@Autowired
private TeacherService teacherService;

@ApiOperation(value = "添加老师")
@PostMapping("/add")
public String add(@RequestBody TeacherVo teacher){
    Teacher tea = new Teacher();
    tea.setName(teacher.getName());
    tea.setAge(teacher.getAge());
    tea.setSubject(teacher.getSubject());
    return teacherService.insert(tea)?"添加成功":"添加失败";
}

@ApiOperation("删除老师")
@DeleteMapping("/delete/{id}")
public String delete(@ApiParam("老师的主键id")@PathVariable(value = "id") Integer id){
    return teacherService.deleteById(id)?"删除成功":"删除失败";
}

@ApiOperation("修改老师")
@PostMapping("/update")
public String update(@RequestBody Teacher teacher){
    return teacherService.updateById(teacher)?"修改成功":"修改失败";
}

@ApiOperation(value = "查询老师")
@GetMapping("/list")
public List<Teacher> list(){
    Wrapper<Teacher> wrapper = new EntityWrapper<>();
    return teacherService.selectList(wrapper);
}

}

新建并配置DruidConfiguration,MybatisplusConfiguration,SwaggerConfiguration

package com.seawaterbt.ssm.config;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DruidConfiguration {

@Bean
public ServletRegistrationBean startViewServlet(){
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
    // IP白名单
    servletRegistrationBean.addInitParameter("allow","127.0.0.1");
    // IP黑名单(共同存在时,deny优先于allow)
    servletRegistrationBean.addInitParameter("deny","127.0.0.1");
    //控制台管理用户
    servletRegistrationBean.addInitParameter("loginUsername","admin");
    servletRegistrationBean.addInitParameter("loginPassword","123456");
    //是否能够重置数据
    servletRegistrationBean.addInitParameter("resetEnable","false");
    return servletRegistrationBean;
}

@Bean
public FilterRegistrationBean statFilter(){
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
    //添加过滤规则
    filterRegistrationBean.addUrlPatterns("/*");
    //忽略过滤的格式
    filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
    return filterRegistrationBean;
}

}DruidConfiguration.java    MyBatiesPlusConfiguration.java package com.seawaterbt.ssm.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.MybatisConfiguration;
import com.baomidou.mybatisplus.entity.GlobalConfiguration;
import com.baomidou.mybatisplus.mapper.LogicSqlInjector;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import com.seawaterbt.ssm.enums.DataSourceEnum;
import com.seawaterbt.ssm.multiple.MultipleDataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@MapperScan(“com.seawaterbt.ssm.mapper*”)
public class MyBatiesPlusConfiguration {

/*
 * 分页插件,自动识别数据库类型
 * 多租户,请参考官网【插件扩展】
 */
@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    // 开启 PageHelper 的支持
    paginationInterceptor.setLocalPage(true);
    return paginationInterceptor;
}

/**
 * SQL执行效率插件
 */
@Bean
@Profile({"dev","qa"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(1000);
    performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}

@Bean(name = "db1")
@ConfigurationProperties(prefix = "spring.datasource.druid.db1" )
public DataSource db1() {
    return DruidDataSourceBuilder.create().build();
}

@Bean(name = "db2")
@ConfigurationProperties(prefix = "spring.datasource.druid.db2" )
public DataSource db2() {
    return DruidDataSourceBuilder.create().build();
}

/**
 * 动态数据源配置
 * @return
 */
@Bean
@Primary
public DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
    MultipleDataSource multipleDataSource = new MultipleDataSource();
    Map< Object, Object > targetDataSources = new HashMap<>();
    targetDataSources.put(DataSourceEnum.DB1.getValue(), db1);
    targetDataSources.put(DataSourceEnum.DB2.getValue(), db2);
    //添加数据源
    multipleDataSource.setTargetDataSources(targetDataSources);
    //设置默认数据源
    multipleDataSource.setDefaultTargetDataSource(db1);
    return multipleDataSource;
}

@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
    MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
    sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2()));
    //sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml"));

    MybatisConfiguration configuration = new MybatisConfiguration();
    //configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
    configuration.setJdbcTypeForNull(JdbcType.NULL);
    configuration.setMapUnderscoreToCamelCase(true);
    configuration.setCacheEnabled(false);
    sqlSessionFactory.setConfiguration(configuration);
    sqlSessionFactory.setPlugins(new Interceptor[]{ //PerformanceInterceptor(),OptimisticLockerInterceptor()
            paginationInterceptor() //添加分页功能
    });
    //sqlSessionFactory.setGlobalConfig(globalConfiguration());
    return sqlSessionFactory.getObject();
}

/*@Bean
public GlobalConfiguration globalConfiguration() {
    GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());
    conf.setLogicDeleteValue("-1");
    conf.setLogicNotDeleteValue("1");
    conf.setIdType(0);
    //conf.setMetaObjectHandler(new MyMetaObjectHandler());
    conf.setDbColumnUnderline(true);
    conf.setRefresh(true);
    return conf;
}*/

}MyBatiesPlusConfiguration.java    SwaggerConfiguration.java package com.seawaterbt.ssm.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

@Bean
public Docket createRestApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.seawaterbt.ssm.controller"))
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
}
private ApiInfo apiInfo(){
    return new ApiInfoBuilder()
            .title("多数据源 SSM 测试服务")
            .description("多数据源 SSM 测试文档")
            .termsOfServiceUrl("http://www.seawaterbt.com")
            //.contact(new Contact("海水不甜","http://www.seawaterbt.com","809318068@qq.com"))
            .version("1.0")
            .build();
}

}

新建注解 DataSource

DataSource.java

package com.seawaterbt.ssm.annotation;

import com.seawaterbt.ssm.enums.DataSourceEnum;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {

DataSourceEnum value() default DataSourceEnum.DB1;

}

DataSourceAspect.java

@Component
@Slf4j
@Aspect
@Order(-1)
public class DataSourceAspect {

@Pointcut("@within(com.seawaterbt.ssm.annotation.DataSource) || @annotation(com.seawaterbt.ssm.annotation.DataSource)")
public void pointCut(){

}

@Before("pointCut() && @annotation(dataSource)")
public void doBefore(DataSource dataSource){
    log.info("选择数据源---"+dataSource.value().getValue());
    DataSourceContextHolder.setDataSource(dataSource.value().getValue());
}

@After("pointCut()")
public void doAfter(){
    DataSourceContextHolder.clear();
}

}

新建DataSourceEnum

DataSourceEnum.java

package com.seawaterbt.ssm.enums;

public enum DataSourceEnum {

DB1("db1"),DB2("db2");

private String value;

DataSourceEnum(String value){this.value=value;}

public String getValue() {
    return value;
}

}

新建 MultipleDataSource

MultipleDataSource.java

package com.seawaterbt.ssm.multiple;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MultipleDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
    return DataSourceContextHolder.getDataSource();
}

}

新建DataSourceContextHolder

DataSourceContextHolder.java

package com.seawaterbt.ssm.multiple;

public class DataSourceContextHolder {

private static final ThreadLocal<String> contextHolder = new InheritableThreadLocal<>();

/**
 *  设置数据源
 * @param db
 */
public static void setDataSource(String db){
    contextHolder.set(db);
}

/**
 * 取得当前数据源
 * @return
 */
public static String getDataSource(){
    return contextHolder.get();
}

/**
 * 清除上下文数据
 */
public static void clear(){
    contextHolder.remove();
}

}

编写application.yml

application.yml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值