前面把mongodb的基本概念,安装以及基本操作都讲了,下面我们就来讲一下mongodb在项目当中的应用。这里主要使用Spring boot来作项目演示,然后使用spring-data-mongo来操作mongodb.然后使用了spring-io来作项目的jar包管理。下面是项目的结构图:
其中Mongodb的MongoTemplate不太友好,稍微封装了一下:
这里主要是用了Lombok.jar包,用于简化代码。Lombok - 消除冗长的 java 代码
1) Direction.java 用于排序使用
@Getter @AllArgsConstructor public enum Direction implements EnumCode{ ASC(1, "asc"), // 升序 DESC(2, "desc"); // 降序 private Integer key; private String desc; }
2) EnumCode.java – 枚举的抽象
public interface EnumCode{ K getKey(); String getDesc(); }
3) MongoSearchEntity.java – 分页查询类
@Data public class MongoSearchEntity implements Serializable { /** 第一页 */ private int page = 1; /** 每页10条记录 */ private int size = 10; private Listsortname; /** @see com.weimob.o2o.lang.Direction */ private Integer sortorder; }
1) User.java – 实体类
@Data public class User implements Serializable { @Id private Integer id; private String username; private Integer age; private String password; }
2) UserService.java
public interface UserService { ListfindUserByCondition(User user); List findUserByPage(User queryBean, MongoSearchEntity pageBean); void saveUser(User user); }
3) UserServiceImpl.java
@Service public class UserServiceImpl implements UserService { private final static String USER_COLLECTION_NAME = "user"; @Autowired private MongoTemplate mongoTemplate; public ListfindUserByCondition(User user) { Query queryBean = MongoQueryUtils.getMongoQuery(user); List users = mongoTemplate.find(queryBean, User.class, USER_COLLECTION_NAME); return users; } public List findUserByPage(User user, MongoSearchEntity pageBean){ Query queryBean = MongoQueryUtils.getMongoQueryWithPage(user, pageBean); return mongoTemplate.find(queryBean, User.class, USER_COLLECTION_NAME); } public void saveUser(User user) { mongoTemplate.save(user, USER_COLLECTION_NAME); } }
4) MongoQueryUtils - 查询工具类
public abstract class MongoQueryUtils { public static Query getMongoQuery(Object obj){ Query query = new Query(); if(null == obj){ return query; } try { BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for(PropertyDescriptor propertyDescriptor : propertyDescriptors){ if("class".equals(propertyDescriptor.getName())){ continue; } Method readMethod = propertyDescriptor.getReadMethod(); Object value = readMethod.invoke(obj); if(null != value){ // generate query Criteria criteria = Criteria.where(propertyDescriptor.getDisplayName()).is(value); query.addCriteria(criteria); } } return query; } catch (IntrospectionException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return query; } public static Query getMongoQueryWithPage(Object obj, MongoSearchEntity searchEntity){ Query mongoQuery = getMongoQuery(obj); int page = searchEntity.getPage(); int size = searchEntity.getSize(); mongoQuery.skip((page - 1) * size + 1); mongoQuery.limit(size); ListsortNames = searchEntity.getSortname(); if(CollectionUtils.isEmpty(sortNames)){ return mongoQuery; } Sort sort; Integer direction = searchEntity.getSortorder(); if(Direction.DESC.getKey().equals(direction)){ sort = new Sort(Sort.Direction.DESC, sortNames); } else if (Direction.ASC.getKey().equals(direction)){ sort = new Sort(Sort.Direction.ASC, sortNames); } else { String[] propertyArray = new String[sortNames.size()]; for(int i = 0; i < sortNames.size(); i++){ propertyArray[i] = sortNames.get(i); } sort = new Sort(propertyArray); } mongoQuery.with(sort); return mongoQuery; } }
5) UserController
@RestController public class UserController { @Autowired private UserService userService; @RequestMapping(value = "add", method = RequestMethod.POST) public String saveUser(@RequestBody User user){ userService.saveUser(user); return "ok"; } @RequestMapping("query") public ListfindUserByCondition(@RequestBody User user){ List users = userService.findUserByCondition(user); return users; } @RequestMapping("page") public List findUserByPage(@RequestBody User user){ // MongoQueryUtils. List users = userService.findUserByCondition(user); return users; } }
application.properties
## servlet port server.port=8080 ## mongodb spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=carl
Main.class
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class Main { public static void main(String[] args) { SpringApplication.run(Main.class); } }
可以使用PostMan进行代码打断点调试。
代码Github地址: Spring Boot Mongodb