Spring全家桶学习(2)

前言:

去年九月份我和同事在极客时间上买了 丁雪丰 的Spring 全家桶学习,课程总共分为16章,我已经学了大半部分了,之前是在笔记本上记录,今天我想记录在Blog 上 ,分享更多的知识给有需要帮助的人,我会以章节数来作为文章的内容,原课程讲的更详细,我这里就一些具体的点做一个总结。

一.好用的连接池 HiKarCP

HiKarCp 作者称之为光,就是很快的意思。

SpringBoot 2.x 

  1. 默认使用HikariCP
  2. 配置spring.datasource.hikari.* 配置

SpringBoot 1.x

  1. 默认使用Tomcat连接池,需要移除 tomcat-jdbc 依赖
  2. spring.datasource.type=com.zaxxer.HikariDataSource

常用配置:

  • 1.引入HiKarCP的jar包
  • 2.配置文件中配置信息
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.max-lifetime=1800000

可参考:http://fanlychie.github.io/post/spring-boot-tomcat-pool-hikaricp-dbcp-dbcp2.html

二.好用的数据库连接池  Alibaba druid

可参考:https://blog.csdn.net/jay100500/article/details/81270298

也可以参考我的另外一篇博客,里面有讲解 阿里巴巴这个数据库连接池。

三. 如何通过Spring JDBC 访问数据

spring-jdbc

  1. core JdbcTemplate等相关核心接口和类
  2. dataSource,数据源相关的辅助类
  3. object ,将基本的JDBC操作封装成对象
  4. support,错误码等其他辅助工具。

常用的bean注解:

扫描二维码关注公众号,回复: 10156373 查看本文章
  1. @Component  (相当于定义一个通用的bean)
  2. @Repository (数据库操作的一个仓库,关于数据库相关的东西可以使用这个注解)
  3. @Service
  4. @Controller
  5. @ResController

简单的JDBC操作

JdbcTemplate

  1. query
  2. queryForObject  (单条数据)
  3. queryForList      (多条数据)
  4. update
  5. execute

如何使用JdbcTemplate中的这些方法?

  • (1) 引入的JDBC的jar 包 ,我将整个pom 文件贴出来
<?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.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-demo</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-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- MySQL start -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

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

</project>
  • (2) 配置文件中配置连接信息
server.port=8007

# MySQL Database
spring.datasource.url=jdbc:mysql://192.168.20.81:3306/main_config?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  • (3)  新建一张 linkman的表,id 设置主键 ,默认自动递增

  • (4) LinkMan 实体类
package com.example.simplejdbcdemo;

import lombok.Builder;
import lombok.Data;

/**
 * @Author tanghh
 * @Date 2020/3/23 14:25
 */
@Data
@Builder
public class LinkMan {
    private Integer id;
    private String linkmanName;

}
  • (5) Dao层
package com.example.simplejdbcdemo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

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

/**
 * @Author tanghh
 * @Date 2020/3/23 14:27
 */
@Slf4j
@Repository
public class LinkManDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 1.添加数据
     */
    public void insertData() {
        Arrays.asList("666", "7777").forEach(bar -> {
            jdbcTemplate.update("insert into linkman (linkman_name) values(?)", bar);
        });

    }

    /**
     * 2.查询所有的数据
     */
    public void listData() {
        log.info("Count: {}",
                jdbcTemplate.queryForObject("SELECT COUNT(*) FROM linkman", Long.class));

        List<String> list = jdbcTemplate.queryForList("SELECT linkman_name FROM linkman", String.class);
        list.forEach(s -> log.info("linkman_name: {}", s));

        List<LinkMan> fooList = jdbcTemplate.query("SELECT * FROM linkman", new RowMapper<LinkMan>() {
            @Override
            public LinkMan mapRow(ResultSet rs, int rowNum) throws SQLException {
                return LinkMan.builder()
                        .id(rs.getInt(1))
                        .linkmanName(rs.getString(2))
                        .build();
            }
        });
        fooList.forEach(f -> log.info("Foo: {}", f));
    }

}
  •  (6) 控制层
package com.example.simplejdbcdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author tanghh
 * @Date 2020/3/23 14:28
 */
@RestController
public class TestJdbcController {
   @Autowired
   private LinkManDao linkManDao;

   @Autowired
   private BatchLinkManDao batchLinkManDao;

    @GetMapping(value = "/testApi")
    public void testApi(){
        //1.添加数据
        linkManDao.insertData();
        //2.查询所有的数据
        linkManDao.listData();
        //3.批量添加方式1
//        batchLinkManDao.batchInsertWay1();
        //4.批量添加方式2
//        batchLinkManDao.batchInsertWay2();
    }

}
  •  (7) 浏览器访问接口

  • (8)执行效果:

SQL 批处理

JdbcTemplate

  • batchUpdate
  • BatchPreparedStatementSetter

NamedParameterJdbcTemplate

  • batchUpdate
  • SqlParameterSourceUtils.createBatch

 如何使用批处理?

跟着上面的那个例子 坐下来发现我上面还有俩个方法是注释着的,普通插入 和批处理这俩个是作为一个例子做的,所以环境什么的跟上面一样。

  •  (1)  批处理的类:BatchLinkManDao
package com.example.simplejdbcdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.stereotype.Repository;

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

@Repository
public class BatchLinkManDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    /**
     * 批量添加方式1
     */
    public void batchInsertWay1() {
        jdbcTemplate.batchUpdate("INSERT INTO linkman (linkman_name) VALUES (?)",
                new BatchPreparedStatementSetter() {
                    @Override
                    public void setValues(PreparedStatement ps, int i) throws SQLException {
                        ps.setString(1, "csdn博客" + i);
                    }

                    @Override
                    public int getBatchSize() {
                        return 2;
                    }
                });


    }

    /**
     * 批量添加方式2
     */
    public void batchInsertWay2() {
        List<LinkMan> list = new ArrayList<>();
        list.add(LinkMan.builder().linkmanName("soup_tang").build());
        list.add(LinkMan.builder().linkmanName("csdn").build());
        namedParameterJdbcTemplate
                .batchUpdate("INSERT INTO linkman (linkman_name) VALUES (:linkmanName)",
                        SqlParameterSourceUtils.createBatch(list));
    }
}
  • (2)执行这个接口:

  • (3) 执行效果

发布了66 篇原创文章 · 获赞 49 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/105044124