fastmybatis是一个mybatis开发框架,其宗旨为:简单、快速、有效。
零配置快速上手
无需编写xml文件即可完成CRUD操作
支持mysql,sqlserver,oracle,postgresql,sqlite
支持自定义sql,sql语句可写在注解中或xml中
支持与spring-boot集成,依赖starter即可
轻量级,无侵入性,是官方mybatis的一种扩展
文档介绍地址:https://durcframework.gitee.io/fastmybatis/#/?t=1670849880047
GitHub地址:https://gitee.com/durcframework/fastmybatis
新建一个springboot项目,在pom.xml添加fastmybatis-spring-boot-starter
net.oschina.durcframework
fastmybatis-spring-boot-starter
最新版本(见changelog.md)
fastmybatis中的Mapper提供了一系列增删改查的方法,满足日常所需,完整方法说明如下表所示:
方法 | 说明 |
---|---|
E getByColumn(String column, Object value) | 根据字段查询一条记录 |
E getById(I id) | 根据主键查询 |
E getByQuery(Query query) | 根据条件查找单条记录 |
E getBySpecifiedColumns(List columns, Query query) | 查询单条数据并返回指定字段 |
T getBySpecifiedColumns(List columns, Query query, Class clazz) | 查询单条数据返回指定字段并转换到指定类中 |
T getColumnValue(String column, Query query, Class clazz) | 查询某一行某个字段值 |
long getCount(Query query) | 查询总记录数 |
List list(Query query) | 查询结果集 |
List listByArray(String column, Object[] values) | 根据多个字段值查询结果集 |
List listByCollection(String column, Collection> values) | 根据字段多个值查询结果集 |
List listByColumn(String column, Object value) | 根据字段查询结果集 |
List listByIds(Collection ids) | 根据多个主键查询 |
List listBySpecifiedColumns(List columns, Query query) | 查询返回指定的列,返回实体类集合 |
List listBySpecifiedColumns(List columns, Query query, Class clazz) | 查询返回指定的列,返指定类集合 |
List listColumnValues(String column, Query query, Class clazz) | 查询指定列,返指定列集合 |
PageInfo page(Query query) | 分页查询 |
PageInfo page(Query query, Function |
查询结果集,并转换结果集中的记录,转换处理每一行 |
PageInfo page(Query query, Supplier target, Consumer format) | 查询结果集,并转换结果集中的记录,并对记录进行额外处理 |
PageInfo page(Query query, Supplier target) | 查询结果集,并转换结果集中的记录 |
PageInfo pageAndConvert(Query query, Function
|
查询结果集,并转换结果集中的记录,转换处理list |
PageInfo pageBySpecifiedColumns(List columns, Query query, Class clazz) | 查询返回指定的列,返回分页数据 |
PageEasyui pageEasyui(Query query) | 查询返回easyui结果集 |
PageEasyui pageEasyui(Query query, Class clazz) | 查询返回easyui结果集,并转换结果集中的记录 |
E forceById(I id) | 根据主键查询强制查询,忽略逻辑删除字段 |
int save(E entity) | 保存,保存所有字段 |
int saveBatch(Collection entitys) | 批量保存 |
int saveIgnoreNull(E entity) | 保存,忽略null字段 |
int saveMultiSet(Collection entitys) | 批量保存,兼容更多的数据库版本,忽略重复行,此方式采用union的方式批量insert |
int saveOrUpdate(E entity) | 保存或修改,当数据库存在记录执行UPDATE,否则执行INSERT |
int saveOrUpdateIgnoreNull(E entity) | 保存或修改,忽略null字段,当数据库存在记录执行UPDATE,否则执行INSERT |
int saveUnique(Collection entitys) | 批量保存,去除重复行,通过对象是否相对判断重复数据,实体类需要实现equals方法 |
int saveUnique(Collection entitys, Comparator comparator) | 批量保存,去除重复行,指定比较器判断 |
int updateByQuery(E entity, Query query) | 根据条件更新 |
int updateIgnoreNull(E entity) | 更新,忽略null字段 |
int updateByMap(Map |
根据条件更新,map中的数据转化成update语句set部分,key为数据库字段名 |
int delete(E entity) | 删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteByColumn(String column, Object value) | 根据指定字段值删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteById(I id) | 根据id删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteByIds(Collection ids) | 根据多个主键id删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int deleteByQuery(Query query) | 根据条件删除,在有逻辑删除字段的情况下,做UPDATE操作 |
int forceDelete(E entity) | 强制删除(底层根据id删除),忽略逻辑删除字段,执行DELETE语句 |
int forceDeleteById(I id) | 根据id强制删除,忽略逻辑删除字段,执行DELETE语句 |
int forceDeleteByQuery(Query query) | 根据条件强制删除,忽略逻辑删除字段,执行DELETE语句 |
Map |
查询结果并转换成Map对象 |
查询列表并将结果转换成树结构 |
创建一个mapper接口,继承CrudMapper,可以获取mapper所有支持的接口函数。
public interface TTagMapper extends CrudMapper {
}
也可以通过自定义SQL,来实现mapper接口
public interface TTagMapper extends CrudMapper {
@Update("update blog_tag set username = #{username} where id = #{id}")
int updateById(@Param("id") int id, @Param("username") String username);
}
指定外部模板,默认template-classpath的值为/fastmybatis/tpl/当前路径,也可以通过Application配置来指定具体的路径:
mybatis:
ignoreLogicDeleteWithAssociatio: true
mapper-locations: classpath*:/mapper/**/*.xml
创建一个Service实现IService接口服务,添加@Service注解
@Service
public class TagService implements IService {
}
实体类注解,通过@Table来指定表名,指定主键。
@Data
@Table(name="blog_tag", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
public class Tag implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 标题
*/
private String name;
/**
* 标题icon
*/
private String iconUrl;
/**
* create_time
*/
private Date createTime;
/**
* update_time
*/
private Date updateTime;
}
适用于:mysql自增主键、sqlserver自增主键、oracle(触发器)
数据库主键设置自增后,这样设置:
// strategy = PkStrategy.INCREMENT 自增策略
@Table(name = "t_user", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
public class TUser {
}
这样在做insert后,id会自动填充自增后的值。
适用于oracle表序列
– 创建表sequence,名字为t_user_seq
create sequence t_user_seq start with 1 increment by 1;
使用如下注解:
@Table(name = "t_user", pk = @Pk(name = "id", sequenceName = "t_user_seq"))
public class TUser {
}
数据库主键是varchar类型,insert后自动填充uuid,并返回。
@Table(name = "log", pk = @Pk(name = "log_id", strategy = PkStrategy.UUID/*配置主键UUID*/))
public class Log {
private String logId;
}
这样在做insert后,id字段会自动填充uuid。
注:uuid的生成方式是调用数据库底层实现,如MySql的实现方式为: SELECT UUID()
简化当前Service编写代码,同时通过Query来构建多种查询条件,通过@Condition注解来生成各种查询条件。
@RestController
@RequestMapping("blog")
public class TagController {
@Autowired
private TagService tagService;
/**
* 分页查询
* @param param
* @return
*/
@GetMapping("/tag/page")
public R page(TagParam param) {
Query query = param.toQuery();
PageInfo pageInfo = tagService.page(query);
return R.ok().put("pageInfo", pageInfo);
}
/**
* 保存
* @param tag
* @return
*/
@GetMapping("/tag/save")
public R save(Tag tag) {
tagService.saveIgnoreNull(tag);
return new R().ok().put("id", tag.getId());
}
/**
* 更新
* @param tag
* @return
*/
@GetMapping("/user/update")
public R update(Tag tag) {
tagService.updateIgnoreNull(tag);
return R.ok();
}
/**
* 删除
* @param id
* @return
*/
@GetMapping("/tag/delete")
public R delete(Integer id) {
tagService.deleteById(id);
return R.ok();
}
}
分页查询是经常使用的,Fastmybatis 自带了分页查询,可以通过param请求参数来定义传输分页和返回PageInfo包含分页的数据。
@Data
public class TagParam extends PageParam {
/**
* 标题
*/
private String name;
}