-
spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作。
-
有两种实现方式
-
dao层接口继承MongoRepository 和 Spring data jpa差不多
-
通过MongoTemplate实现, 我用的就是这个
-
-
-
导入依赖
-
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>3.9.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> </dependencies> <build> <plugins> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
-
-
配置文件properties:
-
spring.data.mongodb.uri=mongodb://172.0.0.1:27017/testdb //多ip可以使用 spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
-
-
定义一个dao层的公共接口
-
import java.io.Serializable; import java.util.List; import org.springframework.data.domain.Page; /** * 公共的dao接口 */ public interface IBaseDao<T> { void save(T entity); void update(T entity); void delete(Serializable... ids); T find(Serializable id); List<T> findAll(); List<T> findAll(String order); List<T> findByProp(String propName,Object value); List<T> findByProp(String propName,Object value,String order); List<T> findByProps(String[] propName,Object[] values); List<T> findByProps(String[] propName,Object[] values,String order); T uniqueByProp(String propName,Object value); T uniqueByProps(String[] propName,Object[] values); int countByCondition(String[] params,Object[] values); }
-
后面的实体dao接口都要继承IBaseDao接口,并且把实体类传入
-
/** * 用户的操作接口 */ public interface UserDao extends IBaseDao<User>{ }
-
-
写BaseDaoImpl 实现IBaseDao接口
-
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** *抽象接口 继承类的类 需要重写getEntityClass方法.返还操作的class字节码 */ public abstract class BaseDaoImpl<T> implements IBaseDao<T> { protected abstract Class<T> getEntityClass(); @Autowired protected MongoTemplate mongoTemplate; @Override public void save(T entity) { mongoTemplate.save(entity); } @Override public void update(T entity) { Map<String, Object> map = null; try { map = parseEntity(entity); } catch (Exception e) { e.printStackTrace(); } String id = null; Object value = null; Update update = new Update(); if (map != null && map.size() > 0) { for (String key : map.keySet()) { if (key.startsWith("{")) { id = key.substring(key.indexOf("{") + 1, key.indexOf("}")); value = map.get(key); } else { update.set(key, map.get(key)); } } } mongoTemplate.updateFirst(new Query().addCriteria(Criteria.where(id).is(value)), update, getEntityClass()); } @Override public void delete(Serializable... ids) { if (ids != null && ids.length > 0) { for (Serializable id : ids) { mongoTemplate.remove(mongoTemplate.findById(id, getEntityClass())); } } } @Override public T find(Serializable id) { return mongoTemplate.findById(id, getEntityClass()); } @Override public List<T> findAll() { return mongoTemplate.findAll(getEntityClass()); } @SuppressWarnings("deprecation") @Override public List<T> findAll(String order) { List<Order> orderlist = parseOrder(order); if (orderlist == null || orderlist.size() == 0) { return findAll(); } return mongoTemplate.find(new Query().with(new Sort(orderlist)), getEntityClass()); } @Override public List<T> findByProp(String propName, Object value) { return findByProp(propName, value, null); } @SuppressWarnings("deprecation") @Override public List<T> findByProp(String propName, Object value, String order) { Query query = new Query(); query.addCriteria(Criteria.where(propName).is(value)); List<Order> orderlist = parseOrder(order); if (orderlist != null && orderlist.size() > 0) { query.with(new Sort(orderlist)); } return null; } @Override public List<T> findByProps(String[] propName, Object[] values) { return findByProps(propName, values, null); } @Override public List<T> findByProps(String[] propName, Object[] values, String order) { Query query = createQuery(propName, values, order); return mongoTemplate.find(query, getEntityClass()); } @Override public T uniqueByProp(String propName, Object value) { return mongoTemplate.findOne(new Query().addCriteria(Criteria.where(propName).is(value)), getEntityClass()); } @Override public T uniqueByProps(String[] propName, Object[] values) { Query query = createQuery(propName, values, null); return mongoTemplate.findOne(query, getEntityClass()); } @Override public int countByCondition(String[] params, Object[] values) { Query query = createQuery(params, values, null); Long count = mongoTemplate.count(query, getEntityClass()); return count.intValue(); } protected Map<String, Object> parseEntity(T t) throws Exception { Map<String, Object> map = new HashMap<>(); String id = ""; Field[] declaredFields = getEntityClass().getDeclaredFields(); for (Field field : declaredFields) { if (field.isAnnotationPresent(Id.class)) { field.setAccessible(true); map.put("{" + field.getName() + "}", field.get(t)); id = field.getName(); break; } } Method[] declaredMethods = getEntityClass().getDeclaredMethods(); if (declaredFields != null && declaredFields.length > 0) { for (Method method : declaredMethods) { if (method.getName().startsWith("get") && method.getModifiers() == Modifier.PUBLIC) { String fieldName = parse2FieldName(method.getName()); if (!fieldName.equals(id)) { map.put(fieldName, method.invoke(t)); } } } } return map; } private String parse2FieldName(String method) { String name = method.replace("get", ""); name = name.substring(0, 1).toLowerCase() + name.substring(1); return name; } @SuppressWarnings("deprecation") public Query createQuery(String[] propName, Object[] values, String order) { Query query = new Query(); //where if (propName != null && values != null) { for (int i = 0; i < propName.length; i++) { query.addCriteria(Criteria.where(propName[i]).is(values[i])); } } List<Order> orderlist = parseOrder(order); if (orderlist != null && orderlist.size() > 0) { query.with(new Sort(orderlist)); } return query; } public List<Order> parseOrder(String order) { List<Order> list = null; if (order != null && !"".equals(order)) { list = new ArrayList<>(); String[] fields = order.split(","); Order o = null; String[] items = null; for (int i = 0; i < fields.length; i++) { if (fields[i] == null) { continue; } items = fields[i].split(" "); if (items.length == 1) { o = new Order(Direction.ASC, items[0]); } else if (items.length == 2) { o = new Order("desc".equalsIgnoreCase(items[1]) ? Direction.DESC : Direction.ASC, items[0]); } else { throw new RuntimeException("order field parse error"); } list.add(o); } } return list; } }
-
UserDaoImpl 继承BaseDaoImpl 实现UserDao接口
-
@Repository public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{ @Override protected Class<User> getEntityClass() { return User.class; } }
-
-
然后就可以通过注入来dao接口来实现功能了.
-
-
SpringBoot整合MongoDB
最新推荐文章于 2024-06-15 16:29:34 发布