Con mybatis compañía para integrar nuestras herramientas de manera que no tenemos que ir como antes Estamos aquí para configurar la fuente de datos sólo puede basarse en la introducción de:
primero creamos una base de datos simple
create database springbootmapper;
CREATE TABLE `user` (
`id` int(16) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`age` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
Casualmente insertar unos datos:
Estructura del proyecto
En la introducción se basan crear trabajos →
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cs</groupId>
<artifactId>springBoot_Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-base</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-core</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-extra</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring</artifactId>
<version>1.1.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Crear un perfil:
application.yml
server:
port: 8333 #端口号
mybatis:
type-aliases-package: com.cs.dto.UserDto #对应的实体类
configuration:
map-underscore-to-camel-case: true
mapper-locations: mappers/*.xml #如果还想用之前的mapper.xml写sql语句也可以放在这里
spring:
application:
name: myTest
datasource: #数据源
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springbootmapper?characterEncoding=utf8&useSSL=false
username: root
password: root
Crear una tabla de base de datos de clase de entidad correspondiente a la (mapeo objeto-relacional el ORM)
UserDTO .java
package com.cs.demo.dto;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Id;
import javax.persistence.Table;
@Data //lombok注解 自动有 get set 方法
@Table(name = "user") //配置表名
public class UserDto {
@Id //设置主键
@KeySql(useGeneratedKeys = true) //允许JDBC支持自动生成主键
private Integer id;
private String name;
private Integer age;
}
Crear una capa de persistencia (capa de base de datos) que usamos aquí es la clase abstracta mybatis nos proporcionó, que viene con las operaciones de la cuajada (referido como el Mapper universal)
MyMapper .java
package com.cs.demo.mapper;
import com.cs.demo.dto.UserDto;
import tk.mybatis.mapper.common.Mapper;
public interface MyMapper extends Mapper<UserDto> {
}
Crear una capa de transacción
MyService .java
package com.cs.demo.service;
import com.cs.demo.dto.UserDto;
import com.cs.demo.mapper.MyMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component //注入到spring 容器里
public class MyService {
@Autowired //从spring容器实例化对象
private MyMapper myMapper;
public List<UserDto> findAll() {
List<UserDto> userDtos = myMapper.selectAll();
return userDtos;
}
}
Crear una capa de presentación:
myController .java
package com.cs.demo.controller;
import com.cs.demo.dto.UserDto;
import com.cs.demo.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping("findAll")
public List<UserDto> findAll(){
List<UserDto> all = myService.findAll();
return all;
}
}
Crear lanzador:
package com.cs;
import tk.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.cs.demo.mapper") //扫描我们的只定义mapper
public class SpringBootMybatis {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatis.class,args);
}
}
Los resultados:
se puede ver el éxito de nuestras operaciones.
Entonces, su principio de qué se trata, vamos a ver antes de sacar mybatis operación
que a través del modelo de fábrica creado un sqlSession, agente proxy entonces nuestra dinámica de nuestro objeto de conexión a través sqlSession, que es nuestro enfoque para consultar una base de datos, análisis dinámico archivo XML, se conformó una sentencia de SQL dinámico, y luego enviar a mysql instrucción SQL por el protocolo JDBC, con el fin de evitar que el problema aquí la inyección de SQL, mybatis el SQL enviada dos veces, la primera vez: enviar toda la declaración, tales como seleccionar * de usuario donde id = segundos:?. valora en 1 identificador para enviar SQL, MySQL, finalmente, regresó a los resultados de back-end.
Mybatis su resorte integrado es el mismo pero que está por delante de la ya difícil para nosotros para participar en SQL ingeniería inversa realizaron una herramientas unificadas, a continuación, sólo tenemos que llamar a sus herramientas pueden ser.
cache
Antes de que tanto necesitamos para establecer la configuración de caché
- Una caché: una memoria caché local basada PerpetualCache HashMap, que almacena un ámbito de sesión, la sesión después de la descarga o cerrar, todo el caché se borrará en la sesión.
- Y una cache secundaria que almacena en caché el mismo mecanismo, pero también usando predeterminado PerpetualCache, HashMap almacena, se almacena en un ámbito diferente como Mapper (Espacio de nombres), y pueden ser fuente de almacenamiento personalizada, como Ehcache. Ámbito de namespance se refiere a la totalidad de la seleccione el archivo de configuración correspondiente resultado de la operación namespance se almacenan en caché, la memoria caché puede ser compartida entre tales dos hilos diferentes. Comience caché secundario: En asignador fichero de configuración:
Puede configurar la caché de caché secundaria la política objeto devuelto: Cuando readOnly = "true", representa el caché secundario para volver
de nuevo a todos los que llamen la misma instancia de objeto de caché, caché instancia la persona que llama puede obtener la actualización, pero esto puede causar otros usuarios que aparecen varios
casos de datos inconsistentes (ya que todos la persona que llama llamada es la misma instancia). Cuando readOnly = "true", se devuelve a la persona que llama de la memoria intermedia cache secundaria total de
objeto de almacenamiento de copia, es decir, diferente persona que llama se adquiere diferentes instancias de objetos de caché, modificaciones a la persona que llama de forma que cada objeto en caché no afectará a la otra
persona que llama, que es seguro, por lo que el valor predeterminado es de sólo lectura = "false";
El diagrama esquemático (propia pintura)
- caché de nivel se basa caché sqlSession, contenido de la caché no puede abarcar sqlSession. Mantenido automáticamente por mybatis. área de memoria intermedia entre los diferentes SqlSession no se ve afectada por la otra.
- caché secundario basado en archivo de asignación de memoria caché (espacio de nombres), es mayor que el rango de caché La memoria caché, el contenido se puede acceder a diferentes sqlSession caché secundaria. ¿Qué datos en la caché secundaria necesita su propio designado. (Común, no suelen modificados, tales como: clasificación, departamento)
- Debemos mybatis primero abrir manualmente la caché L2.
cache secundaria proporciona en el config.xml interruptor, abierto también en la caché secundario específico mapper.xml
. 1.
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
2. La necesidad de la clase javapojo mapa para lograr la serialización (esta es nuestra generación a través de la ingeniería inversa antes de la clase auxiliar)
class User implements Serializable{}
3.
Acerca de los atributos de caché:
desalojo: representa la estrategia de recuperación de la memoria caché, MyBatis actualmente ofrece las siguientes estrategias.
(1) LRU (menos recientemente utilizado), el menos usado recientemente, la mayoría de los objetos no tienen tiempo
(2) FIFO (First In First Out), FIFO, los objetos en el orden en que entró eliminado la memoria caché
(3) SUAVE, las referencias suaves, el recolector de basura quitar el objeto basado en las reglas de estado y referencias suaves
(4) débil, referencias débiles, la mudanza mucho más agresiva de objetos basados en el estado recolector de basura y reglas de referencias débiles. Aquí es LRU,
eliminar sin usar la imagen de mayor tiempo para
flushInterval: Tiempo de intervalo de actualización, en milisegundos, la configuración aquí es de 100 segundos para actualizar, si no la configura, entonces cuando
se ejecuta el SQL tiempo para actualizar la caché.
Tamaño: el número de referencias, un número entero positivo que representa el número máximo de objetos almacenados en caché puede ser almacenada, no debe ser demasiado alto. Que se distribuyen en la Asamblea General de provocar un desbordamiento de memoria.
Aquí está el 1024 objetos de configuración
readOnly: de sólo lectura, lo que significa que los datos en caché sólo se pueden leer pero no modificar, las ventajas de esta configuración es que podemos leer rápidamente caché, la desventaja es que no tenemos
manera de cambiar la caché, el valor por defecto que de es falso, no nos permiten modificar
proceso de operación:
consulta la información de usuario ID sqlsession1 es 1, entonces la consulta, la consulta a los datos almacenados en la cache secundaria.
Si sqlsession3 para realizar la misma asignador de SQL, comprometer la ejecución, se borran los datos del área de caché secundaria en el mapeador
sqlsession2 para consultar la información de identificación del usuario es 1, el caché para buscar si existe una caché, si hay que tomar los datos directamente desde la memoria caché
Desactivar caché secundaria:
Puede ser proporcionada en la declaración useCache = false, el caché secundario desactivar la instrucción de selección actual está por defecto
En el desarrollo real, para cada consulta requiere el SQL de datos, para establecer useCache = "false", desactivar la memoria caché secundaria
flushCache Etiquetas: vaciar la caché (para borrar la caché)
Después de realizar la operación de confirmación generalmente necesita vaciar la caché, flushCache = "true indica actualización de caché para evitar sucia lee
escenarios de caché secundarias
Para el acceso a la solicitud de consulta múltiple y los resultados de la consulta a los usuarios menos exigentes en tiempo real, puede ser mybatis caché secundaria, lo que reduce la cantidad de acceso a base de datos, un acceso más rápido, tales como una investigación factura telefónica
Los requisitos establecidos flushInterval correspondiente: intervalo de actualización, tal como treinta minutos, 24 horas y así sucesivamente. . .
limitaciones caché secundaria:
mybatis secundaria caché de datos de caché de nivel de grano fino de la aplicación no es bueno, tales como los siguientes requisitos: información sobre el caché de bienes, ya que la gran información de acceso de consulta de los bienes, sino que requiere el usuario para consultar cada vez que la última información del producto en este momento si utilizar mybatis caché secundaria no sólo se puede lograr vuelca la información de la caché de la mercancía cuando un producto cambia sin actualizar la información de otras materias primas, debido a que los mybaits área de caché secundaria a unidades asignador de división, cuando una información de la mercancía va a cambiar todo toda información sobre productos caché de datos vacía. La necesidad de resolver este tipo de problemas en la capa de negocio de acuerdo a las necesidades de datos de la caché dirigidos.
Entonces, ¿cómo se configura la caché secundaria en nuestro mybatis SpringBoot integración
Configuración mybatis
- # El asignador mundial para activar o desactivar la caché.
mybatis.configuration.cache habilitado = true - # A nivel mundial activar o desactivar la carga diferida. Cuando se desactiva, todas las asociaciones serán cargados con impaciencia.
mybatis.configuration.lazy de carga habilitados = true - # Cuando está activado, hay un retraso de cargar las propiedades del objeto estará totalmente cargado cuando cualquier propiedad se llama. De lo contrario, cada propiedad se cargará en la demanda.
mybatis.configuration.aggressive-lazy-loading = true - # SQL devuelve si se permite una sola pluralidad de conjuntos de datos (dependiendo de la compatibilidad de la unidad) por defecto: en TRUE
mybatis.configuration.multiple-conjuntos de resultados a =-verdaderos Habilitado - Puede # alias (dependiendo de la compatibilidad de la unidad) predeterminado de la columna: a verdadero
mybatis.configuration.use true-columna-label = - # JDBC permite generar claves primarias. Que necesita para impulsar el apoyo. Si se establece en un verdadero, esta configuración se verá obligado a utilizar para generar la clave principal, hay algunos conductores no son compatibles, pero todavía se puede llevar a cabo. por defecto: a falsas
mybatis.configuration.use-Generated-Claves para verdaderos = - MyBatis # Especificar la forma de asignar automáticamente las columnas de tabla de base de datos NINGUNO: ningún indicio \ u3000PARTIAL: Parte completo: Todas las
mybatis.configuration.auto-mapeo-comportamiento parcial = - # Este es el tipo de ejecución por defecto (SIMPLE: Simple; REUTILIZAR: actuador puede reutilizar declaraciones declaraciones preparadas; BATCH: El actuador puede repetir las declaraciones y actualizaciones por lotes)
mybatis.configuration.default-ejecutor de la = de tipo simple de - # Uso joroba campo conversión nomenclatura.
mybatis.configuration.map-subrayado-a-camello caso = true - # Establecer el local de la sesión gama caché: los datos serán compartidos comunicado: Gama de declaración (esto no habría compartido de datos) defalut: la sesión
mybatis.configuration.local-Cache-alcance la reunión = - # Establecer el tipo JDBC, pero está vacía, algunos conductores al valor especificado, por defecto: Otro, no es necesario especificar el tipo al insertar valores nulos
mybatis.configuration.jdbc-tipo-de-null = nula - # Si el campo de datos está vacía, se omite el campo de visualización, añadiendo el archivo de configuración, la consulta de datos especificada está vacía o nula.
mybatis.configuration.call-set-on-nulos = verdadero
A continuación, sólo tenemos que añadir como un pasaje
mybatis:
type-aliases-package: com.cs.dto.UserDto #对应的实体类
configuration:
map-underscore-to-camel-case: true
cache-enabled: true #开启二级缓存
mapper-locations: mappers/*.xml #如果还想用之前的mapper.xml写sql语句也可以放在这里