Day19 SpringBoot 6 SpringDate JdbcTemplate Alibaba的Druid
uwupu 啦啦啦啦啦

接下来要学习的

SpringBoot整合

  • JDBC
  • MyBatis
  • Druid
  • Shiro:安全
  • Spring Security:安全
  • 异步任务、邮件发送、定时任务
  • Swgger
  • Dubbo + Zookeepr

Spring Boot 数据库

Spring Data? Spring、Spring Boot、Spring Cloud、Spring Data!

对于数据访问层,无论是SQL(关系型数据库)还是NOSQL(非关系型数据库),SpringBoot底层都采用Spring Data方式统一处理;

MySQL

使用

  1. 在application.yml中添加数据源配置;

    1
    2
    3
    4
    5
    6
    spring:
    datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/springbootstudy?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
  2. 在要使用的类中直接创建一个引用,使用@Autowired注解。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @SpringBootTest
    class SpringBootWebStudy3DataApplicationTests {

    @Autowired //自动注入
    DataSource dataSource;//可以直接使用的数据源

    @Test
    void contextLoads() throws SQLException {
    //查看默认数据源
    System.out.println(dataSource.getClass());

    //获取数据库连接
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    connection.close();
    }

    }
  3. 测试

    1
    2
    class com.zaxxer.hikari.HikariDataSource
    HikariProxyConnection@1744190758 wrapping com.mysql.cj.jdbc.ConnectionImpl@536b71b4

链接url参数解释

1
jdbc:mysql://localhost:3306/springbootstudy?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
  • jdbc:mysql://:协议名

  • localhost:3306/:地址

  • springbootstudy:数据库名

  • useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC:参数,其中

    • useUnicode=truecharacterEncoding=utf-8解决编码问题;
    • serverTimezone=UTC解决时区问题。若运行过程中出错,显示时区错误,可以通过这个参数解决;
    • 目前测试8.x版本,没有遇到相关问题,这些参数可以不加。

一些知识

默认数据源:HikariDataSource

SpringBoot相关类

DataSourceProperties、DataSourceAutoConfiguration。

JdbcTemplate

Spring对JDBC进行封装,使用JdbcTemplate可以非常方便的进行数据库操作。

使用

在SpringBoot下配置之后,DataSource和JdbcTemplate通过@Autowired可以直接操作数据库。

1
2
@Autowired
JdbcTemplate template;

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@RestController
public class JDBCController {

@Autowired
JdbcTemplate template;

//查询数据库所有信息 并显示在网页上
//没有实体类 数据库中的数据如何获取

@RequestMapping("/user/list")
public List<Map<String,Object>> userList(){
String sql = "select * from user";
List<Map<String, Object>> list_maps = template.queryForList(sql);
return list_maps;
}

@GetMapping("/user/add")
public String addUser(User user){
//username=ZhangSan&password=zs1234556&nickname=zs&regdate=2022-02-22
System.out.println(user);
String sql = String.format("insert into `springbootstudy`.`user`(`username`,`password`,`nickname`,`regdate`) values('%s','%s','%s','%s')",
user.getUsername(),
user.getPassword(),
user.getNickname(),
new SimpleDateFormat("yyyy-MM-dd").format(user.getRegdate())
);
System.out.println(sql);
try {
return String.valueOf(template.update(sql));
}catch (Exception e){
return sql;
}

}
@GetMapping("/user/delete/{id}")
public String deleteUser(@PathVariable("id") Integer id){
//id=1
String sql = "delete from user where id=?";
return String.valueOf(template.update(sql,id));

}
@GetMapping("/user/update")
public String updateUser(User user){
//username=ZhangSan&password=zs1234556&nickname=zs&regdate=2022-02-22
System.out.println(user);
String sql = "update user set username=?,password=?,nickname=? where id=?";
//封装
Object[] objects = {
user.getUsername(),
user.getPassword(),
user.getNickname(),
user.getId()
};
return String.valueOf(template.update(sql,objects));
}
}

Alibaba的Druid数据源

Hikari和Druid都是当前Java Web上最优秀的数据源。Hikari有优秀的速度,Druid有优秀的日志监控功能。

Druid特色:添加优秀的监控功能,拥有使用Web页面查看监控项目功能。

(Druid的监控功能不是监控数据库的,是监控Java应用的)

依赖

Druid需要两个依赖:com.alibaba.druid和log4j.log4j。

1
2
3
4
5
6
7
8
9
10
11
12
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

指定SpringBoot使用阿里巴巴的Druid数据源

两种方式,

方式1:在SpringBoot下添加配置

在SpringBoot下的配置里添加以下内容。

1
2
3
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource

方式2:创建配置类

在config包下创建DruidConfig类,并添加druidDataSource方法,使用@Bean注解和@ConfigurationProperties(prefix = “spring.datasource”)注解,自定义数据源。

1
2
3
4
5
6
7
8
9
@Configuration//声明配置类
public class DruidConfig {

@Bean//声明Bean
@ConfigurationProperties(prefix = "spring.datasource")//使用application的配置
public DataSource druidDataSource(){
return new DruidDataSource();//数据源
}
}

使用alibaba的Druid监控功能

配置监控页面(Web)

  1. 在config下创建DruidConfig类

    image

  2. 使用@Configuration注解DruidConfig类。

    1
    2
    @Configuration
    public class DruidConfig {...}
  3. 配置数据源,并使数据源依赖于alibaba.druid。

    1
    2
    3
    4
    5
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSources(){
    return new DruidDataSource();
    }
  4. 配置后台监控功能

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //后台监控功能
    @Bean
    public ServletRegistrationBean statViewServlet(){
    ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");//监控的url地址,这里为http://127.0.0.1/druid/

    //增加配置
    HashMap<String, String> initParameters = new HashMap<>();

    //后台账号和密码配置 key是固定值不能变 loginUsername用户名 loginPassword密码
    initParameters.put("loginUsername","root");
    initParameters.put("loginPassword","123456");

    //允许访问
    initParameters.put("allow","");//若参数为空,表示所有人可以访问

    bean.setInitParameters(initParameters);//设置初始化参数
    return bean;
    }
  5. (可选)配置Filter,使Druid不统计指定的数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //通过filter配置不需要druid统计的数据
    @Bean
    public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new WebStatFilter());

    //不进行统计的数据
    Map<String,String> initParameters = new HashMap<>();
    initParameters.put("exclusions","*.js,*.css,/druid/*");//不统计符合表达式的数据,这里指所有的js和css文件。
    bean.setInitParameters(initParameters);
    return bean;
    }

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Configuration
public class DruidConfig {

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSources(){
return new DruidDataSource();
}

//后台监控功能
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");

//增加配置
HashMap<String, String> initParameters = new HashMap<>();

//后台账号和密码配置 key是固定值 loginUsername用户名 loginPassword密码
initParameters.put("loginUsername","root");
initParameters.put("loginPassword","123456");

//允许访问
initParameters.put("allow","");//若参数为空,表示所有人可以访问

bean.setInitParameters(initParameters);//设置初始化参数
return bean;
}

//通过filter配置不需要druid统计的数据
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());

//不进行统计的数据
Map<String,String> initParameters = new HashMap<>();
initParameters.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParameters);
return bean;
}

}

界面展示

image

其他

示例用的SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE DATABASE springbootstudy;

CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username CHAR(30),
PASSWORD CHAR(30),
nickname CHAR(30),
regdate date
);

INSERT INTO user(`username`,`PASSWORD`,`nickname`,`regdate`) VALUES
('zs123','123456','ZhangSan','2022-2-22'),
('ls123','123456','LiSi','2022-2-23'),
('yb123','123456','YuBan','2022-2-24'),
('xh123','123456','XiaoHong','2022-2-25'),
('xm123','123456','XiaoMing','2022-2-26');



select * from user;
 评论