1.声明
最近有人问我用过MyBatis-Plus吗,我果断回答了解过!
但是本人的博客中有一个自定义的分页插件
:SpringBoot整合MyBatis中的技巧(基本的AOP配置以及创建自己的分页拦截器),自己通过debug实现的,因为插件好写(就按照官方的写基本就可以实现了)
但是别人又问到了,于是就去了解写了几个demo,官方地址:MyBatis-plus
结果发现这个东西就是一个半hibernate和半mybatis
,感觉这个东西的立场不坚定啊!
现在通过官方的demo发现这个插件的用处
2.添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>springboot-mybatisplus</groupId>
<artifactId>springboot-mybatisplus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot-mybatisplus</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
<!-- <scope>runtime</scope> -->
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<!-- <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId>
<version>1.1.21</version> </dependency> <dependency> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> -->
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!-- h2database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!-- 默认的模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
</dependencies>
3.准备sql文件和application文件
这里和官方的demo持一致,使用内存h2数据库,并输出sql
4.创建配置类MyBatisPlusConfig
@Configuration
public class MyBatisPlusConfig {
@Bean
SqlSessionFactory sqlSessionFactory(@Autowired DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
factory.setPlugins(paginationInterceptor());
factory.setDataSource(dataSource);
return factory.getObject();
}
PaginationInterceptor paginationInterceptor() {
PaginationInterceptor pagePlugin = new PaginationInterceptor();
pagePlugin.setDialectType("h2");
Properties properties = new Properties();
properties.setProperty("format", "true");
pagePlugin.setProperties(properties);
return pagePlugin;
}
}
我们使用spring默认提供的源
5.创建实体类User和UserMapper
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
// 感觉就像spring data 一样
public interface UserMapper extends BaseMapper<User> {
}
发现这货好像吸收了Springdata中的部分思想,感觉没有SpringData好用!
6.创建Controller层
/**
* @description 用户的增删改查分页等操作
* @author hy
* @date 2020-04-06
*/
@RestController
public class UserController {
@Autowired
UserMapper userMapper;
@RequestMapping("/findAllUser")
public ResponseEntity<?> findAllUser() {
List<User> selectList = userMapper.selectList(new QueryWrapper<User>());
return ResponseEntity.ok(selectList);
}
@RequestMapping("/findUserPage") // 使用分页的时候需要配置分页插件
public ResponseEntity<?> findUserPage(Integer currentPageNo, Integer pageSize) {
Page<User> userPage = new Page<User>(currentPageNo, pageSize);
IPage<User> selectPage = userMapper.selectPage(userPage, null);
System.out.println("总页数" + userPage.getPages());
System.out.println("总记录数" + userPage.getTotal());
System.out.println("总页数" + selectPage.getPages());
System.out.println("总记录数" + selectPage.getTotal());
return ResponseEntity.ok(selectPage);
}
@RequestMapping("/insertUser")
public ResponseEntity<?> insertUser(User user) {
int insert = userMapper.insert(user);
return ResponseEntity.ok("添加用户成功,当前添加的数量为:" + insert);
}
@RequestMapping("/deleteUserById/{id}")
public ResponseEntity<?> deleteUserById(@PathVariable("id") Integer id) {
int deleteById = userMapper.deleteById(id);
return ResponseEntity.ok("删除用户成功,当前删除的条数为:" + deleteById);
}
@RequestMapping("/updateUser")
public ResponseEntity<?> updateUser(User user) {
int updateById = userMapper.updateById(user);
return ResponseEntity.ok("更新用户成功,当前更新的条数为:" + updateById);
}
}
7.创建入口类
/**
* @description 当前的内容用于本人测试和学习mybatis-plus
* @author hy
* @date 2020-04-06
*/
@EnableTransactionManagement
@SpringBootApplication()
@MapperScan("com.hy.springboot.mybatisplus.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
测试:结果成功!
8.评点
本人感觉矛盾的地方
- 第一点,
没有findAll方法,只提供findList,居然可以提供null或者空QueryWrapper
! - 第二点,
我放进去的userPage和返回来的selectPage里面的结果都是一致的
,说明其实就是将放入的Page又返回过来的,这里我觉得应该直接传递一个PageParam只放入两个参数即可,然后返回Page就可以了
,有点多此一举的感觉! - 第三点,这里的QueryWrapper感觉很像
Query.query(Criteria.where("name").is(name)
,感觉和Hibernate以及Spring中提供的templatem模板差不多,但是本人觉得spring提供的template更加好用 - 第四点,当前BasicMapper提供的功能太少了,就几个方法
- 第五点,
这个框架中融入了很多的东西,看起来很杂乱,可能还需要改进
,对于一般的执行单表操作还是可以的
(一般开发过程中,不可能只有单表操作,一般最少几张表或者几十个表查询,所以提供的方法无法实现,最后还是要自己写mapper方法和sql
,这里的BasicMapper就没什么作用了) - 第六点,开发中还是要使用原生的MyBatis才能实现操作,其他的问题暂时还没想到。。。
本人理解的地方
- 由于这是一个以Mybatis为主的东西,所以要
完全实现自动化还是要以hibernate为主
- 这个
只能作为插件使用
,如果认真你就输了,这也是为什么mybatis没有开发其他的插件的原因(sql映射永远是第一位,sql才是最终的目的
)
9.总结
1.MyBatisPlus只能作为简化单个表的操作(本人利用反射一样可以实现),只能作为插件使用,有的时候自己封装一套可能更好
(MyBatisPlus并不是非常好用(至少在实际开发中))
2.MyBatisPlus本身就是对MyBatis的部分扩充,所以如果想要更加理解原理,还是要以MyBatis的源码为主
3.MyBatisPlus并不是那么好用,只能说还可以,比自己写的强一点
4.其实学习任何框架都是这样的,当我们知道原理的时候,自己就可以写出一套自己的插件,和需要的东西(编程就多看多模仿多学习)
,所以学习任何东西的时候,都需要自己本事过硬,了解原理最重要
以上纯属本人见解,如有问题请联系本人!