Notas de estudio @ 玩转 Spring 全家 斗
El contenido del curso proviene del tiempo geek jugando Spring Family Bucket, el enlace es el siguiente
https://time.geekbang.org/course/intro/100023501
Sexto día 1/4
Opere la base de datos a través de Mybatis
Mybatis
Mybatis también es un excelente framework de capas de persistencia. El predecesor es iBatis. La
mayor diferencia entre Mybatis y JPA es que SQL necesita ser escrito (generación asistida por herramientas)
Situación aplicable
La operación de toda la base de datos es relativamente simple de usar JPA
porque no necesita preocuparse por SQL y cosas relacionadas con el mapeo.
Si el DBA tiene requisitos de control para SQL y mapeo, por ejemplo, cada SQL debe ser auditado, se agregan algunas sugerencias
o el SQL es más complicado y existen asociaciones complejas como uniones,
debe elegir Mybatis
Las grandes fábricas generalmente eligen Mybatis
Utilice Mybatis en primavera
Adaptador de resorte Mybatis 以及 Mybatis-spring-boot-starter
Configuración en el archivo application.properties
- mybatis.mapper-locations = classpath *: mapper / ** / *. xml
- mybatis.type-aliases-package = nombre del paquete de tipo alias
- mybatis.type-handlers-package = Nombre del paquete de escaneo TypeHandler
- mybatis.configuration.map-underscore-to-camel-case = true
@MapperScan Configurar la ubicación de escaneo
@Mapper Definir la interfaz
Definición de mapeo-XML y anotaciones (dos formas de definir mapeo, soporte mixto)
Código y ejecución de resultados
CoffeeMapper
package geektime.spring.data.mybatisdemo.mapper;
import geektime.spring.data.mybatisdemo.model.Coffee;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface CoffeeMapper {
@Insert("insert into t_coffee (name, price, create_time, update_time)"
+ "values (#{name}, #{price}, now(), now())")
@Options(useGeneratedKeys = true)
int save(Coffee coffee);
@Select("select * from t_coffee where id = #{id}")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
// map-underscore-to-camel-case = true 可以实现一样的效果
// @Result(column = "update_time", property = "updateTime"),
})
Coffee findById(@Param("id") Long id);
}
MybatisDemoApplication
package geektime.spring.data.mybatisdemo;
import geektime.spring.data.mybatisdemo.mapper.CoffeeMapper;
import geektime.spring.data.mybatisdemo.model.Coffee;
import lombok.extern.slf4j.Slf4j;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@Slf4j
@MapperScan("geektime.spring.data.mybatisdemo.mapper")
public class MybatisDemoApplication implements ApplicationRunner {
@Autowired
private CoffeeMapper coffeeMapper;
public static void main(String[] args) {
SpringApplication.run(MybatisDemoApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
Coffee c = Coffee.builder().name("espresso")
.price(Money.of(CurrencyUnit.of("CNY"), 20.0)).build();
int count = coffeeMapper.save(c);
log.info("Save {} Coffee: {}", count, c);
c = Coffee.builder().name("latte")
.price(Money.of(CurrencyUnit.of("CNY"), 25.0)).build();
count = coffeeMapper.save(c);
log.info("Save {} Coffee: {}", count, c);
c = coffeeMapper.findById(c.getId());
log.info("Find Coffee: {}", c);
}
}
Ejecutar salida: