SpringBoot整合MyBatis笔记

事情是这样的,JPA这玩意是用起来简单但是用了一年多不会写SQL了。遂打算在新项目里偷偷用一下MyBatis,直到发现我们的平台框架不允许这么玩。将查到的东西记录下来,下次用时可以参考。

依赖

使用的第一步就是找依赖。
MyBatis官方提供了集成SpringBoot的starter;使用MyBatis时为了减少分页带来不便,也会用到pagehelper数据库中用到了datetime类型,为了使用java8的新日期和时间类,再引入一个typehandler相关的包。如下:

<!-- mybatis starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!-- page helper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.11</version>
        </dependency>
        <!-- type handler -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-typehandlers-jsr310</artifactId>
            <version>1.0.2</version>
        </dependency>
复制代码

版本上,由于某些原因只能使用springboot2.0.x,因此starter的版本是2.0.1。另外两个依赖的版本则选用了最新的。

用法

引入了依赖之后就可以啪啪啪写代码了。

先来一套民工三连:新建entity、dao、service、controller、config几个包。
SpringBoot广泛使用之后,非常流行注解式写法。所以就不再resources目录下写mapper了,先在启动类加注解 @MapperScan("xx.xx.dao")
,或者在dao层的每个map上写 @Mapper

sql

接着在dao包里写XxxMapper接口,普通sql可以使用 @Select``@Insert``@Update``@Delete
等注解,详细描述查看 官方文档
。动态sql使用 @InsertProvider``@UpdateProvider``@DeleteProvider``@SelectProvider
注解:

// type写类名,method写方法名
@SelectProvider(type = ParkingDynamicSqlProvider.class, method = "findAllSql")
复制代码

例如:

public class ParkingDynamicSqlProvider  {

    public String findAllSql(final Integer projectId, final String name, final Integer parent, final String sort) {
        return new SQL() {{
            SELECT("p.id, p.name, p.total_space_num, p.fixed_space_num, p.temporary_space_num, p.reserved_space_num, p.parent, p.project_id");
            FROM("pm_parking p");
            WHERE("project_id = #{projectId}");
            if (name != null) {
                WHERE("p.name = #{name}");
            }
            if (parent != null) {
                WHERE("p.parent = #{parent}");
            }
            ORDER_BY(sort);
        }}.toString();
    }
}
复制代码

结果的映射使用@Results注解,将数据库里的列名与entity变量名对应起来。

@Results({
            @Result(property = "totalSpaceNum", column = "total_space_num")
    })
复制代码

分页

由于某些原因我这边接口限制分页时前端请求使用start(起始主键id)、limit(行数),响应时后端返回total(查询总数)和结果列表。因此分页插件我只关注了RowBounds(PageRowBounds),其它分页方式都是页码+limit。

dao层分页查询方法的sql按照不分页的方式写,只需要在方法参数里带上PageRowBounds,然后service层调用的时候传入PageRowBounds实例(设置offset、limit、count=true),就可以使用分页功能了。

PageHelper 官方使用文档

类型处理

加了typehandler依赖之后,mysql的datetime可以直接对应java8的LocalDateTime,在entity里直接写就可以了 private LocalDateTime createDatetime;

原文 

https://juejin.im/post/5ea6c3dae51d454db20f2c51

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » SpringBoot整合MyBatis笔记

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址