spring boot 五:SpringBoot整合mybatis

1 依赖配置

org.springframework.bootspring-boot-starter-parent2.5.4 org.springframework.boot spring-boot-starter-web  org.projectlombok lombok 1.18.22  org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2  mysqlmysql-connector-javaruntimeorg.springframework.bootspring-boot-configuration-processortrue

找到mybatis-spring-boot-starter配置的依赖,即autotoconfigure包,SpringBoot的自动配置,会找到META-INF下的spring.factories,找到EnableAutoConfiguration对应的类:


可知自动配置类为MybatisAutoConfiguration:


查看配置绑定类MybatisProperties,可知yml中前缀配置为mybatis:

可知,mybatis前缀的yml配置,可以配置属性,比如:configLocation、mapperLocations、typeAliasesPackage等等。

mybatis下,又具有@NestedConfigurationProperty成员变量,故而前缀是mybatis.configuration,其中具有如下属性:

其中有非常熟悉的属性:mapUnderscoreToCamelCase,也就是数据库字段下划线转驼峰的配置。

然后,数据源有如下配置:

数据源的配置绑定是DataSourceProperties:

可知,数据源在yml中以spring.datasource为前缀,可配置连接数据源的driverClassName、url、username、password等参数。

2 使用

2.1 SpringBoot配置整合mybatis:

建表:

实体类(mybatis本质上将数据库表的数据和实体类对应,就是依靠的getter和setter,所以@Data是必须有的):

package com.xiaoxu.boot.dto;import lombok.Data;import java.util.Date;/** * @author xiaoxu * @date 2022-03-08 * spring_boot:com.xiaoxu.boot.dto.PeopleDTO */@Datapublic class PeopleDTO {// 人的id编号long id;// 人的名字String myName;// 年龄int myAge;// 出生日期Date birthday;}

新建Mapper接口:

注意mapper接口必须要有@Mapper注解:

package com.xiaoxu.boot.mapper;import com.xiaoxu.boot.dto.PeopleDTO;import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapperpublic interface PeopleMapper {List queryPeopleByAge(int age);}

在resources目录下准备mybatis的配置文件,以及Mapper文件:

mybatis-config.xml:

select * from my_people where my_age = #{age}

在application.yml中配置如下:

spring:datasource:username: rootpassword: ******url: jdbc:mysql://localhost:3306/xiaoxu?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Driver#mybatis的相关配置mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xml##mybatis配置文件#config-location: classpath:mybatis-config.xml#config-location和configuration不能同时存在#开启驼峰命名configuration:map-underscore-to-camel-case: true

插入测试数据:

service层实现:

package com.xiaoxu.service;import com.xiaoxu.boot.dto.PeopleDTO;import com.xiaoxu.boot.mapper.PeopleMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * @author xiaoxu * @date 2022-03-08 * spring_boot:com.xiaoxu.service.PeopleService */@Servicepublic class PeopleService {@AutowiredPeopleMapper peopleMapper;public List getPeoples(int Age){return peopleMapper.queryPeopleByAge(Age);}}

controller层实现:

package com.xiaoxu.boot.controller;import com.xiaoxu.boot.dto.PeopleDTO;import com.xiaoxu.service.PeopleService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import java.util.List;/** * @author xiaoxu * @date 2022-03-08 * spring_boot:com.xiaoxu.boot.controller.PeopleController */@RestControllerpublic class PeopleController {@AutowiredPeopleService peopleService;@GetMapping("/people")public List queryPeople(@RequestParam(value = "ag") int age){return peopleService.getPeoples(age);}}

执行结果无误:

2.2 SpringBoot注解整合mybatis:

修改Mapper接口文件:

package com.xiaoxu.boot.mapper;import com.xiaoxu.boot.dto.PeopleDTO;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Select;import java.util.List;@Mapperpublic interface PeopleMapper {List queryPeopleByAge(int age);@Select("select * from my_people")List queryAllPeople();}

修改服务层:

package com.xiaoxu.service;import com.xiaoxu.boot.dto.PeopleDTO;import com.xiaoxu.boot.mapper.PeopleMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * @author xiaoxu * @date 2022-03-08 * spring_boot:com.xiaoxu.service.PeopleService */@Servicepublic class PeopleService {@AutowiredPeopleMapper peopleMapper;public List getPeoples(int Age){return peopleMapper.queryPeopleByAge(Age);}public List getAllPeople(){return peopleMapper.queryAllPeople();}}

增加controller:

package com.xiaoxu.boot.controller;import com.xiaoxu.boot.dto.PeopleDTO;import com.xiaoxu.service.PeopleService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import java.util.List;/** * @author xiaoxu * @date 2022-03-08 * spring_boot:com.xiaoxu.boot.controller.PeopleController */@RestControllerpublic class PeopleController {@AutowiredPeopleService peopleService;@GetMapping("/people")public List queryPeople(@RequestParam(value = "ag") int age){return peopleService.getPeoples(age);}@GetMapping("/allPeople")public List queryAllPeople(){return peopleService.getAllPeople();}}

结果返回无误:

2.3 在配置类上增加@MapperScan注解,扫描某个包下的全部Mapper文件:

如果每个Mapper接口文件上增加@Mapper比较麻烦,那么可以在配置类,如主程序类上,增加@MapperScan注解,以及扫描路径,效果和@Mapper一致:


主程序类增加@MapperScan注解:

重新执行效果一致: