SpringBoot整合Mybatis
SpringBoot整合Mybatis
1.需求说明/图解
- 将 Spring Boot 和 MyBatis 整合
- 查询出一条数据
2.综合案例
1.代码+配置实现
- 创建数据库和表
CREATE DATABASE `springboot_mybatis` ;
USE `springboot_mybatis` ;
CREATE TABLE `monster` (
`id` INT NOT NULL AUTO_INCREMENT,
`age` INT NOT NULL,
`birthday` DATE DEFAULT NULL,
`email` VARCHAR ( 255 ) DEFAULT NULL,
`gender` CHAR ( 1 ) DEFAULT NULL,
`name` VARCHAR ( 255 ) DEFAULT NULL,
`salary` DOUBLE NOT NULL,
PRIMARY KEY ( `id` )
) CHARSET = utf8;
insert into monster values(null, 20, '2000-11-11', 'nmw@sohu.com', '男', '牛魔王', 5000.88);
insert into monster values(null, 10, '2011-11-11', 'bgj@sohu.com', '女', '白骨精', 8000.88);
SELECT * FROM `monster` ;
2.创建工程名为springboot_mybatis, maven项目- pom.xml 需要引入相关依赖.
<!--导入springboot父工程-规定写法-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.3</version>
</parent>
<!--引入相关的依赖-->
<dependencies>
<!--引入web starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入mybatis starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--引入mysql驱动: 这里使用版本仲裁 8.0.26-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--引入配置处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!--引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入test starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--引入druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
</dependencies>
- 创建 resources/application.yml , 配置数据源参数, 并完成 Spring Boot 项目启动测试
server:
port: 9090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: root
- 切换数据源为 druid , 修改 pom.xml(如果没有 mybatis-stater , 加入即可.) 添加配置文件src\main\java\com\llp\springboot\mybatis\config\DruidDataSourceConfig.java, 完成测试
<!--引入druid依赖,引入druid-spring-boot-starter也是可以的,但这里只想使用配置类的方式所有引入druid依赖就足够了-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
@SpringBootTest
public class ApplicationTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void t1(){
Class<? extends DataSource> aClass = jdbcTemplate.getDataSource().getClass();
System.out.println(aClass);
}
}
5.创建src\main\java\com\llp\springboot\mybatis\bean\Monster.java
@Data
public class Monster {
private Integer id;
private Integer age;
private Date birthday;
private String email;
private String name;
private String gender;
private Double salary;
}
6.创建src\main\java\com\llp\springboot\mybatis\dao\MonsterMapper.java
public interface MonsterMapper {
Monster getMonsterById(@Param("id") Integer id);
}
7.创建src\main\resources\mapper\MonsterMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.llp.springboot.mybatis.dao.MonsterMapper">
<select id="getMonsterById" resultType="Monster">
select * from monster where id = #{id}
</select>
</mapper>
8.配置mybatis
yaml方式配置
#mybatis配置
mybatis:
#指定要扫描的mapper.xml位置; classpath:mapper/*.xml 扫描在类路径下的mapper目录下的。xml文件
mapper-locations: classpath:mapper/*.xml
#配置类型别名,通常指定实体类所在包,这样我们在xml中resultType="com.llp.springboot.mybatis.bean.Monster"就可以简写成Monster
type-aliases-package: com.llp.springboot.mybatis.bean
#配置mybatis sql打印日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#启用自动驼峰配置
map-underscore-to-camel-case: true
#通过config-location可以指定mybatis-config.xml,这样就可以用传统的方式来配置mybatis
#config-location: classpath:mybatis-config.xml
mybatis-config.xml配置文件方式
在springboot中配置mybatis非常快捷,但如果需要配置项目较多的话可以引入传统的mybatis配置文件来进行配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置MyBatis自带的日志输出-查看原生的sql-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--
1. 如果一个包下有很多的类,我们可以直接引入包
2. 这样该包下面的所有类名,可以直接使用
-->
<typeAliases>
<package name="com.llp.springboot.mybatis.bean"/>
</typeAliases>
</configuration>
9.配置mapper接口包扫描的两种方式
方式一,在启动类中配置包扫描
@SpringBootApplication
@MapperScan(basePackages = {"com.llp.springboot.mybatis.dao"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
方式二,在mapper接口中添加@mapper注解
//使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
@Mapper
public interface MonsterMapper {
//方法,根据id返回Monster对象
public Monster getMonsterById(Integer id);
}
@mapper注解和@repository的区别
@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
@Repository注解修饰哪个类,则表明这个类具有对对象进行CRUD(增删改查)的功能,而且@Repository是@Component注解的一个派生品,所以被@Repository注解的类可以自动的被@ComponentScan 通过路径扫描给找到。
10.测试一把
@Autowired
private MonsterMapper monsterMapper;
@Test
public void getMonsterById(){
//Monster(id=1, age=20, birthday=Sat Nov 11 00:00:00 CST 2000, email=nmw@sohu.com, name=牛魔王, gender=男, salary=5000.88)
Monster monster = monsterMapper.getMonsterById(1);
System.out.println(monster);
}
3.注意事项和细节说明
- spring boot 整合 mybatis 取出的日期, 出现 8 小时时差 解决方案 : @JsonFormat(pattern="yyyy-MM-dd HH🇲🇲ss",timezone="GMT+8")
MonsterController
@RestController
public class MonsterController {
@Autowired
private MonsterService monsterService;
@RequestMapping("/getMonster/{id}")
public Monster getMonsterById(@PathVariable("id") Integer id){
return monsterService.getMonsterById(id);
}
}
MonsterServiceImpl
@Service
public class MonsterServiceImpl implements MonsterService {
@Autowired
private MonsterMapper monsterMapper;
@Override
public Monster getMonsterById(Integer id) {
return monsterMapper.getMonsterById(id);
}
}
返回给浏览器的时间是格林威治时间,真实的时间是2000-11-11 00:00:00,这是因为我们属于东八区,相差了八个小时导致的
解决办法:在需要转换时间的类中添加注解 @JsonFormat(pattern = "yyyy-MM-dd HH🇲🇲ss", timezone = "GMT+8")
@Data
public class Monster {
private Integer id;
private Integer age;
//这里通过注解来解决时区问题
//GMT 就是格林尼治标准时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;
private String email;
private String name;
private String gender;
private Double salary;
}