MongoDB 的实际应用
MongoDB 作为查询性能优越的 NoSql 数据库,在项目中的运用越来越多,逐渐变成主要的数据库
下面,在 spring boot 项目中引入 MongoDB, 使用 MongoTemplate 作为工具;
一. maven 节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.spring4all</groupId> <artifactId>mongodb-plus-spring-boot-starter</artifactId> <version> 1.0 . 0 .RELEASE</version> </dependency> <dependency> <groupId>org.mongdb</groupId> <artifactId>mongo-java-driver</artifactId> <version> 3.8 . 1 </version> </dependency> |
配置:
yml 中的配置数据库,mongodb 默认的端口是 27017
1 2 3 4 | spring: data: mongodb: uri: mongodb: //localhost:27017/zs |
创建类
注意:@Data 是 lombok 工具包的,JSONObject 是 hutool 工具包的
实体类
我模拟的是,点击加钱,生成记录的场景,里面的类型最好是用包装类。
1 2 3 4 5 6 7 8 9 | @Data @Document (collection= "AddMoney" ) public class AddMoney implements Serializable { String id; Integer type; Double money; String creattime; } |
DAO 类
已经配置过,直接依赖注入。
1 2 3 4 5 6 7 8 9 10 | @Repository public class AddMoneyDao { /** * MongoTemplate */ @Autowired private MongoTemplate mongoTemplate; } |
增加一条数据,id 自动生成,返回一个有 id 的对象。
1 2 3 4 5 6 | /* * 增加一条数据 */ public AddMoney saveOne(AddMoney param) { return mongoTemplate.insert(param); } |
查询操作,Query 类型为筛选条件,在查询修改和删除中通用,Criteria 是拼接条件,where().is(),也可以是其他的 lt、lte、gt、gte、ne 等等。
排序或者限制输出行数这些与 where 无关的在 Query 里设置 q.limit()、q.skip()、q.with(Sort.by(Sort.Order.desc(sname)));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /* * 根据id查询 */ public AddMoney findOneById(String id){ Query q= new Query( Criteria.where( "_id" ).is(id)); List<AddMoney> list = mongoTemplate.find(q, AddMoney. class ); if (list.size()== 1 ){ return list.get( 0 ); } else return null ; } /* * 查询全部 */ public List<AddMoney> findAll() { return mongoTemplate.findAll(AddMoney. class ); } /* * 查询全部并排序 */ public List<AddMoney> findAllSort(String sname) { Query q= new Query(); q.with(Sort.by(Sort.Order.desc(sname))); return mongoTemplate.find(q, AddMoney. class ); } |
修改数据入参由修改内容和条件筛选组成,Update 对象中设置修改内容,筛选条件和查询一样,返回值为改变列数等信息。
注意入参的修改对象属性为 null 就是对应字段不修改,不为 null 就是修改为入参的值,所以要用包装类,否则 int double 这些默认为 0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /* * 根据id修改数据 */ public String updateById(AddMoney params,String id){ JSONObject json= JSONUtil.parseObj(params); Query q= new Query(Criteria.where( "_id" ).is(id)); Update update = new Update(); json.forEach((s, o) -> { update.set(s,o); }); UpdateResult result=mongoTemplate.updateFirst(q,update,params.getClass()); return result.toString(); } /* * 修改多个 */ public String update(AddMoney params, int type){ JSONObject json= JSONUtil.parseObj(params); Query q= new Query(Criteria.where( "type" ).is(type)); Update update = new Update(); json.forEach((s, o) -> { update.set(s,o); }); UpdateResult result=mongoTemplate.updateMulti(q,update,AddMoney. class ); return result.toString(); } |
删除数据,返回值为删除行数
1 2 3 4 5 6 7 8 | /* * 按id删除 */ public String deleteById(String id){ Query q= new Query(Criteria.where( "_id" ).is(id)); DeleteResult deleteResult=mongoTemplate.remove(q,AddMoney. class ); return deleteResult.toString(); } |
调用
写完调用测试一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | @Service public class UserServiceImpl implements UserService { @Autowired AddMoneyDao plusMoneyDao; @Override public AddMoney findOneById(String id) { return plusMoneyDao.findOneById(id); } @Override public String updateOne(AddMoney a,String id) { return plusMoneyDao.updateById(a,id); } @Override public String updateByType(AddMoney a, int type) { return plusMoneyDao.update(a,type); } @Override public String deleteOne(String id) { return plusMoneyDao.deleteById(id); } @Override public List<AddMoney> findAll() { return plusMoneyDao.findAllSort( "money" ); } @Override public AddMoney saveOne(AddMoney addMoney) { return plusMoneyDao.saveOne(addMoney); } } |