前言:
去年九月份我和同事在极客时间上买了 丁雪丰 的Spring 全家桶学习,课程总共分为16章,我已经学了大半部分了,之前是在笔记本上记录,今天我想记录在Blog 上 ,分享更多的知识给有需要帮助的人,我会以章节数来作为文章的内容,原课程讲的更详细,我这里就一些具体的点做一个总结。
一.好用的连接池 HiKarCP
HiKarCp 作者称之为光,就是很快的意思。
SpringBoot 2.x
- 默认使用HikariCP
- 配置spring.datasource.hikari.* 配置
SpringBoot 1.x
- 默认使用Tomcat连接池,需要移除 tomcat-jdbc 依赖
- 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
- core JdbcTemplate等相关核心接口和类
- dataSource,数据源相关的辅助类
- object ,将基本的JDBC操作封装成对象
- support,错误码等其他辅助工具。
常用的bean注解:
扫描二维码关注公众号,回复: 10156373 查看本文章
- @Component (相当于定义一个通用的bean)
- @Repository (数据库操作的一个仓库,关于数据库相关的东西可以使用这个注解)
- @Service
- @Controller
- @ResController
简单的JDBC操作
JdbcTemplate
- query
- queryForObject (单条数据)
- queryForList (多条数据)
- update
- 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) 执行效果