团队使用Mybatis作为数据库访问框架。不同于Hibernate这种采用经典面向对象思想设计的ORM框架,Mybatis是面向过程的,它只做了过程到SQL语句的映射。两者的性能在绝大多数场景下是差不多的,因此理论上可以互相替代使用。由于Mybatis可以直接控制底层SQL,因此对于码农来说,学习成本更低、优化起来更容易;不过也带来了首次配置繁琐、样板代码较多等缺点。
比如是对于单表的、简单的查询,为了符合JavaWeb网络开发模型的Web、Service、Dao的三层模型,不得不在Dao层、Service接口、Service实现类中添加功能几乎重复的代码,所做的也不过是透传,这里就存在可以优化的点。
本文的目的是优化工具链支持,减少手动开发Mybatis样板代码的时间。
- 通过
Intillij Idea
插件更优雅地生成DAO Mapper
和XML Statement
的样板代码 - 通过Mybatis插件不污染
XML Statement
地实现优雅分页。
Mybatis分页插件:Mybatis PageHelper
实现原理基于Mybatis的QueryInterceptor
机制,能动态拦截sql语句并根据对应的数据库类型加上分页语句。无需修改底层的SQL。
-
使用步骤
- 引入Maven依赖,在mybatis或spring的配置xml中进行配置。
- 在
DAO Mapper
方法中增加入参@Param("pageNum") int pageNum, @Param("pageSize") int pageSize
即可。
> 插件还有多种调用方法。[Mybatis-PageHelper][Mybatis-PageHelper]
Mybatis代码生成插件
Fin. 总结
- 插件生成样板代码的方式大致有三种:根据数据库连接、根据POJO、根据建表sql,用户根据实际情况选择。
- MyBatisCodeHelper提供了声明式的Statement开发方法,在编写自定义Dao方法时可省去部分对应SQL的编写时间。
- MyBatisCodeHelper、Mybatis Plugin提供XML语法提示、自动补全、错误提示、导航功能。
1. MyBatisCodeHelper
-
代码生成流程
- 在IDE中开发持久化对象(
POJO
) - 在可视化界面配置表名、主键、类型、索引、默认值、注释等,自动生成建表SQL语句、
DAO Mapper
、Mapper XML
- 在IDE中开发持久化对象(
> 默认生成的DAO中包含了`insert`、`insertSelective`、`insertList`、`update`方法
> `POJO`示例和DAO Mapper示例
```java
public class UserPO {
private Integer id;
private String name;
private String age;
private Date addTime;
private Date updateTime;
private Boolean isDelete;
//getter/setter
}
```
```java
int insert(@Param("userPO") UserPO userPO);
int insertSelective(@Param("userPO") UserPO userPO);
int insertList(@Param("userPOs") List<UserPO> userPOs);
int update(@Param("userPO") UserPO userPO);
```
> 可视化UI ![clipboard.png](/img/bVUk7g)
-
其他功能
- 根据DAO方法名推断生成
XML Statement
的实现
- 根据DAO方法名推断生成
> `Spring Data Jpa`(基于`Hibernate`)提供了一种类SQL的**声明式的开发方法**,能根据符合特定规则的接口方法名在运行时自动生成字节码。该插件提供了类似的功能,根据接口的方法名推断含义,然后在`Mapper XML`中直接生成对应的SQL。比如`findByStartDateBetween`方法会被翻译成这样的SQL`… where x.startDate between ?1 and ?2`。
> 具体的推断规则可以参考`Spring Data Jpa`文档,也可以见脚注:方法名推断之约束条件[^方法名推断之约束条件],方法名推断之比较符[^方法名推断之比较符]。
2. Codehelper.generater
-
代码生成流程
- 在IDE中开发持久化对象(
POJO
) - 在配置文件中设置路径(或者使用默认配置),自动生成建表SQL语句、
DAO Mapper
、Mapper XML
- 在IDE中开发持久化对象(
-
其他功能
- 代码补全(AutoCoding Mode)。按AutoCoding键一次会生成Java Bean的所有Setter方法。按AutoCoding键两次则会为
Setter
方法生成默认值。对于字段很多的POJO
,可以防止批量的Set操作漏掉某些字段。
- 代码补全(AutoCoding Mode)。按AutoCoding键一次会生成Java Bean的所有Setter方法。按AutoCoding键两次则会为
3. Mybatis Plugin
-
代码生成流程
- 配置数据库
- 配置样板代码生成路径
- 生成样板代码(
POJO
、DAO Mapper
、Mapper XML
)
-
其他功能
-
Xml Statement
和对应方法导航,ResultMap
和对应POJO
导航 -
DAO Mapper
、Xml代码提示和补全 - 代码检查及XML语法错误提示
- 集成了
Mybatis Generater
,可生成mybatis-config.xml
和mybatis-generater-config.xml
模板 - 根据Mapper对象(必须以Mapper结尾)自动生成
Mapper Xml
、其中的方法生成对应的Statement(只包含外层元素)
-
> 例如:根据`int countById(@Param("id") Integer id);`就会生成`<select id="countById" resultType="java.lang.Integer"></select>`
4. MybatisGenerator、Swords、AutoCurd、GetCode、foilvora、Mybatis Maven Plugin
-
代码生成流程
- 配置数据库
- 配置样板代码生成路径
- 生成样板代码(
POJO
、DAO Mapper
、Mapper XML
)
foilvora:通过建表sql生成样板代码
Mybatis Maven Plugin:在mybatis-generater-config.xml
配置数据库连接,生成对应的Mapper Xml
、Mapper类、POJO
,可配置性最强
Swords配置图1
MybatisGenerator配置图2
Reference
- Spring Data Jpa - Query creation
- MyBatisCodeHelper-Pro
- Free Mybatis plugin
- MybatisGenerator
- AutoCurd
- Free Mybatis plugin
- CodeHelper Generator
- Mybatis Plugin - Document
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。