java mongodb helper_mongoHelper首页、文档和下载 - spring-data-mongodb 增强工具包 - OSCHINA - 中文开源技术交流社区...

spring-data-mongodb 增强工具包,简化 CRUD 操作,提供类 jpa 的数据库操作。

传统关系型数据库及围绕它们构建的 orm 在项目开发中有很多难用的痛点,而 mongodb 这种文档性数据库的出现,完美地解决了 sql 数据库在项目开发中的诸多痛点,在 mongodb 4.0 以后支持了事务,已经可以完美地用于工程项目。spring-data-mongodb 已经对 mongodb 的操作做了一部分封装,但依然不够,Query Criteria Sort 的操作依然有比较大的局限性,而且对于习惯 sql 操作的人来说,理解其使用法则依然稍显别扭。

mongoHelper 对 spring-data-mongodb 又进行了进一步封装,使其更易于使用,并添加了很多易于项目管理的功能。

使用说明

1. 基本操作

本orm会在容器中注入一个对象MongoHelper,这个对象拥有诸多单表查询功能,如下

按id删除:deleteById(String, Class>)

按条件删除:deleteByQuery(Criteria, Class>)

查询所有:findAll(Class)

查询数量:findCount(Class>)

根据id查询:findById(String, Class)

根据条件查询:findListByQuery(Criteria, Class>)

根据条件查询并分页:findPage(Criteria, Page, Class>)

插入:insert(Object)

插入或更新:insertOrUpdate(Object)

根据id更新:updateById(Object)

根据id更新全部字段:updateAllColumnById(Object)

根据条件更新第一项:updateFirst(Criteria, Update, Class>)

根据条件更新所有项:updateMulti(Criteria, Update, Class>)

累加某一个字段的数量, 原子操作:addCountById(String id, String property, Long count, Class> clazz)

这个mongoHelper能够完成所有查询任务,插入和更新操作能够自动判断pojo的类型操作对应表,查询操作根据传入的Class进行对应表操作,本orm所有数据库操作都基于mongoHelper的功能,不用像mybatis一样,每个表都要建立一套Mapper,xml,Service,model,大大减少数据层的代码量。可以将mongoHelper直接注入到controller层,简单的操作直接调用mongoHelper进行操作,不需要调用service层。

而复杂的操作及事务处理需要service层,将mongoHelper注入service,并使用service层的@Transactional注解就能使用springBoot管理的事务功能。本orm能够自动判断当前数据库操作是否处于事务中,处于事务中的话,所有查询和插入操作都会使用primary库偏好。非事务的话,查询优先走SecondaryPreferred库偏好,这样能够充分利用mongodb集群的负载均衡能力,提高数据库性能。

2. 复杂查询功能

本orm的查询功能都在MongoHelper的findByQuery,findPage方法中,封装条件的对象使用spring-data-mongodb的Criteria或Query,spring-data-mongodb的查询对象Criteria封装比较死板且不宜用,不太适合像sql一样根据条件拼接,本orm提供了CriteriaAndWrapper与CriteriaOrWrapper。类似于sql中的and连接与or连接,能够组装为近似sql的查询条件。

// 根据输入条件进行查询

public List search(String word, Integer type) {

CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper();

if (StrUtil.isNotEmpty(word)) {

criteriaAndWrapper.and(new CriteriaOrWrapper().like("name", word).like("phone", word));

}

if (type != null) {

criteriaAndWrapper.eq("type", type);

}

List userList = mongoHelper.findListByQuery(criteriaAndWrapper, User.class);

return userList ;

}

以上代码组装了类似于select * from user where (name like '%xxx%' or phone like '%xxx%') and type = xxx的查询语句,简单易懂。当然如果习惯使用Criteria进行查询也可以直接使用Criteria。

3. 分页查询,

本orm提供一个Page类,包含count总记录数,limit每页记录数,curr起始页(从1开始),records结果列表四个属性,只要将包含curr和limit数据的Page对象传入findPage,即可查询出records,count的数据并自动返回到Page对象中。这里三个属性参考了layui的分页参数,可直接无缝对接layui的分页控件。

public Page search(Page page, String word, Integer type) {

CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper();

if (StrUtil.isNotEmpty(word)) {

criteriaAndWrapper.and(new CriteriaOrWrapper().like("name", word).like("phone", word));

}

if (type != null) {

criteriaAndWrapper.eq("type", type);

}

Sort sort = Sort.by(Direction.DESC, "creatTime");

page = mongoHelper.findPage(criteriaAndWrapper, sort, page, User.class);

return page;

}

4. 表映射对象

spring.data.mongodb.package所指向的包下,存放数据库表所对应的pojo类,项目启动时本orm会扫描该包下所有@Document注解的类并建立相应表、索引、字段默认值,这个@Document注解是spring-data-mongodb定义的,另外本项目新增了一个属性注解@InitValue,用于提供字段初始值,和mysql的默认值类似,注意mongodb本身字段是没有默认值的,这里是项目本身用代码实现默认值的功能。如要建立索引,使用@Indexed标记属性建立相应索引,也是spring-data-mongodb定义的。

@Document

public class User extends BaseModel {

@InitValue("0")

Integer type; // 类型 0客户 1经销商

@Indexed

String name;

String phone;

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getType() {

return type;

}

public void setType(Integer type) {

this.type = type;

}

}

另外本orm提供了一个基础model,包含id(用@Id注解),createTime,updateTime三个必备属性,createTime和updateTime在插入和更新时会自动填充时间戳,其他pojo类可继承此BaseModel,简化代码编写。

@Document

public class BaseModel implements Serializable{

@Id

String id;

Long createTime;

Long updateTime;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public Long getCreateTime() {

return createTime;

}

public void setCreateTime(Long createTime) {

this.createTime = createTime;

}

public Long getUpdateTime() {

return updateTime;

}

public void setUpdateTime(Long updateTime) {

this.updateTime = updateTime;

}

}

5.数据库导入导出工具

本orm提供一个数据库导入导出工具ImportExportUtil注入到容器中,拥有exportDb和importDb两个方法,可按照pojo类导入导出相应表结构和数据,可使用定时任务定期备份数据库。

6.打印查询语句

spring-data-mongodb默认的打印语句方式为修改配置文件logging.level.root: debug。但这里打印出来的语句基本不可读,也不能像sql一样直接复制出来到数据库中进行执行,处于集群模式下还每隔数秒发送一次检测当前数据库isMaster的命令,很干扰debug。本orm重写了查询语句的打印功能,只要配置spring.data.mongodb.print:true就能打印出如下的语句:

db.admin.find({

"$and": [

{

"name": {

"$regex": "^.*ad.*$",

"$options": "i"

}

}

]

}).projection({

"name": 1

}).sort({

"id": -1

});

可直接复制到mongodb客户端中进行执行,非常方便调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值