SpringBoot+Mybatis-plus的整合,多数据源增删改查

1: 创建数据库表

-- 数据库demo1创建student库表
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
  `age` int(2) DEFAULT NULL COMMENT '年龄',
  `address` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='学生信息表'
-- 数据库demo2创建student_score库表
CREATE TABLE `student_score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) DEFAULT NULL COMMENT '学生id',
  `course` varchar(100) DEFAULT NULL COMMENT '课程',
  `score` int(10) DEFAULT NULL COMMENT '成绩',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='学生课程成绩表'

2: 创建springboot项目(省略),引入相应依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/>
    </parent>
    <groupId>com.abc</groupId>
    <artifactId>springboot-mybatisPlus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatisPlus</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <!--多数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3: 编写application.yml配置文件

server:
  port: 9001

# 打印SQL语句到控制台
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

spring:
  datasource:
    dynamic:
      primary: one #设置默认的数据源或者数据源组,默认值即为one
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        one:  # 数据源1标志
          url: jdbc:mysql://127.0.0.1:3306/demo1
          username: root
          password: 12345
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          # 下面为连接池的补充设置,应用到上面所有数据源中
          initialSize: 1  # 初始化大小
          minIdle: 3      # 最小
          maxActive: 10   # 最大
          # 配置获取连接等待超时的时间
          maxWait: 60000
          # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
          timeBetweenEvictionRunsMillis: 60000
          # 配置一个连接在池中最小生存的时间,单位是毫秒
          minEvictableIdleTimeMillis: 30000
          validationQuery: select 'x'
          testWhileIdle: true
          testOnBorrow: false
          testOnReturn: false
          # 打开PSCache,并且指定每个连接上PSCache的大小
          poolPreparedStatements: true
          maxPoolPreparedStatementPerConnectionSize: 20
        two:  # 数据源2标志
          url: jdbc:mysql://127.0.0.1:3306/demo2
          username: root
          password: 12345
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          # 下面为连接池的补充设置,应用到上面所有数据源中
          initialSize: 1  # 初始化大小
          minIdle: 3      # 最小
          maxActive: 10   # 最大
          # 配置获取连接等待超时的时间
          maxWait: 60000
          # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
          timeBetweenEvictionRunsMillis: 60000
          # 配置一个连接在池中最小生存的时间,单位是毫秒
          minEvictableIdleTimeMillis: 30000
          validationQuery: select 'x'
          testWhileIdle: true
          testOnBorrow: false
          testOnReturn: false
          # 打开PSCache,并且指定每个连接上PSCache的大小
          poolPreparedStatements: true
          maxPoolPreparedStatementPerConnectionSize: 20

4: 创建实体类

/**
 * 学生实体类
 * 实体类字段和数据库库表字段保持一致
 */
@Data
@AllArgsConstructor
public class Student {
  	//主键自增
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    private String address;
}
/**
 * 学生成绩实体类
 * 实体类字段和数据库库表字段保持一致
 */
@Data
@AllArgsConstructor
public class Student_score {
  	//主键自增
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer student_id;
    private String course;
    private Integer score;
}

5: 编写Mapper数据库交互层

/**
 * 学生类数据交互层
 * 使用数据源1
 */
@Mapper
@DS("one")  //和application.yml中的数据源1标志保持一致
public interface StudentMapper extends BaseMapper<Student> {
}

/**
 * 学生成绩类数据交互层
 * 使用数据源2
 */
@Mapper
@DS("two")  //和application.yml中的数据源2标志保持一致
public interface Student_scoreMapper extends BaseMapper<Student_score> {
}

6: 编写Service层接口


/**
 * 学生Service层接口
 */
public interface StudentService {

    //新增学生信息
    int addStudent(Student student);

    //新增学生成绩信息
    int addStudentScore(Student_score student_score);

    //修改学生信息
    int updateStudent(Student student);

    //修改学生成绩信息
    int updateStudentScore(Student_score student_score);

    //根据学生ID删除学生信息
    int deleteStudent(Integer id) ;

    //根据学生ID删除学生成绩信息
    int deleteStudentScore(Integer student_id) ;

    //根据id查询学生信息
    Student queryStudentById(Integer id);

    //查询全部学生信息
    List<Student> queryAllStudent();

    //根据学生ID查询学生成绩信息
    List<Student_score> queryStudentScoreById(Integer student_id);
}

7: 编写Service层接口实现类

/**
 * 学生Service层接口实现类
 */
@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper studentMapper;

    @Autowired
    private Student_scoreMapper student_scoreMapper;

    /**
     * 新增学生信息
     * @param student  学生信息
     */
    @Override
    public int addStudent(Student student) {
        return studentMapper.insert(student);
    }
    /**
     * 新增学生成绩信息
     * @param student_score 学生成绩信息
     */
    @Override
    public int addStudentScore(Student_score student_score) {
        return student_scoreMapper.insert(student_score);
    }

    /**
     * 修改学生信息
     * @param student 学生信息
     */
    @Override
    public int updateStudent(Student student) {
        //更新条件, 根据id更新
        UpdateWrapper<Student> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", student.getId())
                .set("name", student.getName())
                .set("age", student.getAge())
                .set("address", student.getAddress());
        return studentMapper.update(null, updateWrapper);
    }
    /**
     * 修改学生成绩信息
     *
     * @param student_score 学生成绩信息
     */
    @Override
    public int updateStudentScore(Student_score student_score) {
        //根据学生成绩id, 学生ID,课程名称,更新学生成绩信息
        UpdateWrapper<Student_score> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", student_score.getId())
                .eq("student_id", student_score.getStudent_id())
                .eq("course", student_score.getCourse())
                .set("score", student_score.getScore());
        return student_scoreMapper.update(null, updateWrapper);
    }

    /**
     * 根据学生ID删除学生信息
     * @param id 学生ID
     */
    @Override
    public int deleteStudent(Integer id) {
        return studentMapper.deleteById(id);
    }

    /**
     * 根据学生ID删除学生成绩信息
     *
     * @param student_id 学生ID
     */
    @Override
    public int deleteStudentScore(Integer student_id) {
        QueryWrapper<Student_score> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("student_id", student_id);
        return student_scoreMapper.delete(queryWrapper);
    }
    /**
     * 根据id查询学生信息
     *
     * @param id 学生ID
     */
    @Override
    public Student queryStudentById(Integer id) {
        return studentMapper.selectById(id);
    }

    /**
     * 查询全部学生信息
     */
    @Override
    public List<Student> queryAllStudent() {
        return studentMapper.selectList(null);
    }

    /**
     * 根据学生ID查询学生成绩信息
     *
     * @param student_id 学生ID
     */
    @Override
    public List<Student_score> queryStudentScoreById(Integer student_id) {
        //每个学生有可能存在多个成绩
        QueryWrapper<Student_score> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("student_id", student_id);
        return student_scoreMapper.selectList(queryWrapper);
    }
}

8: 编写Controller层


/**
 * 学生控制器层
 */
@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudentService studentService;

    /**
     * 新增学生信息
     */
    @PostMapping(value = "/saveOne")
    public Map<String, Object> saveOne(@RequestBody Student student) {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            int num = studentService.addStudent(student);
            if (num > 0) {
                resultMap.put("code", 200);
                resultMap.put("msg", "新增学生成功, 入库条数:" + num + "条");
            } else {
                resultMap.put("code", 500);
                resultMap.put("msg", "新增学生失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "新增学生信息异常");
        }
        return resultMap;
    }


    /**
     * 新增学生成绩信息
     */
    @PostMapping(value = "/saveTwo")
    public Map<String, Object> saveTwo(@RequestBody Student_score student_score) {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            int num = studentService.addStudentScore(student_score);
            if (num > 0) {
                resultMap.put("code", 200);
                resultMap.put("msg", "新增学生成绩成功, 入库条数:" + num + "条");
            } else {
                resultMap.put("code", 500);
                resultMap.put("msg", "新增学生成绩失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "新增学生成绩信息异常");
        }
        return resultMap;
    }
    /**
     * 修改学生信息
     */
    @PutMapping(value = "/saveThree")
    public Map<String, Object> saveThree(@RequestBody Student student) {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            int num = studentService.updateStudent(student);
            if (num > 0) {
                resultMap.put("code", 200);
                resultMap.put("msg", "修改学生信息成功");
            } else {
                resultMap.put("code", 500);
                resultMap.put("msg", "修改学生信息失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "修改学生信息异常");
        }
        return resultMap;
    }
    /**
     * 修改学生成绩信息
     */
    @PutMapping(value = "/saveFour")
    public Map<String, Object> saveFour(@RequestBody Student_score student_score) {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            int num = studentService.updateStudentScore(student_score);
            if (num > 0) {
                resultMap.put("code", 200);
                resultMap.put("msg", "修改学生成绩信息成功");
            } else {
                resultMap.put("code", 500);
                resultMap.put("msg", "修改学生成绩信息失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "修改学生成绩信息异常");
        }
        return resultMap;
    }
    /**
     * 根据学生ID删除学生信息,并且删除对应学生的成绩信息
     */
    @DeleteMapping(value = "/saveFive")
    public Map<String, Object> saveFive(@RequestBody JSONObject jsonObject) {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            //获取请求学生id
            Integer id = jsonObject.getInteger("id");
            //删除学生信息
            int num = studentService.deleteStudent(id);
            //删除学生成绩信息
            int i = studentService.deleteStudentScore(id);
            if (num > 0) {
                resultMap.put("code", 200);
                resultMap.put("msg", "删除学生信息成功");
            } else {
                resultMap.put("code", 500);
                resultMap.put("msg", "删除学生信息失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "删除学生信息异常");
        }
        return resultMap;
    }



    /**
     * 根据id查询学生信息
     */
    @GetMapping(value = "/saveSix")
    public Map<String, Object> saveSix(@RequestParam("id") Integer id) {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            //存放查询结果
            Map<String, Object> map = new HashMap<>();
            //根据id查询学生信息
            Student student = studentService.queryStudentById(id);
            map.put("student", student);
            //查询学生成绩信息
            List<Student_score> student_scores = studentService.queryStudentScoreById(id);
            map.put("student_scores", student_scores);
            if (student != null) {
                resultMap.put("code", 200);
                resultMap.put("msg", "查询成功");
                resultMap.put("data", map);
            } else {
                resultMap.put("code", 200);
                resultMap.put("msg", "学生信息不存在");
            }
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "查询学生信息异常");
        }
        return resultMap;
    }


    /**
     * 查询全部学生信息
     */
    @GetMapping(value = "/saveSeven")
    public Map<String, Object> saveSeven() {
        //记录入库信息
        Map<String, Object> resultMap = new HashMap<>();
        try {
            //查询全部学生信息
            List<Student> studentList = studentService.queryAllStudent();
            resultMap.put("code", 200);
            resultMap.put("msg", "查询成功");
            resultMap.put("data", studentList);
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", 400);
            resultMap.put("msg", "查询学生信息异常");
        }
        return resultMap;
    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值