文章目录
一、环境搭建
1、创建springBoot工程
- 创建springboot模块
- 模块名称
- jdk版本,最好是jdk1.8
- java版本,最好是java8
- 打包方式
- springboot版本
- 选择Lombok简化开发
- 选择mysql驱动
2、加入依赖
MyBatisPlus是国人开发的工具,spring官方并没有收录,所以依赖只能单独添加。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
还需要用到数据库连接池,我这里用的是Druid。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
3、配置数据源信息
springboot一般配置文件都是yml格式的,所以一般都将默认的properties格式替换掉。数据库连接池我用Druid,看你习惯喜欢用什么就用什么。当然,Druid是阿里下国产的数据源,性能还是比较优秀的,所以我支持国产。
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus
username: root
password: 1234
4、创建数据库测试表
DROP TABLE IF EXISTS `fruits`;
CREATE TABLE `fruits` (
`f_id` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`s_id` int NOT NULL,
`f_name` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`f_price` decimal(8, 2) NOT NULL,
`quantity` int NULL DEFAULT 1000,
PRIMARY KEY (`f_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
INSERT INTO `fruits` VALUES ('a1', 101, 'apple', 5.20, 1000);
INSERT INTO `fruits` VALUES ('a2', 103, 'apricot', 2.30, 1000);
INSERT INTO `fruits` VALUES ('b1', 101, 'blackberry', 10.20, 1000);
INSERT INTO `fruits` VALUES ('b2', 104, 'berry', 7.60, 1000);
INSERT INTO `fruits` VALUES ('b3', 100, 'peanut', 3.50, 1000);
INSERT INTO `fruits` VALUES ('b5', 107, 'pear', 3.60, 1000);
INSERT INTO `fruits` VALUES ('bs1', 102, 'orange', 11.20, 1000);
INSERT INTO `fruits` VALUES ('bs2', 105, 'melon', 8.20, 1000);
INSERT INTO `fruits` VALUES ('c0', 101, 'plum', 3.20, 1000);
INSERT INTO `fruits` VALUES ('l2', 104, 'lemon', 6.40, 1000);
INSERT INTO `fruits` VALUES ('m1', 106, 'mango', 15.60, 1000);
INSERT INTO `fruits` VALUES ('m2', 105, 'watermelon', 2.60, 1000);
INSERT INTO `fruits` VALUES ('m3', 105, 'cherry', 11.60, 1000);
INSERT INTO `fruits` VALUES ('o2', 103, 'coconut', 9.20, 1000);
INSERT INTO `fruits` VALUES ('t1', 102, 'banana', 10.30, 1000);
INSERT INTO `fruits` VALUES ('t2', 102, 'grape', 5.30, 1000);
INSERT INTO `fruits` VALUES ('t4', 107, 'peanut', 3.60, 1000);
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `user_name`(`user_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
INSERT INTO `user` VALUES (1, '11', '11');
INSERT INTO `user` VALUES (3, '111', '11');
INSERT INTO `user` VALUES (4, 'a', '11');
INSERT INTO `user` VALUES (7, 'aaa', 'aaa');
INSERT INTO `user` VALUES (8, '8', '8');
5、创建实体类
下面用到几个注解,简单解释一下:
@Data
:使用lombok注解自动生成get、set、toString、equals等方法@TableName("fruits")
:该注解用于数据库表与实体类名之间的对应@TableField("s_id")
: MyBatisPlus注解,指明数据库字段与实体类对应关系,若一样通过反射机制自动对应,不需要注解@TableId(value = "id", type = IdType.AUTO)
: MyBatisPlus注解,说明该字段为主键,value对应数据库表字段,type对应主键数据生成类型,默认是雪花算法生成的,修改成AUTO后变成自动增长
//使用lombak注解自动生成get、set、tostring、equals等方法
@Data
public class User {
// MyBatisPlus注解,说明该字段为主键,value对应数据库表字段,type对应主键数据生成类型,
// 默认是雪花算法生成的,修改成AUTO后变成自动增长
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// MyBatisPlus注解,指明数据库字段与实体类对应关系,若一样通过反射机制自动对应,不需要注解
@TableField("user_name")
private String userName;
private String password;
}
@Data
// 该注解用于数据库表与实体类名之间的对应
@TableName("fruits")
public class Fruit {
@TableId(value = "f_id", type = IdType.UUID)
private String fId;
@TableField("s_id")
private Integer sId;
@TableField("f_name")
private String fName;
@TableField("f_price")
private Float fPrice;
private Integer quantity;
}
6、创建mapper接口
这里的mapper就相当于springMVC里面的DAO层,与SpringMVC不同的是,SSM或者SSMP架构在DAO层都不需要实现类,直接定义接口,MyBatisPlus会将接口对应的代理类加载到spring容器。还要注意mapper接口需要加上@Mapper
注解,告诉spring这是mapper映射接口,或者在引导类上面加上注解@MapperScan("com.cx.mybatisplus.mapper")
,直接将mapper包路径扫描。
@Mapper
public interface FruitMapper extends BaseMapper<Fruit> {
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
mapper里面的接口一般不需要自己写那些抽象方法,只需要继承BaseMapper类,并且将泛型传进去,大部分方法都有。可以看到BaseMapper接口里面定义了大部分操作表的方法,如果需要添加其它方法,可以在对应mapper接口里面添加。MyBatisPlus实在MyBatis基础上扩展的,并不会修改MyBatis原有的用法。
7、加上MyBatisPlus日志
在springboot配置文件中加上,以下配置,就可以在控制台上看到执行日志了。
mybatis-plus:
configuration:
#加上日志功能
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
二、测试Mapper部分方法
1、添加
添加用户:
@Test
public void insertUserTest(){
User user = new User();
user.setUserName("cxx");
user.setPassword("1234567");
userMapper.insert(user);
System.out.println("userId="+user.getId());
}
构造的sql语句:
2、删除
- 通过id删除
@Test
public void deleteFruitByIdTest(){
fruitMapper.deleteById("a1");
}
构造的sql语句:
- 通过Map集合删除
@Test
public void deleteFruitByMapTest(){
Map<String,Object> map = new HashMap<>();
map.put("s_id",107);
map.put("f_name","pear");
fruitMapper.deleteByMap(map);
}
构造的sql语句:
- 通过List集合批量删除
@Test
public void deleteFruitByListTest(){
List<String> list = Arrays.asList("b1", "b2", "b3");
fruitMapper.deleteBatchIds(list);
}
构造的sql语句:
3、修改
根据id修改
@Test
public void updateUserById(){
User user = new User();
user.setId(32);
user.setUserName("cxxxx");
user.setPassword("cxxxxxx");
userMapper.updateById(user);
}
4、查询
- 通过id查询
@Test
public void selectFruitById(){
Fruit fruit = fruitMapper.selectById("a2");
System.out.println(fruit);
}
查询结果以及构造的SQL语句:
- 通过list集合批量查询
@Test
public void selectFruitByList(){
List<String> list = Arrays.asList("m1", "m2", "m3");
List<Fruit> fruits = fruitMapper.selectBatchIds(list);
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
}
查询结果以及sql语句:
- 通过map集合查询
@Test
public void selectFruitByMap(){
Map<String,Object> map = new HashMap<>();
map.put("s_id",105);
map.put("quantity",1000);
List<Fruit> fruits = fruitMapper.selectByMap(map);
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
}
查询结果:
- 分页功能
分页插件的配置:
MyBatisPlus实现分页功能必须要配置分页插件,如果不配置,分页查询会没有效果。
配置如下:
@Configuration
@MapperScan("com.cx.mybatisplus.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
实现分页查询:
分页查询要传入两个参数,第一个是一个page对象,第二个是条件构造器。创建Page对象时不要忘了加上查询对象的泛型,然后Current是现在是第几页,Size是每页几条数据。
public void pagesTest01(){
Page<Fruit> page = new Page<>();
page.setCurrent(2);
page.setSize(3);
fruitMapper.selectPage(page,null);
System.out.println(page);
}
查询构造的sql语句,实际上就是分页查询的sql:
三、测试Service方法
1、创建通用service接口以及实现类
MyBatisPlus不仅在DAO提供了简化开发的接口,在service层也有对应的接口以及实现类。首先我们的service接口要继承MyBatisPlus里面的通用的IService接口,注意泛型就是对应的实体类。按照三层构架开发模式,我们有service接口,就需要重写接口里面所有的方法,但是MyBatisPlus连对应要重写的方法都给我们写好了,我们只需要在实现service接口基础上,再继承MyBatisPlus为我们定义的通用service层的实现类ServiceImpl,泛型第一个就是对应mapper接口,第二个就是实体类。
service接口
public interface UserService extends IService<User> {
}
public interface FruitService extends IService<Fruit> {
}
serviceimpl实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
@Service
public class FruitServiceImpl extends ServiceImpl<FruitMapper, Fruit> implements FruitService {
}
Iservice里面的方法:
serviceImpl里面的方法: