概述
随着低代码和敏捷开发的盛行,mybatis和mybatis-plus孕育而生,一般企业都是使用其中之一,不过mybatis-plus越来越多了.
mybatis实践
1.搭建环境
//jar包引入
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
//配置数据源和一些简单的mybatis配置
spring:
datasource:
url: jdbc:mysql://localhost:9100/test
username: root
password: mysql
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:/mapper/*.xml
//扫描mapper
@MapperScan("com.example.springmybatisservice.mapper")
//生成mapper使用mybatis genenator等插件
public interface UserMapper{
List<User> selectByUserId(@Param("userId") Integer userId);
}
2.引入分页插件PageHelper(mybatis没有自带分页功能)
//引入jar 包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.2</version>
</dependency>
//配置插件
@Configuration
public class PageHelperConfig {
@Bean
PageInterceptor pageInterceptor(){
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");
//pageSize=0是否查询全部开关
properties.setProperty("pageSizeZero","true");
//分页参数合理化开关 pageNum<=0 pageNum>最大页数情况
properties.setProperty("reasonable","true");
pageInterceptor.setProperties(properties);
return pageInterceptor;
}
//PageHelper使用实例代码
@Override
public PageInfo<User> list(PageRequest pageRequest) {
//支持和page对象自动映射,方便我们自己定义pageRequest
PageHelper.startPage(pageRequest);
List<User> users = userMapper.selectByUserId(1);
PageInfo<User> pageInfo=new PageInfo<>(users);
return pageInfo;
}
PageHelper覆盖countsql实例代码
<!--pagehelp插件自定义countsql方式-->
<select id="selectByUserId_COUNT" resultType="long">
select count(*) from user where user_id=#{userId}
</select>
}
1.mybatis所有sql都要自己手写,去维护那个mapper,但是至少比使用之前template方便很多
2.PageHelper帮助扩展了分页的功能, 可以帮助你自动分页,使用起来还是很方便的
3.PageHelper会自动生成count(*)语句,如果想优化,那么可以在mapper中的xml加入一个一样的id语句端,以_COUNT结尾 ,返回值为Long的sql语句段即可覆盖自动生成的countsql语句
mybatis-plus实践
1.搭建环境
//引入jar
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
//配置数据源和一些简单的mybatis配置
spring:
datasource:
url: jdbc:mysql://localhost:9100/test
username: root
password: hedl92ddd
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:/mapper/*.xml
//生成mapper ,可以继承BaseMapper
public interface UserMapper extends BaseMapper<User> {
}
//service也有基础service
public interface UserService extends IService<User> {
}
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}
2.引入分页插件(mybatis-plus自带)
//配置分页插件
@Configuration
public class MybatisPlusConfig {
//使用mybatis plus自带分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
//使用实例代码
@Override
public IPage<User> list2(Integer page, Integer pageSize,Integer childrenId) {
IPage<User> pageParam = new Page(1,2);
//一对多关掉countSql,否则会被错误优化掉left join
//((Page)pageParam).setOptimizeCountSql(false);
IPage<User> userIPage = userMapper.selectByUserIdDetail(pageParam, childrenId);
System.out.println(userIPage);
return userIPage;
}
1.mybatis-plus使用了BaseMapper和Iservice使得我们对于单表操作都不用写sql,只有join才需要扩充mapper和xml,更加敏捷高效
2.mybatis-plus自带插件,不需要引入第三方,这个分页插件会帮我们优化countsql,但是一对多情况会误删left join表,对我们查询分页结果会有误导分页参数,当然也可以关闭优化,还有就是自带的分页插件代码耦合度较高, 同时我们工作中优化countsql情况比较多,不能很方便我们重写countsql, 所以还是建议使用pagehelper
总结
从上面看来,最优组合是mybatis-plus+pageHelper, 这样开发过程中不需要写单表语句,同时pageHelper自动帮我们分页,分页效果不错,还留有countsql给我们进行扩展重写.