学习笔记@玩转Spring全家桶
课程内容来自极客时间玩转Spring全家桶,链接如下
https://time.geekbang.org/course/intro/100023501
第六天1/4
通过Mybatis操作数据库
Mybatis
Mybatis同样也是一款优秀的持久层框架,前身是iBatis
Mybatis与JPA最大的区别是SQL需要写(有工具辅助生成)
适用情况
整个数据库的操作比较简单用JPA
因为这样不用去关心SQL与映射相关的东西
如果DBA对SQL与映射有把控的要求,例如说每条SQL都需要审核,添加一些hint这样的东西时,
或者SQL比较复杂,存在join等复杂的关联
就需要选择Mybatis
大厂一般都选择Mybatis
Spring中使用Mybatis
Mybatis Spring Adapter 以及Mybatis-spring-boot-starter
在application.properties文件中的配置
- mybatis.mapper-locations = classpath*:mapper/**/*.xml
- mybatis.type-aliases-package = 类型别名的包名
- mybatis.type-handlers-package = TypeHandler扫描包名
- mybatis.configuration.map-underscore-to-camel-case = true
@MapperScan 配置扫描位置
@Mapper 定义接口
映射的定义—— XML 与注解(两种定义映射的方式,支持混用)
代码及运行结果
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);
}
}
运行输出: