
一、前言这节我们将整合Spring Boot与Mongo DB实现增删改查的功能并且实现序列递增。MongoDB安装参考《MongoDB安装》Mongo DB的基本介绍和增删改查的用法可以参考我之前的文章 MongoDB shell 、 MongoDB文档CUD 和 MongoDB 文档查询 。二、整合MongoDB新建一个Spring Boot项目2.1 引入依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId/dependency2.2 数据准备然后可以通过Mongo Shell或者Mongo Compass工具创建一个名称为testdb的数据库并新增user文档文档类似与关系型数据库里的数据表2.3 application.yml配置在配置文件里配置Mongo DBspring:data:mongodb:host:localhostport:27017database:testdbMongo DB的默认端口为27017使用的数据库为刚刚创建的testdb。2.4 编码2.4.1 创建User实体SetterGetterDocument(collectionuser)publicclassUser{IdprivateStringid;privateStringname;privateIntegerage;privateStringdescription;}Document(collection “user”)表明这是一个文档对象名称为user对应Mongo DB里的user表。Id标注主键字段String类型的主键值在插入的时候Mongo DB会帮我们自动生成。如果对象中的某个属性为非表字段可以使用注解Transient进行排除。准备好这些后我们开始编写一些简单的增删改查样例。2.4.2 创建UserDao接口RepositorypublicinterfaceUserDaoextendsMongoRepositoryUser,String{}接口继承自MongoRepository泛型分别为实体对象和主键类型。通过继承MongoRepositoryUserDao包含了一些增删改查的方法如下图所示2.4.2 编写UserServiceUserService.javapublicinterfaceUserService{ListUsergetUsers();OptionalUsergetUser(Stringid);UsercreateUser(Useruser);voiddeleteUser(Stringid);voidupdateUser(Stringid,Useruser);}实现类UserServiceImpl.javaServicepublicclassUserServiceImplimplementsUserService{AutowiredprivateUserDaouserDao;OverridepublicListUsergetUsers(){returnthis.userDao.findAll();}OverridepublicOptionalUsergetUser(Stringid){returnthis.userDao.findById(id);}OverridepublicUsercreateUser(Useruser){user.setId(null);returnuserDao.save(user);}OverridepublicvoiddeleteUser(Stringid){this.userDao.findById(id).ifPresent(user-this.userDao.delete(user));}OverridepublicvoidupdateUser(Stringid,Useruser){this.userDao.findById(id).ifPresent(u-{u.setName(user.getName());u.setAge(user.getAge());u.setDescription(user.getDescription());this.userDao.save(u);});}}上面我们编写了基本的增删改查样例新增和修改都是通过save方法完成的当主键存在时则为修改主键不存在则为新增。2.4.3 编写controller最后编写一个RESTful的UserController为了方便没有对参数进行校验RestControllerRequestMapping(user)publicclassUserController{AutowiredprivateUserServiceuserService;GetMappingpublicListUsergetUsers(){returnuserService.getUsers();}PostMappingpublicUsercreateUser(Useruser){returnuserService.createUser(user);}DeleteMapping(/{id})publicvoiddeleteUser(PathVariableStringid){userService.deleteUser(id);}PutMapping(/{id})publicvoidupdateUser(PathVariableStringid,Useruser){userService.updateUser(id,user);}/** * 根据用户 id查找 * 存在返回不存在返回 null */GetMapping(/{id})publicUsergetUser(PathVariableStringid){returnuserService.getUser(id).orElse(null);}}2.5 测试2.5.1 测试新增用户新增成功查看数据查询成功。2.5.2 测试通过用ID查找用户2.5.3 更新用户查看数据是否更新成功2.5.4 删除用户最后测试通过用户ID删除用户返回状态码200删除成功。查看数据删除成功三、多条件查询3.1 UserDao其实UserDao通过继承MongoRepository已经具有了JPA的特性我们可以通过方法名来构建多查询条件的SQL。比如通过用户的年龄段来查询ListUserfindByAgeBetween(Integerfrom,Integerto);在输入findBy后IDEA会根据实体对象的属性和SQL的各种关键字自动组合提示比如再在创建一个通过年龄段用户名和描述模糊查询查询用户的方法ListUserfindByAgeBetweenAndNameEqualsAndDescriptionIsLike(Integerfrom,Integerto,Stringname,Stringdescription);方法参数个数需要和方法名中所需要的参数个数对应上。3.1 Service多条件使用在UserService里新增一个getUsersByAgeBewteen、findByAgeBetweenAndNameEqualsAndDescriptionIsLik方法ListUsergetUsersByAgeBewteen(Integerfrom,Integerto);ListUserfindByAgeBetweenAndNameEqualsAndDescriptionIsLike(Integerfrom,Integerto,Stringname,Stringdescription);同时在UserServiceImpl里实现getUsersByAgeBewteen、findByAgeBetweenAndNameEqualsAndDescriptionIsLik方法OverridepublicListUsergetUsersByAgeBewteen(Integerfrom,Integerto){returnthis.userDao.findByAgeBetween(from,to);}OverridepublicListUserfindByAgeBetweenAndNameEqualsAndDescriptionIsLike(Integerfrom,Integerto,Stringname,Stringdescription){returnthis.userDao.findByAgeBetweenAndNameEqualsAndDescriptionIsLike(from,to,name,description);}3.3 ControllerGetMapping(/conditionAgeBetween)publicListUserfindByAgeBetween(intfrom,intto){returnuserService.getUsersByAgeBewteen(from,to);}GetMapping(/AgeBetweenAndNameAndDescription)publicListUserfindByAgeBetweenAndNameEqualsAndDescriptionIsLike(intfrom,intto,Stringname,Stringdescription){returnuserService.findByAgeBetweenAndNameEqualsAndDescriptionIsLike(from,to,name,description);}3.4 启动测试重启项目我们往数据库里多加几条数据测试多条件查询四、排序与分页4.1 Service排序和分页需要使用MongoTemplate对象来完成在UserService里新增一个getUserByCondition方法PageUsergetUserByCondition(intsize,intpage,Useruser);同时在UserServiceImpl里实现getUserByCondition方法OverridepublicPageUsergetUserByCondition(intsize,intpage,Useruser){QueryquerynewQuery();CriteriacriterianewCriteria();if(!StringUtils.isEmpty(user.getName())){criteria.and(name).is(user.getName());}if(!StringUtils.isEmpty(user.getDescription())){criteria.and(description).regex(user.getDescription());}query.addCriteria(criteria);SortsortSort.by(age);PageablepageablePageRequest.of(page,size,sort);ListUseruserstemplate.find(query.with(pageable),User.class);returnPageableExecutionUtils.getPage(users,pageable,()-template.count(query,User.class));}size表示每页显示的条数page表示当前页码数0表示第一页。上面的方法通过name和description模糊查询来查询用户分页信息并且查询结果使用age字段降序排序。方法返回Page对象。4.2 Controller在UserController里添加GetMapping(/condition)publicPageUsergetUserByCondition(intsize,intpage,Useruser){returnuserService.getUserByCondition(size,page,user);}4.3 测试我们查询description含有“测试”的数据结果返回有2totalElements条记录我们查询description含有“使用”的数据结果返回有3条记录同时翻页