JavaBean和Document相互转换
引入依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>3.4.1</version>
</dependency>
直接撸代码 创建注解类 Column,NotColumn两个
Column
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String name();
public String text() default "这是一个属性映射";
}
NotColumn
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotColumn {
public String text() default "不是属性字段";
}
创建BsonUtil类
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
/*
* 将mongo的文档转化为对象将对象转化为mongo文档
* @author:zhoub
*/
public class BsonUtil {
/**
* 将Document列换转换JavaList
* @param documents
* @param clazz
* @param <T>
* @return
* @throws IllegalArgumentException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static <T> List<T> toBeans(List<Document> documents, Class<T> clazz)
throws IllegalArgumentException, InstantiationException,
IllegalAccessException, InvocationTargetException {
List<T> list = new ArrayList<T>();
for (int i = 0; null != documents && i < documents.size(); i++) {
list.add(toBean(documents.get(i), clazz));
}
return list;
}
/*
* 将Bson 转化为对象
*
* @param:Bson文档
*
* @param:类pojo
*
* @param:返回对象
*/
public static <T> T toBean(Document document, Class<T> clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
T obj = clazz.newInstance();// 声明一个对象
Field[] fields = clazz.getDeclaredFields();// 获取所有属性
Method[] methods = clazz.getMethods();// 获取所有的方法
/*
* 查找所有的属性,并通过属性名和数据库字段名通过相等映射
*/
for (int i = 0; i < fields.length; i++) {
String fieldName = fields[i].getName();
Column column = fields[i].getAnnotation(Column.class);
Object bson = null;
if (null != column && null != column.name()) {
bson = document.get(column.name());
} else if ("id".equals(fieldName)) {
bson = document.get("_id");
} else {
bson = document.get(fieldName);
}
if (null == bson) {
continue;
} else if (bson instanceof Document) {// 如果字段是文档了递归调用
bson = toBean((Document) bson, fields[i].getType());
} else if (bson instanceof MongoCollection) {// 如果字段是文档集了调用colTOList方法
bson = colToList(bson, fields[i]);
}
for (int j = 0; j < methods.length; j++) {// 为对象赋值
String metdName = methods[j].getName();
if (equalFieldAndSet(fieldName, metdName)) {
methods[j].invoke(obj, bson);
break;
}
}
}
return obj;
}
public static List<Document> toBsons(List<Object> objs) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
List<Document> documents = new ArrayList<Document>();
for (int i = 0; null != objs && i < objs.size(); i++) {
documents.add(toBson(objs.get(i)));
}
return documents;
}
/*
* 将对象转化为Bson文档
* @param:对象
* @param:类型
* @return:文档
*/
public static Document toBson(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchFieldException {
if (null == obj) {
return null;
}
Class<? extends Object> clazz = obj.getClass();
Document document = new Document();
Method[] methods = clazz.getDeclaredMethods();
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; null != fields && i < fields.length; i++) {
Column column = fields[i].getAnnotation(Column.class);// 获取列注解内容
NotColumn notColumn = fields[i].getAnnotation(NotColumn.class);// 获取否列
String key = null;// 对应的文档键值
if (null != column && null != column.name()) {// 存在列映射取值
key = column.name();
} else if (null != notColumn) {// 不是列的情况
continue;
} else {
key = fields[i].getName();// 默认情况通过属性名映射
if ("id".equals(key)) {// 替换id为_id
key = "_id";
}
}
String fieldName = fields[i].getName();
/*
* 获取对象属性值并映射到Document中
*/
for (int j = 0; null != methods && j < methods.length; j++) {
String methdName = methods[j].getName();
if (null != fieldName && equalFieldAndGet(fieldName, methdName)) {
Object val = methods[j].invoke(obj);// 得到值
if (null == val) {
continue;
}
if (isJavaClass(methods[j].getReturnType())) {
if (methods[j].getReturnType().getName()
.equals("java.util.List")) {// 列表处理
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) val;
List<Document> documents = new ArrayList<Document>();
for (Object obj1 : list) {
documents.add(toBson(obj1));
}
document.append(key, documents);
} else {// 其它对象处理,基本类型
document.append(key, val);
}
} else {// 自定义类型
document.append(key, toBson(val));
}
}
}
}
return document;
}
/*
* 是否是自定义类型】
*
* false:是自定义
*/
private static boolean isJavaClass(Class<?> clz) {
return clz != null && clz.getClassLoader() == null;
}
/*
* 将文档集转化为列表
*
* @param:文档集
*
* @param:属性类型
*
* @return:返回列表
*/
private static List<Object> colToList(Object bson, Field field) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
ParameterizedType pt = (ParameterizedType) field.getGenericType();// 获取列表的类型
List<Object> objs = new ArrayList<Object>();
@SuppressWarnings("unchecked")
MongoCollection<Document> cols = (MongoCollection<Document>) bson;
MongoCursor<Document> cursor = cols.find().iterator();
while (cursor.hasNext()) {
Document child = cursor.next();
@SuppressWarnings("rawtypes")
Class clz = (Class) pt.getActualTypeArguments()[0];// 获取元素类型
@SuppressWarnings("unchecked")
Object obj = toBean(child, clz);
System.out.println(child);
objs.add(obj);
}
return objs;
}
/*
* 比较setter方法和属性相等
*/
private static boolean equalFieldAndSet(String field, String name) {
if (name.toLowerCase().matches("set" + field.toLowerCase())) {
return true;
} else {
return false;
}
}
/*
* 比较getter方法和属性相等
*/
private static boolean equalFieldAndGet(String field, String name) {
if (name.toLowerCase().matches("get" + field.toLowerCase())) {
return true;
} else {
return false;
}
}
}
—————————————————————————————————————————————————————————————
Java方便操作插入MongoDB数据库
—————————————————————————————————————————————————————————————
创建连接
此处为Scala编写
object DataOutPutToDB {
lazy val conn: MongoCollection[Document] = getConnection("127.0.0.1", 27017, "mytest", "track", "root", "root")
def getConnection(host: String, port: Int, dbName: String, name: String, username: String, password: String): MongoCollection[Document] = {
val adds: List[ServerAddress] = new util.ArrayList[ServerAddress]
//ServerAddress()两个参数分别为 服务器地址 和 端口
val serverAddress: ServerAddress = new ServerAddress(host, port)
adds.add(serverAddress)
val credentials: List[MongoCredential] = new util.ArrayList[MongoCredential]
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
val mongoCredential: MongoCredential = MongoCredential.createScramSha1Credential(username, dbName, password.toCharArray)
credentials.add(mongoCredential)
//通过连接认证获取MongoDB连接
val mongoClient: MongoClient = new MongoClient(adds, credentials)
//连接到数据库
val mongoDatabase: MongoDatabase = mongoClient.getDatabase(dbName)
val value: MongoCollection[Document] = mongoDatabase.getCollection(name)
value
}
测试写入
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchFieldException {
User user1 = new User("ZhangSanc1", 124);
User user2 = new User("ZhangSanc2", 124);
User user3 = new User("ZhangSanc3", 124);
List<Object> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
MongoCollection<Document> connection = DataOutPutToDB.conn();
List<Document> documents = BsonUtil.toBsons(users);
connection.insertMany(documents);
}