java 设计

一步步放弃mybatis的xml

2019-10-24  本文已影响0人  无醉_1866

Mybatis在工程中的槽点

工程中的mapper文件往往非常大,动则上千行,最近经常听见周围的同学们吐槽难以维护,还不如写Java代码。

最近就在思考这样一个问题,既然mapper文件太那蛋疼,为什么大家还是使用mapper文件呢,为什么不使用mybatis的注解或者使用spring-jdbc提供的JdbcTemplate(有使用JPA的)

结合自己的思考和一些实验,觉得有以下原因:

总结起来其实就一个原因:Java的语法对长一点的字符串太不友好了,很难编写出可读性好的SQL,所以大家还是更愿意写xml来表示sql的对象的映射

不使用xml的方式

如何做到不使用xml呢?其实是有多种选择的,比如mybatis for scala,但是scala语法不熟悉,学习成本太大,实际上如果Java对string有比较好的支持,那写sql会容易得多

虽然Java对String的支持不够友好,但是groovy或者kotlin对string有非常好的支持,可以尝试用groovy或者kotlin加上mybatis的注解来写映射接口,比如kotlin:

image

因为Java是可以和groovy或者kotlin在同一工程中混合使用的,因此使用kotlin或者groovy的方式在Java中是能正常被调用的,有了这种语法糖层面的支持,在代码中写SQL变得容易很多

解决重复SQL的问题

使用注解后,如果需要写多个查询,查询字段需要写多次,例如(本例中省略了ResultMap的使用):

image

这里的select之后的字段名,在多个不同的查询之中都是相同的,如何解决这个问题呢?我们可以使用mybatis插件处理,最后的效果如下:

image

关键在于处理这个@Macro注解,

注解定义如下:

image

插件中需要处理sql,对sql做文本替换,这样我们就能够得到通过注解支持的可利用的sql片断,插件实现如下:

image

对ResultMap的处理

在前面的例子中,映射接口中省略了@Results,加上@Results后完整的注解使用方式应该如下:

image

可以看到,需要在每个查询方法上都加上@Results,如果多个方法上的@Result一模一样,那么重复的注解会被定义多次。

同样,我们可以通过实现mybatis插件方式支持默认的ResultMap,最终效果如下:

image

如果数据库中的字段名与Java中的属性名是标准的下划线与驼峰格式,比如数据库中的create_time对应于java中的createTime,那么可以不写@DefaultResults的results属性,例如:

image

整体代码简洁很多,使用多行字符串语法后如下:

image

未完待续

今天太晚了,后面再继续讲述如何简化动态sql在mapper接口中的编写

上一篇下一篇

猜你喜欢

热点阅读