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注解:
重新执行效果一致: