Springboot快速入门(八)——整合JDBC/Druid/MyBatis使用
2022-10-28 17:22:08

SpringData简介

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

  • Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。

  • Sping Data 官网:https://spring.io/projects/spring-data

  • 数据库相关的启动器 :弹簧启动参考文档 (spring.io)

一. 整合JDBC

1. 新建项目

选择的Dependencies有:Spring WebJDBC APIMySQL Driver

2. 新建application.yml文件并配置

1
2
3
4
5
6
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver

3. 连接MySQL数据库

4. 测试数据库连接

  • Demo5JdbcApplicationTests.java文件

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

    @Autowired(required = false)
    DataSource dataSource;

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

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

    //关闭
    connection.close();

    }

    }

报错问题

  • getConnection() 引入爆红

    原因:

    导入的包错误import javax.activation.DataSource;

    正确的是:import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;

    且要抛出异常:void contextLoads() throws SQLException {}

5.Controller中的增删改查

在SpringBoot中有许多的模板,如:XXX Template ;这是SpringBoot已经配置好的模板bean,拿来即用!其中JdbcTemplate模板可以用来对数据库进行操作!

  • JdbcTemplate

    1. 有了数据源(com.zaxxer
    2. .hikari.HikariDataSource),然后可以拿到数据库连接 (java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
    3. 即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate
    4. 数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
    5. Spring Boot不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用。
    6. JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的JdbcTemplateConfiguration类。
  • JdbcTemplate主要提供以下几类方法

    • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
    • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate 方法用于执行批处理相关语句;
    • query方法及queryForXXX方法:用于执行查询相关语句;
    • call方法:用于执行存储过程、函数相关语句。
  • JDBCController.java

    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
    @RestController
    public class JDBCController {

    @Autowired(required = false)
    JdbcTemplate jdbcTemplate;

    //查询数据库的所有信息
    //没有实体类,数据库中的东西,怎么获取? Map

    //查
    //List中的1个Map对应数据库的1行数据;Map中的key对应数据库的字段名,value对应数据库的字段值
    @GetMapping("/userList")
    public List<Map<String,Object>> userList(){
    String sql = "select * from user";
    List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);
    return list_maps;
    }

    //增
    @GetMapping("/addUser")
    public String addUser(){
    String sql = "insert into mybatis.user(id,name,pwd) values (4,'陈大花','123456')";
    jdbcTemplate.update(sql);
    return "update-ok";
    }

    //改
    @GetMapping("/updateUser/{id}")
    public String updateUser(@PathVariable("id") int id){
    String sql = "update mybatis.user set name=?,pwd=? where id="+id;
    //封装
    Object[] objects = new Object[2];
    objects[0] = "小明2";
    objects[1] = "zzz";
    jdbcTemplate.update(sql,objects);
    return "update-ok";
    }

    //删
    @GetMapping("/deleteUser/{id}")
    public String deleteUser(@PathVariable("id") int id){
    String sql = "delete from mybatis.user where id =?";
    jdbcTemplate.update(sql,id);
    return "deleteUser-ok";
    }
    }
  • 总结:

    数据库操作语句:

    • 查询:"select * from user";
    • 插入:"insert into mybatis.user(id,name,pwd) values (4,'陈大花','123456')";
    • 更改:"update mybatis.user set name=?,pwd=? where id="+id;
    • 删除:"delete from mybatis.user where id =?";

    springboot语句:

    • 查询:List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);
    • 插入:jdbcTemplate.update(sql);
    • 更改:jdbcTemplate.update(sql,objects);
    • 删除:jdbcTemplate.update(sql,id);

    即,查询用的是queryForList属性,查询完放在List中;新增/更改/删除用的都是update属性

二. 整合Druid

1. Druid简介

  • Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等DB池的优点,同时加入了日志监控
  • Druid可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的DB连接池
  • Github地址:https://github.com/alibaba/druid

2. 配置数据源

  • pom.xml文件

    添加上Druid数据源依赖和导入Log4j的依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!--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.12</version>
    </dependency>
  • application.yml文件

    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
    spring:
    datasource:
    username: root
    password: root
    # ?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource # 自定义数据源

    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #druid 数据源专有配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

  • 将自定义的 Druid数据源添加到容器中,绑定全局配置——DruidConfig.java文件

    为DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用Spring Boot的自动生成了;需要自己添加DruidDataSource组件到容器中,并绑定属性;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Configuration
    public class DruidConfig {

    /**
    * 将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
    * 绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
    * @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
    * 前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
    */
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource() {
    return new DruidDataSource();
    }
    }
  • 测试是否成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    @SpringBootTest
    class SpringbootDataJdbcApplicationTests {
    // DI注入数据源
    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException {
    // 查看默认数据源
    System.out.println(dataSource.getClass());
    // 获得连接
    Connection connection = dataSource.getConnection();
    System.out.println(connection);

    DruidDataSource druidDataSource = (DruidDataSource) dataSource;
    System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
    System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());

    // 关闭连接
    connection.close();
    }
    }

3. 配置Druid数据源监控

  • Druid 数据源具有监控的功能,并提供了一个web界面方便用户查看,类似安装路由器时,人家也提供了一个默认的web页面。

  • 所以第一步需要设置 Druid 的后台管理页面,比如登录账号、密码等;配置后台管理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // 配置 Druid 监控管理后台的Servlet;
    // 内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
    @Bean
    public ServletRegistrationBean statViewServlet() {
    ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

    // 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet
    // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
    Map<String, String> initParams = new HashMap<>();
    initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
    initParams.put("loginPassword", "123456"); //后台管理界面的登录密码

    // 后台允许谁可以访问
    // initParams.put("allow", "localhost"):表示只有本机可以访问
    // initParams.put("allow", ""):为空或者为null时,表示允许所有访问
    initParams.put("allow", "");
    // deny:Druid 后台拒绝谁访问
    // initParams.put("kuangshen", "192.168.1.20");表示禁止此ip访问

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

  • 配置监控filter过滤器(平时在工作中,按需求进行配置即可,主要用作监控!)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 配置 Druid 监控 之  web 监控的 filter
    // WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
    @Bean
    public FilterRegistrationBean webStatFilter() {
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new WebStatFilter());

    // exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
    Map<String, String> initParams = new HashMap<>();
    initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
    bean.setInitParameters(initParams);

    // "/*" 表示过滤所有请求
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;
    }

4. 结果

三. 整合MyBatis

1. 配置数据源

  • pom.xml文件——导入MyBatis依赖

    1
    2
    3
    4
    5
    6
    <!--mybatis-->
    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.1</version>
    </dependency>
  • application.properties文件——连接数据库,整合MyBatis

    1
    2
    3
    4
    5
    6
    7
    8
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    # 整合mybatis
    mybatis.type-aliases-package=com.cc.pojo
    mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

2. 测试数据库是否成功连接

  • test文件

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

    //DI注入数据源
    @Autowired(required = false)
    DataSource dataSource;

    @Test
    void contextLoads() {
    //查看默认数据源
    System.out.println(dataSource.getClass());
    try {
    System.out.println(dataSource.getConnection());
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }

3. 创建实体类pojo——User类

  • 导入lombok依赖

    1
    2
    3
    4
    5
    <!--lombook-->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </dependency>
  • User.java文件

    1
    2
    3
    4
    5
    6
    7
    8
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
    private Integer id;
    private String name;
    private String pwd;
    }

4. 创建接口mapper——UserMapper接口

  • UserMapper.java文件

    声明controller中的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // @Mapper: 表示本类是一个 MyBatis 的 Mapper类
    @Mapper
    @Repository
    public interface UserMapper {

    //查询用户的信息
    List<User> queryUserList();

    //通过id查询用户信息
    User queryUserById(int id);

    //增加用户信息
    int addUser(User uer);

    //更新用户
    int updateUser(User user);

    //删除用户
    int deleteUser(int id);
    }

5. 创建对应的mapper映射文件/maven配置资源过滤/指定文件路径

  • UserMapper.xml文件

    resources目录下新建mybatis.mapper包,包下新建UserMapper.xml文件

    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
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <mapper namespace="com.cc.mapper.UserMapper">

    <select id="queryUserList" resultType="User">
    select * from user
    </select>

    <select id="queryUserById" resultType="User">
    select * from user where id = #{id}
    </select>

    <insert id="addUser" parameterType="User">
    insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <update id="updateUser" parameterType="User">
    update user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>

    <delete id="deleteUser" parameterType="int">
    delete from user where id = #{id}
    </delete>


    </mapper>

resultType与parameterType 的基本使用区别 :

  1. resultType :主要针对于从数据库中提取相应的数据出来,用于指定sql输出的结果类型

    • 基本数据类型
    • pojo类型
  2. parameterType:主要针对于将信息存入到数据库中,如:insert 增加数据到数据库,用于对应的mapper接口方法接受的参数类型

  • 基本数据类型:int, string, long., Date
    • 复杂数据类型:类和Map
  • pom.xml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <resources>
    <resource>
    <directory>src/main/java</directory>
    <includes>
    <include>**/*.xml</include>
    </includes>
    <filtering>true</filtering>
    </resource>
    </resources>
  • application.properties文件

    1
    2
    3
    4
    # 对应实体类的路径
    mybatis.type-aliases-package=com.cc.pojo
    # 指定myBatis的核心配置文件与Mapper映射文件
    mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

6. 创建controller层进行测试

  • UserController.java文件

    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
    @RestController
    public class UserController {

    @Autowired
    private UserMapper userMapper;

    //查询用户
    @GetMapping("/queryUserList")
    public List<User> queryUserList(){
    List<User> userList = userMapper.queryUserList();
    for(User user : userList){
    System.out.println(user);
    }
    return userList;
    }

    //添加一个用户
    @GetMapping("/addUser")
    public String addUser(){
    userMapper.addUser(new User(5,"阿狗","456789"));
    return "ok";
    }

    //修改一个用户
    @GetMapping("/updateUser")
    public String updateUser(){
    userMapper.updateUser(new User(1,"阿狗","789456"));
    return "ok";
    }

    //根据id删除用户
    @GetMapping("/deleteUser")
    public String deleteUser(){
    userMapper.deleteUser(5);
    return "ok";
    }

    }

四、三类方法总结

  • 回顾这3种方法:整合JDBC是最简便,最易上手的;整合MyBatis是条理最清晰的,更有逻辑感;整合Druid更适合开发者,但上手较为繁琐

  • 整合JDBC和整合MyBatis类似,但又各有不同:

    • JDBC的配置文件是——application.yml;MyBatis的配置文件是——application.properties

    • JDBC中的controller层既写业务层的操作,也写对数据库的操作;MyBatis中只写业务层操作

    • JDBC在controller中用自带的JdbcTemplate模板;MyBatis在controller中用UserMapper接口方法

    • 整合JDBC只需在配置文件中连接数据库,在controller中写方法就OK了

    • 整合MyBatis需要分:

      • 实体类层
      • mapper接口层
      • mapper映射
      • controller层

      除此,还需要在pom.xml文件中配置资源过滤;在application.properties文件指定实体类路径和映射文件路径、

五、MyBatis整合实验

尝试把demo3的员工部门项目连接一个数据库失败!目前还需要学习的地方还有很多,这个尝试在后面一定要完成!