Preface:
September last year, my colleagues and I at the time geeks bought Ding Xuefeng Spring family bucket of learning, the curriculum is divided into 16 chapters in total, I have learned the most part, are recorded in a notebook before, today I want to record on the Blog, Share more knowledge to those in need of help, I will be the number of chapters as the content of the article, the original course speak in more detail, I am here to do a summary on some specific points.
I. easy connection pool HiKarCP
HiKarCp authors say the light is soon mean.
SpringBoot 2.x
- Default HikariCP
- Placed spring.datasource.hikari. * Arrangement
SpringBoot 1.x
- Default Tomcat connection pool, you need to remove the tomcat-jdbc-dependent
- spring.datasource.type=com.zaxxer.HikariDataSource
Commonly located:
- 1. The introduction of the jar package HiKarCP
- 2. profile configuration information
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
Refer to: http://fanlychie.github.io/post/spring-boot-tomcat-pool-hikaricp-dbcp-dbcp2.html
II. Easy to use database connection pool Alibaba druid
Refer to: https://blog.csdn.net/jay100500/article/details/81270298
See also my other blog post, there are Alibaba explain this database connection pool.
III. How to access data through Spring JDBC
spring-jdbc
- core JdbcTemplate and other related core interfaces and classes
- dataSource, the data source associated auxiliary class
- object, the basic operation of the package into target JDBC
- support, error codes, and other aids.
Common bean notes:
- @Component (corresponding to a common definition of the bean)
- @Repository (a warehouse database operations on database related things you can use this annotation)
- @Service
- @Controller
- @ResController
Simple JDBC operations
JdbcTemplate
- query
- queryForObject (single data)
- the queryForList (pieces of data)
- update
- execute
How to use these methods in JdbcTemplate?
- (1) JDBC jar package introduced, I posted the entire pom file
<?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) the connection configuration information in the configuration file
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) a new table linkman, id set the primary key, the default auto increment
- (4) LinkMan entity class
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 layer
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) Control Layer
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) browser access interface
- (8) implementation of the results:
SQL batch
JdbcTemplate
- batchUpdate
- BatchPreparedStatementSetter
NamedParameterJdbcTemplate
- batchUpdate
- SqlParameterSourceUtils.createBatch
How to use a batch?
Followed the example above, I have to sit down and find both a method above is annotated with the ordinary insertion and maybe a batch is done as an example, the environment or something like it.
- (1) batch of class: 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) the implementation of this interface:
- (3) the effect of execution