javascript
java中mongodb中dao通用_Spring配置MongoDB及 构建通用Dao
(文章的編寫雖然不至于花費很多時間,但轉載請注明來源。本文參考了:http://liuluo129.iteye.com/blog/1994045,在此基礎上進行了部分優化,及詳細的介紹了流程)
1.首先引入Maven 依賴,如果不是用Maven管理項目,那么應該下載對應的Jar包并添加到項目lib下
1
2 org.springframework.data
3 spring-data-mongodb
4 1.4.1.RELEASE
5
6
7
8 org.mongodb
9 casbah_2.9.3
10 2.7.0-RC2
11
2.Spring中配置MongoDB,創建 spring-mongo.xml
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
3.?config.properties 內容
#--------------MongoDB
mongo.host=localhost
mongo.port=27017mongo.connectionsPerHost=8mongo.threadsAllowedToBlockForConnectionMultiplier=3mongo.connectTimeout=3000mongo.maxWaitTime=1500mongo.autoConnectRetry=truemongo.socketKeepAlive=truemongo.socketTimeout=2000mongo.slaveOk=true
4.將spring-mongo.xml引入到web.xml 目的當然是使Spring容器能檢測并加載到容器中
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:/applicationContext-mvc.xml,classpath*:/applicationContext-data-jpa.xml,classpath*:/spring-mongo.xml
1
5.關鍵的部分 注解及查詢套件的構建
QueryField.java
importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/*** type表示查詢類似,默認為equals
* attribute表示要查詢的屬性,默認為空串,如果為空則為字段名稱*/@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)public @interfaceQueryField {
QueryType type()defaultQueryType.EQUALS;
String attribute()default "";
}
QueryType.java
importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.util.StringUtils;importjava.lang.reflect.Field;importjava.util.List;/*** 查詢媒介
* 1. equals:相等
* 2. like:mongodb的like查詢
* 3. in:用于列表的in類型查詢*/
public enumQueryType {
EQUALS {
@OverridepublicCriteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value) {if(check(queryFieldAnnotation, field, value)) {
String queryField=getQueryFieldName(queryFieldAnnotation, field);returnCriteria.where(queryField).is(value.toString());
}return newCriteria();
}
},
LIKE {
@OverridepublicCriteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value) {if(check(queryFieldAnnotation, field, value)) {
String queryField=getQueryFieldName(queryFieldAnnotation, field);returnCriteria.where(queryField).regex(value.toString());
}return newCriteria();
}
},
IN {
@OverridepublicCriteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value) {if(check(queryFieldAnnotation, field, value)) {if (value instanceofList) {
String queryField=getQueryFieldName(queryFieldAnnotation, field);//此處必須轉型為List,否則會在in外面多一層[]
return Criteria.where(queryField).in((List>)value);
}
}return newCriteria();
}
};private static booleancheck(QueryField queryField, Field field, Object value) {return !(queryField == null || field == null || value == null);
}public abstractCriteria buildCriteria(QueryField queryFieldAnnotation, Field field, Object value);/*** 如果實體bean的字段上QueryField注解沒有設置attribute屬性時,默認為該字段的名稱
*
*@paramfield
*@return
*/
private staticString getQueryFieldName(QueryField queryField, Field field) {
String queryFieldValue=queryField.attribute();if (!StringUtils.hasText(queryFieldValue)) {
queryFieldValue=field.getName();
}returnqueryFieldValue;
}
}
QueryField.java和QueryType.ava的編寫的目的是為了公用Dao服務。注意不要引入錯誤的包。
6.公用Dao的構建
MongoDao.java
packagenet.shopxx.commons.component.mongo;importorg.springframework.data.mongodb.core.MongoTemplate;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.core.query.Update;importjava.util.List;public interface MongoDao{//保存一個對象到mongodb
publicT save(T bean);//根據id刪除對象
public voiddeleteById(T t);//根據對象的屬性刪除
public voiddeleteByCondition(T t);//通過條件查詢更新數據
public voidupdate(Query query, Update update);//根據id進行更新
public voidupdateById(String id, T t);//通過條件查詢實體(集合)
public Listfind(Query query);public ListfindByCondition(T t);//通過一定的條件查詢一個實體
publicT findOne(Query query);//通過ID獲取記錄
publicT get(String id);//通過ID獲取記錄,并且指定了集合名(表的意思)
publicT get(String id, String collectionName);publicMongoTemplate getMongoTemplate();
}
實現類MongoDaoSupport.java
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.data.mongodb.core.MongoTemplate;importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.core.query.Update;importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.util.List;public abstract class MongoDaoSupport implements MongoDao{
@Autowired
@Qualifier("mongoTemplate")protectedMongoTemplate mongoTemplate;//保存一個對象到mongodb
publicT save(T bean) {
mongoTemplate.save(bean);returnbean;
}//根據id刪除對象
public voiddeleteById(T t) {
mongoTemplate.remove(t);
}//根據對象的屬性刪除
public voiddeleteByCondition(T t) {
Query query=buildBaseQuery(t);
mongoTemplate.remove(query, getEntityClass());
}//通過條件查詢更新數據
public voidupdate(Query query, Update update) {
mongoTemplate.updateMulti(query, update,this.getEntityClass());
}//根據id進行更新
public voidupdateById(String id, T t) {
Query query= newQuery();
query.addCriteria(Criteria.where("id").is(id));
Update update=buildBaseUpdate(t);
update(query, update);
}//通過條件查詢實體(集合)
public Listfind(Query query) {return mongoTemplate.find(query, this.getEntityClass());
}public ListfindByCondition(T t) {
Query query=buildBaseQuery(t);returnmongoTemplate.find(query, getEntityClass());
}//通過一定的條件查詢一個實體
publicT findOne(Query query) {return mongoTemplate.findOne(query, this.getEntityClass());
}//通過ID獲取記錄
publicT get(String id) {return mongoTemplate.findById(id, this.getEntityClass());
}//通過ID獲取記錄,并且指定了集合名(表的意思)
publicT get(String id, String collectionName) {return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
}//根據vo構建查詢條件Query
privateQuery buildBaseQuery(T t) {
Query query= newQuery();
Field[] fields=t.getClass().getDeclaredFields();for(Field field : fields) {
field.setAccessible(true);try{
Object value=field.get(t);if (value != null) {
QueryField queryField= field.getAnnotation(QueryField.class);if (queryField != null) {
query.addCriteria(queryField.type().buildCriteria(queryField, field, value));
}
}
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(IllegalAccessException e) {
e.printStackTrace();
}
}returnquery;
}privateUpdate buildBaseUpdate(T t) {
Update update= newUpdate();
Field[] fields=t.getClass().getDeclaredFields();for(Field field : fields) {
field.setAccessible(true);try{
Object value=field.get(t);if (value != null) {
update.set(field.getName(), value);
}
}catch(Exception e) {
e.printStackTrace();
}
}returnupdate;
}//獲取需要操作的實體類class
@SuppressWarnings("unchecked")protected ClassgetEntityClass() {return ((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}publicMongoTemplate getMongoTemplate() {returnmongoTemplate;
}
}
7.-------------------------------正式開始使用
>>>實體
importnet.xxx.commons.component.mongo.QueryField;public class DeviceToken extendsBaseEntity {
@QueryFieldprivateLong uid;
@QueryFieldprivateString token;
@QueryFieldprivateString device;
@QueryFieldprivateString userAgent;publicDeviceToken(Long uid, String token, String device, String userAgent) {this.uid =uid;this.token =token;this.device =device;this.userAgent =userAgent;
}publicLong getUid() {returnuid;
}public voidsetUid(Long uid) {this.uid =uid;
}publicString getToken() {returntoken;
}public voidsetToken(String token) {this.token =token;
}publicString getDevice() {returndevice;
}public voidsetDevice(String device) {this.device =device;
}publicString getUserAgent() {returnuserAgent;
}public voidsetUserAgent(String userAgent) {this.userAgent =userAgent;
}
}
>>>Service
public interface DeviceTokenService extends MongoDao{
}
>>>ServiceImpl
@Service("deviceTokenServiceImpl")public class DeviceTokenServiceImpl extends MongoDaoSupport implementsDeviceTokenService {
}
>>> 應用
@Resourceprivate DeviceTokenService deviceTokenService; //注入到需要應用的文件//查詢示例
List dts= deviceTokenService.find(new BasicQuery(new BasicDBObject("uid",uid),new BasicDBObject("userAgent",userAgent)));
具體其他方法的使用可以擴充MongDao 和MongoDaoSupport.
總結
以上是生活随笔為你收集整理的java中mongodb中dao通用_Spring配置MongoDB及 构建通用Dao的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java鼠标进入高亮效果_鼠标选中文本划
- 下一篇: mysql的tcp链接过程_tcp建立连