Prefacio:
Septiembre del año pasado, mis colegas y yo en los frikis tiempo ganado cubo de la familia Ding Xuefeng primavera de aprendizaje, el plan de estudios se divide en 16 capítulos en total, he aprendido la mayor parte, son registrados en un cuaderno antes, hoy quiero grabar en el blog, compartir más conocimiento a las personas que necesitan ayuda, voy a ser el número de capítulos como el contenido del artículo, el curso original hablar con más detalle, yo estoy aquí para hacer un resumen sobre algunos puntos específicos.
I. fácil conexión de la piscina HiKarCP
HiKarCp autores dicen que la luz es muy pronto media.
2.x SpringBoot
- predeterminado HikariCP
- spring.datasource.hikari colocado. * Arreglo
1.x SpringBoot
- Por defecto agrupación de conexiones Tomcat, tiene que quitar el gato-JDBC dependiente
- spring.datasource.type = com.zaxxer.HikariDataSource
Comúnmente se encuentra:
- 1. La introducción del paquete jar HiKarCP
- 2. información de configuración de perfil
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
Consulte: http://fanlychie.github.io/post/spring-boot-tomcat-pool-hikaricp-dbcp-dbcp2.html
II. Fácil de usar la base de datos de conexión de la piscina Alibaba druida
Consulte: https://blog.csdn.net/jay100500/article/details/81270298
Véase también mi otro blog, hay Alibaba explicar esta agrupación de conexiones de base de datos.
III. ¿Cómo acceder a los datos a través de JDBC primavera
primavera-jdbc
- núcleo JdbcTemplate y otras interfaces centrales relacionados y clases
- dataSource, la clase auxiliar origen de datos asociado
- objeto, el funcionamiento básico del paquete en blanco JDBC
- apoyo, códigos de error, y otras ayudas.
Notas comunes de frijol:
- @Component (correspondiente a una definición común de la judía)
- @Repository (a operaciones de bases de datos de almacén de cosas relacionadas con bases de datos puede utilizar esta anotación)
- @Servicio
- @Controlador
- @ResController
operaciones sencillas de JDBC
JdbcTemplate
- consulta
- queryForObject (datos individual)
- la queryForList (trozos de datos)
- actualizar
- ejecutar
Cómo utilizar estos métodos en JdbcTemplate?
- (1) paquete jar JDBC introducido, he publicado todo el archivo 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) la información de configuración de conexión en el archivo de configuración
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) un nuevo linkman tabla, ID de conjunto de la clave principal, el incremento automático por defecto
- clase de entidad (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) Capa de 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) Capa de Control
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();
}
}
- interfaz de acceso (7) del navegador
- (8) La aplicación de los resultados:
lote SQL
JdbcTemplate
- batchUpdate
- BatchPreparedStatementSetter
NamedParameterJdbcTemplate
- batchUpdate
- SqlParameterSourceUtils.createBatch
Cómo utilizar un lote?
Seguido el ejemplo anterior, tengo que sentarse y encontrar tanto un método anterior se anota con la inserción ordinaria y tal vez un lote se hace como un ejemplo, el medio ambiente o algo por el estilo.
- (1) lote de clase: 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) la implementación de esta interfaz:
- (3) el efecto de la ejecución