代码拉取完成,页面将自动刷新
Fluent Mybatis构造动态SQL语句的方式是直接使用mybatis3中的SQLProvider功能。
@Mapper
@Component("yourMapper")
public interface YourMapper extends IEntityMapper<YourEntity> {
@InsertProvider(
type = YourSqlProvider.class,
method = "insert"
)
int insert(YourEntity entity);
@DeleteProvider(
type = YourSqlProvider.class,
method = "deleteById"
)
int deleteById(Serializable id);
@UpdateProvider(
type = YourSqlProvider.class,
method = "updateBy"
)
int updateBy(@Param(Param_EW) IUpdate update);
@SelectProvider(
type = YourSqlProvider.class,
method = "findOne"
)
@ResultMap(ResultMap)
YourEntity findOne(@Param(Param_EW) IQuery query);
// 省略 ... ...
}
public class YourSqlProvider {
public String insert(YourEntity entity) {
assertNotNull("entity", entity);
MapperSql sql = new MapperSql();
sql.INSERT_INTO("your_table");
List<String> columns = new ArrayList<>();
List<String> values = new ArrayList<>();
if (entity.getId() != null) {
columns.add("id");
values.add("#{id}");
}
if (entity.getSample() != null) {
columns.add("your_sample_column");
values.add("#{sample}");
}
sql.INSERT_COLUMNS(columns);
sql.VALUES();
sql.INSERT_VALUES(values);
return sql.toString();
}
// 省略其他......
}
YourSqlProvider的insert方法中,通过判断entity的属性值是否为null,动态添加需要insert的列和值。
public class YourSqlProvider {
public String deleteById(Serializable id) {
MapperSql sql = new MapperSql();
sql.DELETE_FROM("your_table");
sql.WHERE("id = #{id}");
return sql.toString();
}
}
public class YourSqlProvider {
public String updateBy(Map<String, Object> map) {
WrapperData data = getWrapperData(map, "ew");
MapperSql sql = new MapperSql();
Map<String, String> updates = data.getUpdates();
assertNotEmpty("updates", updates);
sql.UPDATE("your_table");
// 省略 1. update set部分动态构造
// 省略 2. update where条件部分动态构造
return sql.toString();
}
}
public class YourSqlProvider {
public String findOne(Map map) {
WrapperData data = getWrapperData(map, "ew");
MapperSql sql = new MapperSql();
// 设置要select的字段列表, 或者默认的全字段列表
sql.SELECT("your_table", data, "id, your_sample_column");
// 设置通过fluent api定义的查询条件, having by, group by, order by等条件
sql.WHERE_GROUP_ORDER_BY(data);
// 根据Entity @FluentMybatis注解上声明的数据库类型, 处理分页语法
return byPaged(DbType.MYSQL, data, sql.toString());
}
}
fluent mybatis封装的语法糖也只是提供了构造SQL的便利性,本身没有对mybatis做任何改造,也就不存在性能问题和不兼容问题,可以随意的升级mybatis版本。 也不会对你原来工作中写的mapper,或xml配置文件产生任何影响。
- | Mybatis Plus | Fluent Mybatis |
---|---|---|
代码生成 | 生成 Entity, Mapper, Wrapper等文件 | 只生成Entity, 再通过编译生成 Mapper, Query, Update 和 SqlProvider |
和Mybatis的共生关系 | 需要替换原有的SqlSessionFactoryBean | 对Mybatis没有任何修改,原来怎么用还是怎么用 |
动态SQL构造方式 | 应用启动时, 根据Entity注解信息构造动态xml片段,注入到Mybatis解析器 | 应用编译时,根据Entity注解,编译生成对应方法的SqlProvider,利用mybatis的Mapper上@InsertProvider @SelectProvider @UpdateProvider注解关联 |
动态SQL结果是否容易DEBUG跟踪 | 不容易debug | 容易,直接定位到SQLProvider方法上,设置断点即可 |
动态SQL构造 | 通过硬编码字段名称, 或者利用Entity的get方法的lambda表达式 | 通过编译手段生成对应的方法名,直接调用方法即可 |
字段变更后的错误发现 | 通过get方法的lambda表达的可以编译发现,通过字段编码的无法编译发现 | 编译时便可发现 |
不同字段动态SQL构造方法 | 通过接口参数方式 | 通过接口名称方式, FluentAPI的编码效率更高 |
语法渲染特点 | 无 | 通过关键变量select, update, set, and, or可以利用IDE语法渲染, 可读性更高 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。