6、SpringBoot整合之SpringBoot整合Druid

SpringBoot整合Druid

一、创建项目,选择依赖

选择Spring Web、JDBC API、MySQL Driver即可




二、在pom中引入相关依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!-- 修改MySQL驱动版本 -->
    <version>5.1.26</version>
    <scope>runtime</scope>
</dependency>

<!-- 引入druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.20</version>
</dependency>

<!-- 引入log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

<!-- 引入lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

三、建库、建表、插入数据

CREATE DATABASE db_springboot_test CHARSET='utf8';

USE db_springboot_test;

CREATE TABLE tab_student(
    pk_student_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学生学号,起始值2021001',
    idx_student_name VARCHAR(10) COMMENT '学生姓名',
    idx_student_sex CHAR(1) COMMENT '学生性别',
    idx_student_score DOUBLE(4,1) COMMENT '学生分数'
) AUTO_INCREMENT 2021001 COMMENT '学生表' 

-- 随机向表中插入数据, 可连续执行多次
INSERT INTO tab_student VALUES(NULL,SUBSTR(MD5(RAND()),1,4),IF(RAND()>0.5,'男','女'),RAND()*100);

SELECT * FROM tab_student;

四、设置核心配置文件的属性

# 配置数据库连接的四大参数
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://192.168.133.139:3306/db_springboot_test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true

spring.datasource.username=root

spring.datasource.password=root


# 指定连接池的类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# 实现druid的SQL统计
spring.datasource.filters=stat,wall,log4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;

五、创建实体类

package cn.byuan.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

@NoArgsConstructor// 生成无参的构造方法
@AllArgsConstructor// 生成满参的构造方法
@Accessors(chain = true)// 使用链式调用
@Data// 自动生成get/set方法、重写toString方法等方法
public class Student implements Serializable {
    private Integer studentId;
    private String studentName;
    private String studentSex;
    private Double studentScore;
}

六、创建dao层的StudentDao接口并实现StudentDao接口,完成与数据库的交互

接口:

package cn.byuan.dao;

import cn.byuan.entity.Student;

import java.util.List;

public interface StudentDao {
//    添加一个学生
    Integer addOneStudent(Student student);

//    根据主键studentId删除一个学生
    Integer deleteOneStudentByStudentId(Integer studentId);

//    根据主键studentId修改一个学生
    Integer updateOneStudentByStudentId(Student student);

//    根据主键studentId查询一个学生
    Student getOneStudentByStudentId(Integer studentId);

//    获取全部学生
    List<Student> getAllStudent();
}

实现类:

package cn.byuan.dao.impl;

import cn.byuan.dao.StudentDao;
import cn.byuan.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository
public class StudentDaoImpl implements StudentDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;// 类似于PreparedStatement

//    添加一个学生
    @Override
    public Integer addOneStudent(Student student) {
        String sql="insert into tab_student values(null, ?, ?, ?)";
        return jdbcTemplate.update(sql, new PreparedStatementSetter() {// 匿名内部类
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setString(1, student.getStudentName());
                preparedStatement.setString(2, student.getStudentSex());
                preparedStatement.setDouble(3, student.getStudentScore());
            }
        });
    }

//    根据主键studentId删除一个学生
    @Override
    public Integer deleteOneStudentByStudentId(Integer studentId) {
        String sql="delete from tab_student where pk_student_id=?";
        return jdbcTemplate.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setInt(1, studentId);
            }
        });
    }

//    根据主键studentId修改一个学生
    @Override
    public Integer updateOneStudentByStudentId(Student student) {
        String sql="update tab_student set idx_student_name=?, idx_student_sex=?, idx_student_score=? where pk_student_id=?";
        return jdbcTemplate.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setString(1, student.getStudentName());
                preparedStatement.setString(2, student.getStudentSex());
                preparedStatement.setDouble(3, student.getStudentScore());
                preparedStatement.setInt(4, student.getStudentId());
            }
        });
    }

//    根据主键studentId查询一个学生
    @Override
    public Student getOneStudentByStudentId(Integer studentId) {
        String sql="select * from tab_student where pk_student_id=?";
        return jdbcTemplate.query(sql, getRowMapper(), studentId).get(0);
    }

//    获取全部学生
    @Override
    public List<Student> getAllStudent() {
        String sql="select * from tab_student";
        return jdbcTemplate.query(sql, getRowMapper());
    }

    private RowMapper<Student> getRowMapper(){// 查询所使用的RowMapper对象,这里单独拿出来提高代码复用性
        return new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentId(resultSet.getInt("pk_student_id"))
                        .setStudentName(resultSet.getString("idx_student_name"))
                        .setStudentSex(resultSet.getString("idx_student_sex"))
                        .setStudentScore(resultSet.getDouble("idx_student_score"));
                return student;
            }
        };
    }
}

七、创建一个配置类,配置druid的后台参数

package cn.byuan.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

@Configuration
public class DruidConfig {
    //    创建数据源对象
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource getDataSource(){
        return new DruidDataSource();
    }

    //    创建ServletRegistrationBean
    @Bean
    public ServletRegistrationBean getServletRegistrationBean(){
//        创建bean时指定后台服务的url
        ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");

//        创建一个map,指定账号密码
        HashMap<String, String> userMap=new HashMap<>();
        userMap.put("loginUsername", "Godfery");
        userMap.put("loginPassword", "123456");

//        指定允许的用户
        userMap.put("allow", "");

//        将map与bean进行绑定
        registrationBean.setInitParameters(userMap);

        return registrationBean;
    }
}

八、创建controller层

package cn.byuan.controller;

import cn.byuan.dao.StudentDao;
import cn.byuan.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

@RestController// 等价于所有的方法前面加 @Controller + @ResponseBody
@RequestMapping("/student")
public class StudentAction {
    @Autowired
    private StudentDao studentDao;

    @RequestMapping("/add_one_student.action")
    public String addOneStudent(){
        Student student = new Student()
                .setStudentName(UUID.randomUUID().toString().substring(0, 4))// 利用uuid随机姓名
                .setStudentSex(Math.random()>0.5?"男":"女")// 随机性别
                .setStudentScore(((int)(Math.random()*1000))/10.0);// 随机分数

        Integer row = studentDao.addOneStudent(student);
        return "添加"+row+"行成功";
    }

//    使用url模板映射
    @RequestMapping("/delete_one_student/{studentId}.action")
    public String deleteOneStudentByStudentId(@PathVariable("studentId") Integer studentId){
        Integer row = studentDao.deleteOneStudentByStudentId(studentId);
        return "已删除"+row+"行";
    }

//    由于不准备使用前端页面, 因此修改学生信息使用传入id值随机修改属性的形式
    @RequestMapping("/update_one_student/{studentId}.action")
    public String updateOneStudentByStudentId(@PathVariable("studentId") Integer studentId){
        Student student = new Student()
                .setStudentId(studentId)
                .setStudentName("update"+(int)(Math.random()*10))
                .setStudentSex(Math.random()>0.5?"男":"女")
                .setStudentScore(((int)(Math.random()*1000))/10.0);
        Integer row = studentDao.updateOneStudentByStudentId(student);

        return "修改"+row+"行成功";
    }

    @RequestMapping("/get_one_student/{studentId}.action")
    public Student getOneStudentByStudentId(@PathVariable("studentId") Integer studentId){
        return studentDao.getOneStudentByStudentId(studentId);
    }

    @RequestMapping("/get_all_student.action")
    public List<Student> getAllStudent(){
        return studentDao.getAllStudent();
    }

}

九、运行项目,进行测试

首先通过设置的账号和密码登录durid的后台;http://localhost:8080/druid


逐个输入action的url进行测试

增加:http://localhost:8080/student/add_one_student.action

删除:http://localhost:8080/student/delete_one_student/2021005.action

修改:http://localhost:8080/student/update_one_student/2021001.action

查询一个:http://localhost:8080/student/get_one_student/2021001.action

查询全部:http://localhost:8080/student/get_all_student.action

源码地址:https://github.com/byuan98/springboot-integration/tree/master/test006_springboot_druid

posted @ 2021-07-07 20:34  张知非  阅读(663)  评论(0编辑  收藏  举报