虽然不用了,但是记录下吧,一些思想还是要的
public class BaseMongoDao {
private static MongoClient mongoClient;
private static MongoConfig config;
private static MongoDatabase mongo;
private String colName;
public static void init(MongoConfig initconfig){
config = initconfig;
MongoClientOptions options = MongoClientOptions.builder()
.connectionsPerHost(config.getConnectionsPerHost())
.maxWaitTime(config.getMaxWaitTime())
.socketTimeout(config.getSocketTimeout())
.maxConnectionLifeTime(config.getMaxConnectionLifeTime())
.connectTimeout(config.getConnectTimeout()).build();
ServerAddress serverAddress = new ServerAddress(config.getDBUrl(),
config.getDBPort());
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
List<MongoCredential> cres = new ArrayList<MongoCredential>();
MongoCredential credential = MongoCredential.createScramSha1Credential(
config.getDBUser()
,config.getDBName()
,config.getDBpwd().toCharArray());
cres.add(credential);
mongoClient = new MongoClient(addrs, cres, options);
mongo = mongoClient.getDatabase(config.getDBName());
}
public BaseMongoDao(String colName) {
this.colName = colName;
}
private MongoCollection<Document> thisCollection() throws DAOException {
if(config==null){
throw new DAOException("Dao Config no init error");
}
return mongo.getCollection(colName);
}
/**
* 列表查询
* @param query 查询
* @param orderKey 排序key
* @param up 升序 asc true 降序 desc false
* @return
* @throws DAOException
*/
public <Q> List<Q> queryByCondition(BaseQuery<Q> query,String orderKey,boolean up) throws DAOException {
orderKey = StringUtil.isBlank(orderKey)?"_id":orderKey;
Q record = query.getQuery();
BasicDBObject cond = getCondition(record);
FindIterable<Document> findIterable;
if (query.getStart() != null && query.getRows() != null)
findIterable = thisCollection().find(cond)
.sort(new BasicDBObject(orderKey, up ? 1 : -1))
.skip((query.getStart() - 1) * query.getRows())
.limit(query.getRows());
else
findIterable = thisCollection().find(cond)
.sort(new BasicDBObject(orderKey, up ? 1 : -1));
MongoCursor<Document> iterator = findIterable.iterator();
List<Q> result = new ArrayList<Q>();
while (iterator.hasNext()) {
Document document = iterator.next();
result.add((Q) parseToObject(document, record.getClass()));
}
iterator.close();
return result;
}
/**
* 数量查询
* @param query
* @return
* @throws DAOException
*/
public <Q> Integer queryCoditionCount(BaseQuery<Q> query) throws DAOException {
Q record = query.getQuery();
BasicDBObject cond = getCondition(record);
return (int) thisCollection().count(cond);
}
/**
* 插入数据
* @param record
* @return
*/
public <Q> boolean insertOne(Q record) {
BasicDBObject cond = getCondition(record);
try {
thisCollection().insertOne(new Document(cond));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 批量插入
* @param records
* @return
*/
public <Q> boolean insertList(List<Q> records) {
try {
List<Document> list = new ArrayList<Document>(records.size());
for (Q record : records) {
list.add(new Document(getCondition(record)));
}
thisCollection().insertMany(list);
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 条件删除
* @param key
* @param val
* @return
*/
public boolean deleteByKey(String key,Object val) {
try {
if (key == null || val == null)
return false;
thisCollection().deleteOne(new BasicDBObject(key,val));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 多key值删除
* @param key
* @param vals
* @return
*/
public boolean deleteByKeys(String key ,List<Object> vals) {
BasicDBObject cond = new BasicDBObject(key,new BasicDBObject("$in",vals.toArray()));
try {
thisCollection().deleteMany(cond);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 通过给定key更改
* @param record
* @param <Q>
* @throws DAOException
*/
public <Q> void updateByKey(String key,Q record) throws DAOException {
BasicDBObject cond = getCondition(record);
BasicDBObject update = new BasicDBObject("$set",cond);
BasicDBObject query = new BasicDBObject(key,cond.get(key));
thisCollection().updateOne(query,update);
}
/**
*
* @param key
* @param record
* @throws DAOException
*/
public <Q> void upsertByKey(String key,Q record) throws DAOException {
BasicDBObject cond = getCondition(record);
BasicDBObject update = new BasicDBObject("$set",cond);
BasicDBObject query = new BasicDBObject(key,cond.get(key));
UpdateOptions options = new UpdateOptions();
options.upsert(true);
thisCollection().updateOne(query, update, options);
}
/**
* 通过反射获取非空字段信息
* @param record
* @param <Q>
* @return
*/
private <Q> BasicDBObject getCondition(Q record) {
BasicDBObject cond = new BasicDBObject();
Class clazz = record.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
Object value = field.get(record);
if (value != null)
cond.put(field.getName(), value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return cond;
}
/**
* 将结果转化为自定义对象
* @param document
* @param target
* @param <Q>
* @return
*/
private <Q> Q parseToObject(Document document, Class<Q> target) {
try {
Q result = target.newInstance();
Field[] fields = target.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
Object value = document.get(f.getName());
if (value == null)
continue;
else if (f.getType() == Integer.class)
f.set(result, ((Number) value).intValue());
else if (f.getType() == Long.class)
f.set(result, ((Number) value).longValue());
else if(isBaseType(f.getType().toString()))
f.set(result, value);
else
f.set(result, document.get(f.getName(), f.getType()));
}
return result;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
} catch (InstantiationException e) {
e.printStackTrace();
return null;
}
}
/**
* 查找顶针
* @return default 0
* @throws DAOException
*/
private Object getTop(String key) throws DAOException {
FindIterable<Document> it = thisCollection().find().sort(new BasicDBObject(key,-1));
if(it.first()==null){
return 0;
}else{
return it.first().get(key);
}
}
public <Q> List<Q> queryByConditionRange(BaseQuery<Q> query,String orderKey,boolean up,String rangeKey,Number gte,Number lte) throws DAOException {
orderKey = StringUtil.isBlank(orderKey)?"_id":orderKey;
Q record = query.getQuery();
BasicDBObject cond = getCondition(record);
cond.put(rangeKey, new BasicDBObject("$gte", gte).append("$lte", lte));
FindIterable<Document> findIterable;
if (query.getStart() != null && query.getRows() != null)
findIterable = thisCollection().find(cond)
.sort(new BasicDBObject(orderKey, up ? 1 : -1))
.skip((query.getStart() - 1) * query.getRows())
.limit(query.getRows());
else
findIterable = thisCollection().find(cond)
.sort(new BasicDBObject(orderKey, up ? 1 : -1));
MongoCursor<Document> iterator = findIterable.iterator();
List<Q> result = new ArrayList<Q>();
while (iterator.hasNext()) {
Document document = iterator.next();
result.add((Q) parseToObject(document, record.getClass()));
}
iterator.close();
return result;
}
/**
* 判断object是否为基本类型
* @param object
* @return
*/
public static boolean isBaseType(String className) {
if (className.equals("int") ||
className.equals("byte") ||
className.equals("long") ||
className.equals("double") ||
className.equals("float") ||
className.equals("char") ||
className.equals("short") ||
className.equals("boolean")) {
return true;
}
return false;
}public class BaseQuery<Q> {
private Integer start;
private Integer rows;
private Q query;
public BaseQuery(Class clazz) {
try {
this.query = (Q) clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public Integer getStart() {
return start;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public Q getQuery() {
return query;
}
public void setQuery(Q query) {
this.query = query;
}
}public class MongoConfig {
private int DBPort;
private String DBUrl;
private String DBName;
private String DBUser;
private String DBpwd;
private int connectionsPerHost;
private int maxWaitTime;
private int socketTimeout;
private int maxConnectionLifeTime;
private int connectTimeout;
public int getDBPort() {
return DBPort;
}
public void setDBPort(int dBPort) {
DBPort = dBPort;
}
public String getDBUrl() {
return DBUrl;
}
public void setDBUrl(String dBUrl) {
DBUrl = dBUrl;
}
public String getDBName() {
return DBName;
}
public void setDBName(String dBName) {
DBName = dBName;
}
public String getDBUser() {
return DBUser;
}
public void setDBUser(String dBUser) {
DBUser = dBUser;
}
public String getDBpwd() {
return DBpwd;
}
public void setDBpwd(String dBpwd) {
DBpwd = dBpwd;
}
public int getConnectionsPerHost() {
return connectionsPerHost;
}
public void setConnectionsPerHost(int connectionsPerHost) {
this.connectionsPerHost = connectionsPerHost;
}
public int getMaxWaitTime() {
return maxWaitTime;
}
public void setMaxWaitTime(int maxWaitTime) {
this.maxWaitTime = maxWaitTime;
}
public int getSocketTimeout() {
return socketTimeout;
}
public void setSocketTimeout(int socketTimeout) {
this.socketTimeout = socketTimeout;
}
public int getMaxConnectionLifeTime() {
return maxConnectionLifeTime;
}
public void setMaxConnectionLifeTime(int maxConnectionLifeTime) {
this.maxConnectionLifeTime = maxConnectionLifeTime;
}
public int getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
}乐享:知识积累,快乐无限。