本文基于 springboot 整合 mybatisPlus 的各种文章早已烂大街的背景下,根据 整合过程,MP开发中的常见技巧,MP开发中遇到的各种坑 三个方面,来对这一专题做一个全面且实用的总结,基本上只要你吃透这篇文章,开发中关于mybatisplus
你能遇到的问题都能迎刃而解了。
网上对于springboot 整合 mybatisPlus的文章有很多,但是大多不够全面,有点人云亦云之感,现在对整合过程拆成 2 个步骤:基本配置,快速入门。
基本配置的第一步是根据现在流行的MP版本,把依赖的代码贴到pom.xml中。 我使用的是3.5.1
的版本
com.baomidou
mybatis-plus-boot-starter
3.5.1
这一步就引入了mybatisplus的框架,且因为是pringboot项目,就会自动配置。
第二步,是配置Mybatisplus,虽然大部分以及自动配置了,但是为了符合实际开发需要,有些配置需要单独写在application.yml中。
比如,我们会选择打印日志:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
该配置的作用是打印mybatis的SQL,包含参数,这个在我们调试程序的时候很有用。
很多人看到这里会问,不是还有个 mapperLocation 吗?
回答:那个其实可以不用配置。
就是mapper接口和对应xml,只要在classpath下的同一个目录即可,我们一般可以把xml和接口放在一个包,也可以在resource资源路径新建一模一样的包,专门放xml文件。
当然,别忘了还有数据源配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
如果你要用druid,还需要额外配置druid,druid就是多一些sql监控,不过一般不用也没关系,我这里就没用。
这个datasource是在spring配置下的。
到这一步,基本配置就完毕了。
这一步做一个快速入门案例,就是建一张表,然后做一个crud。
建表:
DROP TABLE IF EXISTS `device_info`;
CREATE TABLE `device_info` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '设备编号',
`device_name` varchar(30) NOT NULL COMMENT '设备名称',
`device_identification` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '设备标识码',
`device_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '设备ID',
`status` int NOT NULL DEFAULT '1' COMMENT '设备状态(0在线,1离线,2未知)',
`create_date` date NOT NULL COMMENT '设备创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='设备基本信息表';
来一些测试数据:
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (1, 'crA7', 'cB', '3Jc', 1, '2022-06-22 15:08:57');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (2, 'TQ', 'fEq', 'ThF8N', 1, '2022-05-11 06:29:33');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (3, 'ga', '0e22P', 'P6lM', 1, '2022-11-08 17:24:10');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (4, '8tI', 'zkl', 'X9', 1, '2022-04-10 19:30:19');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (5, 'axO', 'POdTe', 'YTj2', 1, '2022-09-05 02:51:59');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (6, 'hnnR5', '8X', 'x3w8', 1, '2022-05-20 10:11:23');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (7, 'ft', 'tg', 'WYaZ', 1, '2022-09-20 06:43:57');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (8, 'tyz', 'pza', 'nyR', 1, '2022-12-28 17:32:05');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (9, 'Sg', 'yczdk', 'Hex', 1, '2022-03-01 03:40:12');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (10, 'w51j', 'rafe', 'IfBEH', 1, '2022-05-15 12:17:52');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (11, '4V5m3', 'Qm', 'ik', 1, '2022-07-05 07:34:23');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (12, 'rRkh', 'XvldF', 'Tzp', 1, '2022-10-07 15:11:39');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (13, '9p', 'kE', 'DOut', 1, '2022-08-23 12:12:45');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (14, 'P2', 'dlOIV', 'LG', 1, '2022-02-12 23:42:42');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (15, 'XmW', 'm2F', 'vWc', 1, '2022-06-03 17:55:11');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (16, 'oVCMD', 'dx', 'U4xoM', 1, '2022-03-24 08:35:09');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (17, 'z2e', 'OKeL', '8AO', 1, '2022-03-06 04:27:46');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (18, 'tHF', 'YxyCt', 'uTq', 1, '2022-04-22 12:31:03');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (19, '5Al91', 'uR', 'mBf6j', 1, '2022-10-11 08:26:02');
insert into `device_info` (`id`, `device_name`, `device_identification`, `device_id`, `status`, `create_date`) values (20, 'npRWi', '3jNF7', 'kN', 1, '2022-02-21 11:29:50');
检查是否是否插入正确。
编写实体类:
@Data
@TableName("device_info")
public class Device {
@TableId(type = IdType.AUTO)
private Long id;
@TableField
private String deviceName;
@TableField
private String deviceIdentification;
@TableField
private String deviceId;
@TableField
private Integer status;
@TableField
private Date createDate;
}
创建一个mapper包:
编写Mapper:
public interface DeviceMapper extends BaseMapper {
}
编写Service
public interface DeviceService extends IService {
}
编写ServieImpl(实现类)
一般我们就在service包下新建一个impl包
DeviceServiceImpl
@Service
@Slf4j
public class DeviceServiceImpl extends ServiceImpl implements DeviceService {
}
最后是controller,编写DeviceController
@RestController
@RequestMapping("/v1/device")
public class DeviceController {
@Resource
private DeviceService deviceService;
@GetMapping("/list")
public List list(){
return deviceService.list();
}
}
就添加一个查询全部设备的方法。
启动,发现报错了: No qualifying bean of type 'com.it.demo.mapper.DeviceMapper' available: expected at least 1 bean which qualifies as autowire candidate
意思是DeviceMapper无法注入,这个问题是因为springboot没有扫描到这个mapper。
解决方案1:给 DeviceMapper 添加@Mapper
解决方案2:在启动类配置扫描路径 @MapperScan("com.it.demo.mapper")
我这边选择的是方案2:
@SpringBootApplication
@MapperScan("com.it.demo.mapper")
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
启动again,这次没报错了,访问: http://localhost:8080/v1/device/list
数据成功返回了,至此快速入门结束。