亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

NoSQL 之 Morphia 操作 MongoDB

系統(tǒng) 3590 0
?

上兩篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html

http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html

介紹到了在MongoDB的控制臺完成MongoDB的數(shù)據(jù)操作、以及通過Java MongoDB 的驅(qū)動完成在Java中對MongoDB的操作,通過前兩篇文章我們對MongoDB有了全面、深刻的認(rèn)識和理解。現(xiàn)在我們就看看利用Morphia庫來操作MongoDB。

開發(fā)環(huán)境:

System:Windows

IDE:eclipse、MyEclipse 8

Database:mongoDB

開發(fā)依賴庫:

JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jar

Email:hoojo_@126.com

Blog: http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

一、準(zhǔn)備工作

1、 首先,下載mongoDB對Java支持的驅(qū)動包

驅(qū)動包下載地址: https://github.com/mongodb/mongo-java-driver/downloads

mongoDB對Java的相關(guān)支持、技術(shù): http://www.mongodb.org/display/DOCS/Java+Language+Center

驅(qū)動源碼下載: https://download.github.com/mongodb-mongo-java-driver-r2.6.1-7-g6037357.zip

在線查看源碼: https://github.com/mongodb/mongo-java-driver

Morphia jar包下載: http://code.google.com/p/morphia/downloads/list

2、 下面建立一個(gè)JavaProject工程,導(dǎo)入下載下來的驅(qū)動包。即可在Java中使用Morphia,目錄如下:

clip_image002

二、Java操作MongoDB示例

在本示例之前你需要啟動mongod.exe的服務(wù),在你安裝mongoDB的目錄中,找到mongod.exe啟動服務(wù)后,下面的程序才能順利執(zhí)行;

1、 Java操作mongoDB數(shù)據(jù)庫,操作索引

Mongo mongo = new Mongo();

這樣就創(chuàng)建了一個(gè)MongoDB的數(shù)據(jù)庫連接對象,它默認(rèn)連接到當(dāng)前機(jī)器的localhost地址,端口是27017。

DB db = mongo.getDB(“test”);

這樣就獲得了一個(gè)test的數(shù)據(jù)庫,如果mongoDB中沒有創(chuàng)建這個(gè)數(shù)據(jù)庫也是可以正常運(yùn)行的。如果你 讀過上一篇文章 就知道,mongoDB可以在沒有創(chuàng)建這個(gè)數(shù)據(jù)庫的情況下,完成數(shù)據(jù)的添加操作。當(dāng)添加的時(shí)候,沒有這個(gè)庫,mongoDB會自動創(chuàng)建當(dāng)前數(shù)據(jù)庫。

得到了db,下一步我們要獲取一個(gè)“聚集集合DBCollection”,通過db對象的getCollection方法來完成。

DBCollection users = db.getCollection("users");

這樣就獲得了一個(gè)DBCollection,它相當(dāng)于我們數(shù)據(jù)庫的“表”。

查詢所有數(shù)據(jù)

DBCursor cur = users.find();

while (cur.hasNext()) {

System.out.println(cur.next());

}

用BasicDBObjectBuilder,向users對象中添加數(shù)據(jù)

user = BasicDBObjectBuilder. start ("id", 1546555)

.append("name", "jojo").add("address", "gz")

.append("email", "hoojo_@126.com")

.get();

插入數(shù)據(jù)

users.insert(user);

可以利用JSON工具來序列化對象數(shù)據(jù)

JSON. serialize (cur)

完整源碼

          
            package
          
           com.hoo.test;
        
          ?
        
          
            import
          
           java.net.UnknownHostException;
        
          
            import
          
           com.hoo.entity.User;
        
          
            import
          
           com.hoo.util.BasicDBObjectUtils;
        
          
            import
          
           com.mongodb.BasicDBObjectBuilder;
        
          
            import
          
           com.mongodb.DB;
        
          
            import
          
           com.mongodb.DBCollection;
        
          
            import
          
           com.mongodb.DBCursor;
        
          
            import
          
           com.mongodb.DBObject;
        
          
            import
          
           com.mongodb.Mongo;
        
          
            import
          
           com.mongodb.MongoException;
        
          
            import
          
           com.mongodb.util.JSON;
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> Mongo實(shí)例對象的相關(guān)方法測試
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2011-5-24 下午02:42:29
          
        
          
             * @file MongoDBTest.java
          
        
          
             * @package com.hoo.test
          
        
          
             * @project MongoDB
          
        
          
             * @blog http://blog.csdn.net/IBM_hoojo
          
        
          
             * @email hoojo_@126.com
          
        
          
             * @version 1.0
          
        
          
             */
          
        
          
            public
          
          
            class
          
           MongoDBTest {
        
          ?
        
          
            public
          
          
            static
          
          
            void
          
           main(String[] args) 
          
            throws
          
           UnknownHostException, MongoException {
        
                  Mongo mg = 
          
            new
          
           Mongo();
        
        
                  System.out.println(
          
            "查詢所有的Database的名稱"
          
          );
        
          
            for
          
           (String name : mg.getDatabaseNames()) {
        
                      System.out.println(
          
            "dbName: "
          
           + name);
        
                  }
        
        
                  System.out.println(
          
            "查詢test庫中的所有collection集合(表)名稱"
          
          );
        
                  DB db = mg.getDB(
          
            "test"
          
          );
        
          
            for
          
           (String name : db.getCollectionNames()) {
        
                      System.out.println(
          
            "collectionName: "
          
           + name);
        
                  }
        
        
                  System.out.println(
          
            "添加測試數(shù)據(jù)"
          
          );
        
                  DBCollection users = db.getCollection(
          
            "users"
          
          );
        
          
            try
          
           {
        
          
            // 用自定義BasicDBObjectUtils工具類,將User Enity對象轉(zhuǎn)換成DBObject
          
        
                      DBObject user = BasicDBObjectUtils.castModel2DBObject(
          
            new
          
           User(
          
            "345567"
          
          , 
          
            "jack"
          
          , 22, 
          
            "beijin"
          
          ));
        
                      users.insert(user);
        
          
            // 用BasicDBObjectBuilder構(gòu)建一個(gè)DBObject對象
          
        
                      user = BasicDBObjectBuilder.start(
          
            "id"
          
          , 1546555).append(
          
            "name"
          
          , 
          
            "jojo"
          
          ).add(
          
            "address"
          
          , 
          
            "gz"
          
          ).append(
          
            "email"
          
          , 
          
            "hoojo_@126.com"
          
          ).get();
        
                      users.insert(user);
        
                  } 
          
            catch
          
           (Exception e) {
        
                      e.printStackTrace();
        
                  }
        
        
                  System.out.println(
          
            "游標(biāo)查詢所有users集合數(shù)據(jù)"
          
          );
        
                  DBCursor cur = users.find();
        
          
            while
          
           (cur.hasNext()) {
        
                      System.out.println(cur.next());
        
                  }
        
                  System.out.println(
          
            "查詢游標(biāo)相關(guān)內(nèi)容"
          
          );
        
                  System.out.println(cur.count());
        
                  System.out.println(cur.getCursorId());
        
                  System.out.println(cur.getOptions());
        
                  System.out.println(cur.getQuery());
        
                  System.out.println(cur.getSizes().listIterator());
        
        
                  System.out.println(cur.itcount());
        
          
            //System.out.println(cur.length());
          
        
                  System.out.println(cur.size());
        
                  System.out.println(cur.numGetMores());
        
                  System.out.println(cur.curr());
        
          
            //System.out.println(cur.toArray().get(0));
          
        
        
                  System.out.println(
          
            "顯示游標(biāo)查詢到的所有內(nèi)容: "
          
           + JSON.serialize(cur));
        
              }
        
          }
        

工具類,將帶有g(shù)etter、setter方法的Java類序列化成DBObject對象

          
            package
          
           com.hoo.util;
        
          ?
        
          
            import
          
           java.lang.reflect.Method;
        
          
            import
          
           com.mongodb.BasicDBObject;
        
          
            import
          
           com.mongodb.DBObject;
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> 將Entity/Model轉(zhuǎn)換成DBObject
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2011-5-30下午01:53:08
          
        
          
             * @file BasicDBObjectUtil.java
          
        
          
             * @package com.hoo.util
          
        
          
             * @project MongoDB
          
        
          
             * @blog http://blog.csdn.net/IBM_hoojo
          
        
          
             * @email hoojo_@126.com
          
        
          
             * @version 1.0
          
        
          
             */
          
        
          publicclass BasicDBObjectUtils {
        
          
            public
          
          
            static
          
          <T> DBObject castModel2DBObject(T entity) 
          
            throws
          
           Exception {
        
                  Method[] method =  entity.getClass().getMethods();
        
        
                  DBObject dbObject = 
          
            new
          
           BasicDBObject();
        
          
            for
          
           (Method m : method) {
        
          
            //System.out.println(m.getName());
          
        
          
            if
          
           (m.getName().startsWith(
          
            "get"
          
          )) {
        
                          String name = m.getName().replace(
          
            "get"
          
          , 
          
            ""
          
          );
        
          
            for
          
           (Method m2 : method) {
        
          
            if
          
           (m2.getName().equals(
          
            "set"
          
           + name)) {
        
                                  name = name.substring(0, 1).toLowerCase() + name.substring(1);
        
                                  Object returnVal = m.invoke(entity, 
          
            new
          
           Object[] {});
        
          
            if
          
           (returnVal != null) {
        
          
            //System.out.println(name + " : " + m.invoke(shipping, new Object[] {}));
          
        
                                      dbObject.put(name, returnVal);
        
                                  }
        
                              }
        
                          }
        
                      }
        
                  }
        
                  System.out.println(
          
            "dbObject: "
          
           + dbObject);
        
          
            return
          
           dbObject;
        
              }
        
          }
        

2、 完成索引操作,首先建立一個(gè)MongoDB4IndexTest.java,基本測試代碼如下:

          
            package
          
           com.hoo.test;
        
          ?
        
          
            import
          
           java.net.UnknownHostException;
        
          
            import
          
           java.util.ArrayList;
        
          
            import
          
           java.util.List;
        
          
            import
          
           org.bson.types.ObjectId;
        
          
            import
          
           org.junit.After;
        
          
            import
          
           org.junit.Before;
        
          
            import
          
           org.junit.Test;
        
          
            import
          
           com.mongodb.BasicDBObject;
        
          
            import
          
           com.mongodb.Bytes;
        
          
            import
          
           com.mongodb.DB;
        
          
            import
          
           com.mongodb.DBCollection;
        
          
            import
          
           com.mongodb.DBCursor;
        
          
            import
          
           com.mongodb.DBObject;
        
          
            import
          
           com.mongodb.Mongo;
        
          
            import
          
           com.mongodb.MongoException;
        
          
            import
          
           com.mongodb.QueryOperators;
        
          
            import
          
           com.mongodb.util.JSON;
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> 實(shí)現(xiàn)MongoDB的Index操作
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2011-6-2 下午03:21:23
          
        
          
             * @file MongoDB4IndexTest.java
          
        
          
             * @package com.hoo.test
          
        
          
             * @project MongoDB
          
        
          
             * @blog http://blog.csdn.net/IBM_hoojo
          
        
          
             * @email hoojo_@126.com
          
        
          
             * @version 1.0
          
        
          
             */
          
        
          
            public
          
          
            class
          
           MongoDB4IndexTest {
        
        
          
            private
          
           Mongo mg = null;
        
          
            private
          
           DB db;
        
          
            private
          
           DBCollection users;
        
        
              @Before
        
          
            public
          
          
            void
          
           init() {
        
          
            try
          
           {
        
                      mg = 
          
            new
          
           Mongo();
        
          
            //mg = new Mongo("localhost", 27017);
          
        
                  } 
          
            catch
          
           (UnknownHostException e) {
        
                      e.printStackTrace();
        
                  } 
          
            catch
          
           (MongoException e) {
        
                      e.printStackTrace();
        
                  }
        
          
            //獲取temp DB;如果默認(rèn)沒有創(chuàng)建,mongodb會自動創(chuàng)建
          
        
                  db = mg.getDB(
          
            "temp"
          
          );
        
          
            //獲取users DBCollection;如果默認(rèn)沒有創(chuàng)建,mongodb會自動創(chuàng)建
          
        
                  users = db.getCollection(
          
            "users"
          
          );
        
              }
        
        
              @After
        
          
            public
          
          
            void
          
           destory() {
        
          
            if
          
           (mg != null)
        
                      mg.close();
        
                  mg = null;
        
                  db = null;
        
                  users = null;
        
                  System.gc();
        
              }
        
        
          
            public
          
          
            void
          
           print(Object o) {
        
                  System.out.println(o);
        
              }
        
          }
        

3、 下面完成對象Collection的index的操作

          
            /**
          
        
          
             * <b>function:</b> 測試Collection的index相關(guān)操作
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2012-2-16 下午08:32:26
          
        
          
             */
          
        
          @Test
        
          
            public
          
          
            void
          
           testIndex() {
        
              query();
        
        
          
            for
          
           (DBObject index : coll.getIndexInfo()) {
        
                  print(
          
            "IndexInfo: "
          
           + index);
        
              }
        
        
              coll.dropIndexes();
        
          
            //創(chuàng)建索引
          
        
              coll.createIndex(
          
            new
          
           BasicDBObject(
          
            "name"
          
          , 
          
            "idx_name"
          
          ));
        
              print(coll.findOne(
          
            new
          
           BasicDBObject(
          
            "name"
          
          , 
          
            "haha"
          
          )));
        
              coll.createIndex(coll.findOne(
          
            new
          
           BasicDBObject(
          
            "name"
          
          , 
          
            "haha"
          
          )));
        
              DBObject o = 
          
            new
          
           BasicDBObject(
          
            "unique"
          
          , true);
        
          
            //coll.createIndex(coll.findOne(), o);
          
        
        
          
            // 修改索引,如果存在就修改不存在就添加
          
        
              coll.ensureIndex(o);
        
              coll.ensureIndex(
          
            "age_1"
          
          );
        
              coll.ensureIndex(
          
            new
          
           BasicDBObject(
          
            "age3_1"
          
          , 6), 
          
            new
          
           BasicDBObject(
          
            "ts"
          
          , -1));
        
              coll.ensureIndex(
          
            new
          
           BasicDBObject(
          
            "age_2"
          
          , 1), 
          
            new
          
           BasicDBObject( 
          
            "ts"
          
           , 1 ));
        
              coll.ensureIndex(
          
            new
          
           BasicDBObject(
          
            "password"
          
          , 2), 
          
            new
          
           BasicDBObject( 
          
            "z"
          
           , 
          
            "idx"
          
           ));
        
              coll.ensureIndex(
          
            new
          
           BasicDBObject(
          
            "password"
          
          , 1), 
          
            new
          
           BasicDBObject( 
          
            "etc"
          
           , 
          
            "idx"
          
           ));
        
          
            // 創(chuàng)建唯一索引
          
        
              coll.ensureIndex(
          
            new
          
           BasicDBObject(
          
            "emial"
          
          , 2), 
          
            new
          
           BasicDBObject(
          
            "unique"
          
          , false));
        
          
            // 創(chuàng)建索引,指定索引名稱default_index
          
        
              coll.ensureIndex(
          
            new
          
           BasicDBObject(
          
            "address"
          
          , 1), 
          
            new
          
           BasicDBObject( 
          
            "name"
          
           , 
          
            "default_index"
          
          ));
        
          
            // 創(chuàng)建索引對象,索引名稱user_index
          
        
              coll.ensureIndex(coll.findOne(
          
            new
          
           BasicDBObject(
          
            "name"
          
          , 
          
            "hoho"
          
          )), 
          
            "user_index"
          
          );
        
          
            // 唯一索引
          
        
              coll.ensureIndex(coll.findOne(
          
            new
          
           BasicDBObject(
          
            "name"
          
          , 
          
            "hehe"
          
          )), 
          
            "users_index_unique"
          
          , true);
        
        
          
            // 查詢所有索引
          
        
          
            for
          
           (DBObject index : coll.getIndexInfo()) {
        
                  print(
          
            "IndexInfo: "
          
           + index);
        
              }
        
        
              print(DBCollection.genIndexName(coll.findOne()));
        
        
          
            //coll.dropIndex(coll.findOne());
          
        
              print(DBCollection.genIndexName(
          
            new
          
           BasicDBObject(
          
            "password"
          
          , 2)));
        
          
            //coll.dropIndex(DBCollection.genIndexName(new BasicDBObject("password", 2)));
          
        
          
            //coll.dropIndexes();
          
        
          
            //coll.dropIndexes("assword_1");
          
        
          }
        

三、Morphia基本操作

1、 morphia可以利用annotation對JavaEntity進(jìn)行注解,那樣我們就可以用morphia操作JavaEntity對象

          
            package
          
           com.hoo.entity;
        
          ?
        
          
            import
          
           com.google.code.morphia.annotations.Entity;
        
          
            import
          
           com.google.code.morphia.annotations.Id;
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> JavaEntity對象
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2011-5-31上午11:45:21
          
        
          
             * @file User.java
          
        
          
             * @package com.hoo.entity
          
        
          
             * @project Morphia
          
        
          
             * @blog http://blog.csdn.net/IBM_hoojo
          
        
          
             * @email hoojo_@126.com
          
        
          
             * @version 1.0
          
        
          
             */
          
        
          
            //利用morphia的annotation進(jìn)行注解
          
        
          @Entity
        
          
            public
          
          
            class
          
           User {
        
              @Id
        
          
            private
          
          
            long
          
           id;
        
        
          
            private
          
           String name;
        
          
            private
          
          
            boolean
          
           sex;
        
          
            private
          
          
            int
          
           age;
        
          
            private
          
           String address;
        
        
          
            public
          
           User() {
        
              }
        
          
            public
          
           User(
          
            long
          
           id, String name, 
          
            boolean
          
           sex, 
          
            int
          
           age, String address) {
        
          
            super
          
          ();
        
          
            this
          
          .id = id;
        
          
            this
          
          .name = name;
        
          
            this
          
          .sex = sex;
        
          
            this
          
          .age = age;
        
          
            this
          
          .address = address;
        
              }
        
          
            //getter、setter
          
        
        
              @Override
        
          
            public
          
           String toString() {
        
          
            return
          
          
            this
          
          .id + 
          
            "#"
          
           + 
          
            this
          
          .name + 
          
            "#"
          
           + 
          
            this
          
          .age + 
          
            "#"
          
           + 
          
            this
          
          .sex + 
          
            "#"
          
           + 
          
            this
          
          .address;
        
              }
        
          }
        

2、 對Morphia對象一些簡單的使用,看看該對象提供了哪些基本的操作方法

          
            package
          
           com.hoo.test.morphia;
        
          ?
        
          
            import
          
           java.net.UnknownHostException;
        
          
            import
          
           org.junit.After;
        
          
            import
          
           org.junit.Before;
        
          
            import
          
           org.junit.Test;
        
          
            import
          
           com.google.code.morphia.Datastore;
        
          
            import
          
           com.google.code.morphia.EntityInterceptor;
        
          
            import
          
           com.google.code.morphia.Morphia;
        
          
            import
          
           com.google.code.morphia.mapping.MappedClass;
        
          
            import
          
           com.google.code.morphia.mapping.Mapper;
        
          
            import
          
           com.google.code.morphia.mapping.cache.EntityCache;
        
          
            import
          
           com.hoo.entity.User;
        
          
            import
          
           com.mongodb.BasicDBObjectBuilder;
        
          
            import
          
           com.mongodb.Mongo;
        
          
            import
          
           com.mongodb.MongoException;
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> morphia對象的簡單測試
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2011-5-31上午11:30:20
          
        
          
             * @file MorphiaTest.java
          
        
          
             * @package com.hoo.test
          
        
          
             * @project Morphia
          
        
          
             * @blog http://blog.csdn.net/IBM_hoojo
          
        
          
             * @email hoojo_@126.com
          
        
          
             * @version 1.0
          
        
          
             */
          
        
          
            public
          
          
            class
          
           MorphiaTest {
        
          
            private
          
           Mongo mongo;
        
          
            private
          
           Morphia morphia;
        
        
              @Before
        
          
            public
          
          
            void
          
           init() {
        
          
            try
          
           {
        
                      mongo = 
          
            new
          
           Mongo();
        
                  } 
          
            catch
          
           (UnknownHostException e) {
        
                      e.printStackTrace();
        
                  } 
          
            catch
          
           (MongoException e) {
        
                      e.printStackTrace();
        
                  }
        
                  morphia = 
          
            new
          
           Morphia();
        
              }
        
        
          
            private
          
          
            void
          
           print(Object o) {
        
          
            if
          
           (o != null) {
        
                      System.out.println(o.toString());
        
                  }
        
              }
        
        
          
            /**
          
        
          
                 * <b>function:</b> morphia對象的簡單測試
          
        
          
                 * @author hoojo
          
        
          
                 */
          
        
              @SuppressWarnings(
          
            "deprecation"
          
          )
        
              @Test
        
          
            public
          
          
            void
          
           testMorphia() {
        
          
            // 創(chuàng)建一個(gè)Datastore,過時(shí)的方法不推薦使用
          
        
                  Datastore ds = morphia.createDatastore(
          
            "myTestDB"
          
          );
        
                  print(
          
            "createDatastore: "
          
           + ds);
        
          
            // 創(chuàng)建ds
          
        
                  ds = morphia.createDatastore(mongo, 
          
            "myTestDB"
          
          );
        
                  print(
          
            "createDatastore: "
          
           + ds);
        
          
            // 創(chuàng)建一個(gè)帶用戶名、密碼的ds
          
        
          
            //ds = morphia.createDatastore(mongo, "myTestDB", "admin", new char[] { '1', '2', '3', '4', '5', '6' });
          
        
        
          
            // 設(shè)置操作資源對象,這里設(shè)置User.class 就可以完成對User的一系列操作
          
        
          
            //morphia.map(User.class);
          
        
          
            //morphia.mapPackage("com.hoo.entity");//會把整個(gè)包下面的類都加載進(jìn)來
          
        
          
            // 將對象轉(zhuǎn)成DBObject
          
        
                  print(
          
            "toDBObject: "
          
           + morphia.toDBObject(
          
            new
          
           User(System.currentTimeMillis(), 
          
            "jackson"
          
          , true, 22, null)));
        
          
            // 將參數(shù)2轉(zhuǎn)換成參數(shù)1的類型
          
        
                  print(
          
            "fromDBObject: "
          
           + morphia.fromDBObject(User.
          
            class
          
          , BasicDBObjectBuilder.start(
          
            "sex"
          
          , true).get()));
        
                  print(
          
            "getMapper: "
          
           + morphia.getMapper());
        
                  print(
          
            "isMapped: "
          
           + morphia.isMapped(User.
          
            class
          
          ));
        
        
              }
        
        
          
            /**
          
        
          
                 * <b>function:</b> 對Mapper對象相關(guān)操作
          
        
          
                 * @author hoojo
          
        
          
                 * @createDate 2012-2-16下午10:20:38
          
        
          
                 */
          
        
              @Test
        
          
            public
          
          
            void
          
           testMapper() {
        
                  Mapper mapper = morphia.getMapper();
        
          
            // 添加對象映射
          
        
                  print(
          
            "addMappedClass: "
          
           + mapper.addMappedClass(User.
          
            class
          
          ));
        
          
            //print(mapper.addMappedClass(mapper.addMappedClass(User.class));
          
        
        
          
            // 創(chuàng)建實(shí)體緩存
          
        
                  print(
          
            "createEntityCache: "
          
           + mapper.createEntityCache());
        
                  print(mapper.getCollectionName(
          
            "myTestDB"
          
          ));
        
                  print(mapper.getConverters());
        
                  User user = 
          
            new
          
           User(System.currentTimeMillis(), 
          
            "jackson"
          
          , true, 22, null);
        
                  user.setId(1306814012734L);
        
                  print(mapper.getId(user));
        
        
          
            for
          
           (EntityInterceptor ei : mapper.getInterceptors()) {
        
                      System.out.println(
          
            "EntityInterceptor: "
          
           + ei);
        
                  }
        
          ?
        
          
            // 查詢主鍵
          
        
                  print(
          
            "getKey: "
          
           + mapper.getKey(user));
        
          
            // 所有已經(jīng)映射的class
          
        
          
            for
          
           (MappedClass mc : mapper.getMappedClasses()) {
        
                      System.out.println(
          
            "getMappedClasses: "
          
           + mc);
        
                  }
        
        
                  print(
          
            "mcMap: "
          
           + mapper.getMCMap());
        
        
                  print(
          
            "getOptions: "
          
           + mapper.getOptions());
        
                  print(
          
            "keyToRef: "
          
           + mapper.keyToRef(mapper.getKey(user)));
        
                  print(
          
            "refToKey: "
          
           + mapper.refToKey(mapper.keyToRef(mapper.getKey(user))));
        
              }
        
        
          
            /**
          
        
          
                 * <b>function:</b> 實(shí)體緩存
          
        
          
                 * @author hoojo
          
        
          
                 */
          
        
              @Test
        
          
            public
          
          
            void
          
           testEntityCache() {
        
                  EntityCache ec = morphia.getMapper().createEntityCache();
        
                  print(
          
            "EntityCache: "
          
           + ec);
        
                  Datastore ds = morphia.createDatastore(mongo, 
          
            "myTestDB"
          
          );
        
                  User user = 
          
            new
          
           User(System.currentTimeMillis(), 
          
            "jackson"
          
          , true, 22, null);
        
                  user.setId(1306814012734L);
        
        
          
            // 添加實(shí)體
          
        
                  ec.putEntity(ds.getKey(user), user);
        
          
            // 代理
          
        
                  ec.putProxy(ds.getKey(user), user);
        
        
                  print(
          
            "getKey: "
          
           + ds.getKey(user));
        
                  print(
          
            "getProxy: "
          
           + ec.getProxy(ds.getKey(user)));
        
                  print(
          
            "getEntity: "
          
           + ec.getEntity(ds.getKey(user)));
        
        
                  print(ec.exists(ds.getKey(user)));
        
        
                  print(
          
            "stats: "
          
           + ec.stats());
        
              }
        
        
              @After
        
          
            public
          
          
            void
          
           destory() {
        
                  mongo = null;
        
                  morphia = null;
        
                  System.gc();
        
              }
        
          }
        

四、利用Morphia完成對Datastore對象的CRUD操作

1、 首先添加如下準(zhǔn)備代碼,隨后的方法直接添加到該文件中即可

          
            package
          
           com.hoo.test.ds;
        
          ?
        
          
            import
          
           java.net.UnknownHostException;
        
          
            import
          
           java.util.ArrayList;
        
          
            import
          
           java.util.List;
        
          
            import
          
           org.junit.After;
        
          
            import
          
           org.junit.Before;
        
          
            import
          
           org.junit.Test;
        
          
            import
          
           com.google.code.morphia.Datastore;
        
          
            import
          
           com.google.code.morphia.Key;
        
          
            import
          
           com.google.code.morphia.Morphia;
        
          
            import
          
           com.google.code.morphia.query.UpdateOperations;
        
          
            import
          
           com.hoo.entity.User;
        
          
            import
          
           com.mongodb.Mongo;
        
          
            import
          
           com.mongodb.MongoException;
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> Datastore增刪改查操作
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2011-5-31下午06:29:04
          
        
          
             * @fileDatastore DatastoreTest.java
          
        
          
             * @package com.hoo.test.ds
          
        
          
             * @project Morphia
          
        
          
             * @blog http://blog.csdn.net/IBM_hoojo
          
        
          
             * @email hoojo_@126.com
          
        
          
             * @version 1.0
          
        
          
             */
          
        
          
            public
          
          
            class
          
           DatastoreTest {
        
          
            private
          
           Mongo mongo;
        
          
            private
          
           Morphia morphia;
        
          
            private
          
           Datastore ds;
        
        
              @Before
        
          
            public
          
          
            void
          
           init() {
        
          
            try
          
           {
        
                      mongo = 
          
            new
          
           Mongo();
        
                  } 
          
            catch
          
           (UnknownHostException e) {
        
                      e.printStackTrace();
        
                  } 
          
            catch
          
           (MongoException e) {
        
                      e.printStackTrace();
        
                  }
        
                  morphia = 
          
            new
          
           Morphia();
        
                  morphia.map(User.
          
            class
          
          );
        
                  ds = morphia.createDatastore(mongo, 
          
            "temp"
          
          );
        
              }
        
        
          
            private
          
          
            void
          
           print(Object o) {
        
          
            if
          
           (o != null) {
        
                      System.out.println(o.toString());
        
                  }
        
              }
        
        
        
          
            /**
          
        
          
                * <b>function:</b> 查詢所有
          
        
          
                * @author hoojo
          
        
          
                * @createDate 2012-2-16 下午10:36:13
          
        
          
                */
          
        
          
            private
          
          
            void
          
           query() {
        
                  Iterable<User> it = ds.createQuery(User.
          
            class
          
          ).fetch();
        
          
            while
          
          (it.iterator().hasNext()) {
        
                      print(
          
            "fetch: "
          
           + it.iterator().next());
        
                  }
        
              }
        
        
              @After
        
          
            public
          
          
            void
          
           destory() {
        
                  mongo = null;
        
                  morphia = null;
        
                  ds = null;
        
                  System.gc();
        
              }
        
          }
        

2、 增刪改CUD操作

          
            /**
          
        
          
             * <b>function:</b> CUD增刪改
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2012-2-16 下午10:46:08
          
        
          
             */
          
        
          @Test
        
          
            public
          
          
            void
          
           testCUD() {
        
          
            // 添加測試數(shù)據(jù)
          
        
          
            for
          
           (
          
            int
          
           i = 0; i < 50; i++) {
        
                  User u = 
          
            new
          
           User(System.currentTimeMillis() + i, 
          
            "test-"
          
           + i, ((i % 2 == 0)? true: false), 18 + i, 
          
            "china-gz#"
          
           + i);
        
                  print(ds.save(u));
        
              }
        
          
            //ds.delete(ds.createQuery(User.class));
          
        
        
              List<User> users = 
          
            new
          
           ArrayList<User>();
        
              users.add(
          
            new
          
           User(1306907246518L, 
          
            "zhangsan"
          
          , true, 22, 
          
            "china-gz"
          
          ));
        
              User user = 
          
            new
          
           User(System.currentTimeMillis() + 3, 
          
            "zhaoliu"
          
          , true, 29, 
          
            "china-beijin"
          
          );
        
              users.add(user);
        
              users.add(
          
            new
          
           User(System.currentTimeMillis() + 6, 
          
            "wangwu"
          
          , true, 24, 
          
            "china-shanghai"
          
          ));
        
              users.add(
          
            new
          
           User(System.currentTimeMillis() + 9, 
          
            "lisi"
          
          , true, 26, 
          
            "china-wuhan"
          
          ));
        
          
            //添加集合
          
        
              print(
          
            "save: "
          
           + ds.save(users));
        
        
          
            //添加數(shù)組
          
        
              print(
          
            "save: "
          
           + ds.save(users.toArray()));
        
        
          
            this
          
          .query();
        
              print(
          
            "getKey: "
          
           + ds.find(User.
          
            class
          
          , 
          
            "id"
          
          , 1306907246518L).getKey());
        
        
          
            //修改操作
          
        
              UpdateOperations<User> uo = ds.createUpdateOperations(User.
          
            class
          
          );
        
        
              print(
          
            "update: "
          
           + ds.update(ds.find(User.
          
            class
          
          , 
          
            "id"
          
          , 1306907246518L).getKey(), uo).getUpdatedCount());
        
              uo.add(
          
            "name"
          
          , 
          
            "zhaoliuliu"
          
          ).set(
          
            "age"
          
          , 29).set(
          
            "sex"
          
          , true).add(
          
            "address"
          
          , 
          
            "gzz"
          
          );
        
              print(
          
            "update: "
          
           + ds.update(ds.find(User.
          
            class
          
          , 
          
            "id"
          
          , 1306907246518L).getKey(), uo).getUpdatedCount());
        
          ?
        
              print(
          
            "update: "
          
           + ds.update(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306907246518L), uo).getUpdatedCount());
        
              print(
          
            "update: "
          
           + ds.update(ds.find(User.
          
            class
          
          , 
          
            "id"
          
          , 1306907246518L), uo).getUpdatedCount());
        
        
              uo = ds.createUpdateOperations(User.
          
            class
          
          );
        
              uo.set(
          
            "name"
          
          , 
          
            "zhaoqq"
          
          ).set(
          
            "age"
          
          , 29).set(
          
            "sex"
          
          , true).add(
          
            "address"
          
          , 
          
            "fzz"
          
          );
        
              print(
          
            "update: "
          
           + ds.update(ds.find(User.
          
            class
          
          , 
          
            "id"
          
          , 1306907246518L).get(), uo).getUpdatedCount());
        
        
              print(
          
            "update: "
          
           + ds.update(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306907246518L), uo, true).getUpdatedCount());
        
        
          
            // 修改第一個(gè)對象
          
        
              print(
          
            "updateFirst: "
          
           + ds.updateFirst(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306907246518L), uo).getUpdatedCount());
        
          
            //當(dāng)參數(shù)createIfMissing為true的時(shí)候,如果修改的對象不存在就會添加這條數(shù)據(jù),如果為false的情況下,不存在也不添加
          
        
              print(
          
            "updateFirst: "
          
           + ds.updateFirst(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306907246519L), uo, true).getUpdatedCount());
        
              user.setId(1306907246518L);
        
              print(
          
            "updateFirst: "
          
           + ds.updateFirst(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306907246518L), user, true).getUpdatedCount());
        
        
              user.setId(1306916670518L);
        
          
            // 合并
          
        
              print(
          
            "merge: "
          
           + ds.merge(user).getId());
        
          
            this
          
          .query();
        
        
          
            //刪除
          
        
              print(
          
            "delete: "
          
           + ds.delete(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306907246518L)).getN());
        
              print(
          
            "delete: "
          
           + ds.delete(ds.find(User.
          
            class
          
          , 
          
            "age"
          
          , 29).get()).getN());
        
          
            //print("delete: " + ds.delete(User.class, 1306911594631L).getN());
          
        
          
            //print("delete: " + ds.delete(User.class, users).getN());
          
        
          
            //ds.delete(ds.createQuery(User.class));
          
        
          
            this
          
          .query();
        
          }
        

3、 Find查詢操作

          
            /**
          
        
          
             * <b>function:</b> find查詢
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2012-2-16 下午10:45:55
          
        
          
             */
          
        
          @Test
        
          
            public
          
          
            void
          
           testFind() {
        
              print(
          
            "find: "
          
           + ds.find(User.
          
            class
          
          ).asList());
        
          
            //like
          
        
              print(
          
            "find-contains: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "name"
          
          ).contains(
          
            "test-1"
          
          ).asList());
        
          
            //忽略大小寫
          
        
              print(
          
            "find-containsIgnoreCase: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "name"
          
          ).containsIgnoreCase(
          
            "ja"
          
          ).asList());
        
        
              print(
          
            "find-endsWith: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "name"
          
          ).endsWith(
          
            "22"
          
          ).asList());
        
              print(
          
            "find-endsWithIgnoreCase: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "name"
          
          ).endsWithIgnoreCase(
          
            "CK"
          
          ).asList());
        
        
          
            //過濾null或是沒有name屬性的
          
        
              print(
          
            "find-doesNotExist: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "name"
          
          ).doesNotExist().asList());
        
          
            //查詢name有值的數(shù)據(jù)
          
        
              print(
          
            "find-doesNotExist: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "name"
          
          ).exists().asList());
        
          
            //age > 48
          
        
              print(
          
            "find-greaterThan: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).greaterThan(66).asList());
        
          
            //age >= 48
          
        
              print(
          
            "find-greaterThan: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).greaterThanOrEq(66).asList());
        
        
              List<Integer> ageList = 
          
            new
          
           ArrayList<Integer>(); 
        
              ageList.add(22);
        
              ageList.add(55);
        
              ageList.add(66);
        
          
            //all
          
        
              print(
          
            "find-hasAllOf: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).hasAllOf(ageList).asList());
        
          
            //in
          
        
              print(
          
            "find-hasAnyOf: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).hasAnyOf(ageList).asList());
        
          
            //not in
          
        
              print(
          
            "find-hasNoneOf: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).hasNoneOf(ageList).asList());
        
          
            //elemMatch
          
        
          
            //print("find-hasThisElement: " + ds.find(User.class).field("age").hasThisElement(55).asList());
          
        
              print(
          
            "find-hasThisOne: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).hasThisOne(55).asList());
        
        
              print(
          
            "find-in: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).in(ageList).asList());
        
              print(
          
            "find-lessThan: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).lessThan(20).asList());
        
              print(
          
            "find-lessThanOrEq: "
          
           + ds.find(User.
          
            class
          
          ).field(
          
            "age"
          
          ).lessThanOrEq(18).asList());
        
        
          
            //print("find-lessThanOrEq: " + ds.find(User.class).field("age").near(.2, .8).asList());
          
        
        
              print(
          
            "find: "
          
           + ds.find(User.
          
            class
          
          , 
          
            "id"
          
          , 1306813979609L).get());
        
              print(
          
            "find: "
          
           + ds.find(User.
          
            class
          
          , 
          
            "age"
          
          , 28, 1, 2).asList());
        
        
              print(
          
            "findAndDelete: "
          
           + ds.findAndDelete(ds.createQuery(User.
          
            class
          
          ).field(
          
            "id"
          
          ).equal(1306813979609L)));
        
              print(
          
            "find: "
          
           + ds.find(User.
          
            class
          
          ).asList());
        
          }
        

4、 Query查詢操作

          
            /**
          
        
          
             * <b>function:</b> query查詢
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2012-2-16 下午10:40:10
          
        
          
             */
          
        
          @Test
        
          
            public
          
          
            void
          
           testQuery() {
        
          
            // 查詢所有
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).asList());
        
          
            // 查詢主鍵
          
        
              print(
          
            "query key: "
          
           + ds.createQuery(User.
          
            class
          
          ).asKeyList());
        
          
            // 結(jié)果集數(shù)量
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).countAll());
        
          
            // 抓取查詢所有記錄
          
        
              Iterable<User> it = ds.createQuery(User.
          
            class
          
          ).fetch();
        
          
            while
          
          (it.iterator().hasNext()) {
        
                  print(
          
            "fetch: "
          
           + it.iterator().next());
        
              }
        
        
          
            // null 
          
        
              it = ds.createQuery(User.
          
            class
          
          ).fetchEmptyEntities();
        
          
            while
          
          (it.iterator().hasNext()) {
        
                  print(
          
            "fetchEmptyEntities: "
          
           + it.iterator().next());
        
              }
        
        
          
            // all key
          
        
              Iterable<Key<User>> itkeys = ds.createQuery(User.
          
            class
          
          ).fetchKeys();
        
          
            while
          
          (itkeys.iterator().hasNext()) {
        
                  print(
          
            "fetchKeys: "
          
           + itkeys.iterator().next());
        
              }
        
        
          
            // age > 24
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).filter(
          
            "age > "
          
          , 24).asList());
        
          
            // age in (20, 28)
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).filter(
          
            "age in "
          
          , newint[] { 20, 28 }).asList());
        
        
          
            // limit 3
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).limit(3).asList());
        
          
            // 分頁類似MySQL
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).offset(11).limit(5).asList());
        
          
            // order排序,默認(rèn)asc
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).order(
          
            "age"
          
          ).asList());
        
          
            //desc
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).order(
          
            "-age"
          
          ).asList());
        
          
            // 組合排序 order by age, name
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).order(
          
            "age, name"
          
          ).asList());
        
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).queryNonPrimary().asList());
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).queryPrimaryOnly().asList());
        
          
            //如果include 為true就表示取該屬性的值,其他的默認(rèn)null,反之為false則該屬性為null,取其他的值
          
        
              print(
          
            "query: "
          
           + ds.createQuery(User.
          
            class
          
          ).retrievedFields(false, 
          
            "age"
          
          ).asList());
        
          }
        

5、 get和count查詢

          
            /**
          
        
          
             * <b>function:</b> get查詢
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2012-2-16 下午10:39:09
          
        
          
             */
          
        
          @Test
        
          
            public
          
          
            void
          
           testGet() {
        
              User user = 
          
            new
          
           User();
        
              user.setId(1306916670518L);
        
              print(
          
            "get: "
          
           + ds.get(user));
        
              List<Long> ids = 
          
            new
          
           ArrayList<Long>();
        
              ids.add(1306907246519L);
        
              ids.add(1306916670524L);
        
          
            // 通過id集合查詢相當(dāng)于in ()
          
        
              print(
          
            "get: "
          
           + ds.get(User.
          
            class
          
          , ids).asList());
        
          
            // id查詢
          
        
              print(
          
            "get: "
          
           + ds.get(User.
          
            class
          
          , 1306916670524L));
        
          }
        
          ?
        
          
            /**
          
        
          
             * <b>function:</b> count查詢
          
        
          
             * @author hoojo
          
        
          
             * @createDate 2012-2-16 下午10:38:02
          
        
          
             */
          
        
          @Test
        
          
            public
          
          
            void
          
           testGetCount() {
        
              User user = 
          
            new
          
           User();
        
              user.setId(1306916670518L);
        
              print(
          
            "getCount: "
          
           + ds.getCount(user));
        
              print(
          
            "getCount: "
          
           + ds.getCount(User.
          
            class
          
          ));
        
        
              List<Long> ids = 
          
            new
          
           ArrayList<Long>();
        
              ids.add(1306907246519L);
        
              ids.add(1306916670524L);
        
              print(
          
            "getCount: "
          
           + ds.getCount(ds.get(User.
          
            class
          
          , ids)));
        
        
          
            // age > 22的記錄
          
        
              print(
          
            "getCount: "
          
           + ds.getCount(ds.createQuery(User.
          
            class
          
          ).filter(
          
            "age > "
          
          , 22)));
        
          
            // 所有
          
        
              print(
          
            "countAll: "
          
           + ds.get(User.
          
            class
          
          , ids).countAll());
        
              print(
          
            "countAll: "
          
           + ds.find(User.
          
            class
          
          ).countAll());
        
          }
        

6、 其他操作

          @Test
        
          
            public
          
          
            void
          
           testOthers() {
        
              query();
        
          
            /** 索引 */
          
        
              ds.ensureIndexes(); 
        
          
            // 同時(shí)用annotation也可以給指定的屬性建立索引
          
        
          
            // 只需用在JavaEntity建立索引的屬性上添加annotation
          
        
          
            /*@Indexed(value = IndexDirection.ASC, name = "address_index")
          
        
          
                String address;
          
        
          
                // 建立唯一索引
          
        
          
                @Indexed(value = IndexDirection.ASC, name = "bandName", unique = true)
          
        
          
                String name;*/
          
        
          ?
        
              ds.ensureCaps();
        
              User user = 
          
            new
          
           User();
        
              user.setId(1306916670518L);
        
              print(
          
            "getDB: "
          
           + ds.getDB());
        
              print(
          
            "getDefaultWriteConcern: "
          
           + ds.getDefaultWriteConcern());
        
              print(
          
            "DBColl: "
          
           + ds.getCollection(User.
          
            class
          
          )); 
          
            // 查詢User對象對應(yīng)的集合
          
        
              Key<User> key = ds.getKey(user); 
          
            // 主鍵
          
        
              print(
          
            "getKey: "
          
           + key);
        
              print(
          
            "exists: "
          
           + ds.exists(user)); 
          
            //是否存在該對象
          
        
              print(
          
            "exists: "
          
           + ds.exists(ds.getKey(user)));
        
        
              print(
          
            "getByKey: "
          
           + ds.getByKey(User.
          
            class
          
          , key));
        
              List<Key<User>> keys = 
          
            new
          
           ArrayList<Key<User>>();
        
              keys.add(key);
        
              user.setId(1306916670521L);
        
              keys.add(ds.getKey(user));
        
              print(
          
            "getByKey: "
          
           + ds.getByKeys(keys));
        
              print(
          
            "getByKey: "
          
           + ds.getByKeys(User.
          
            class
          
          , keys));
        
        
              query();
        
          }
        

用Morphia操作對象相對比較簡單,它對MongoDB對Java的操作進(jìn)行了一些封裝,特別是查詢這方面的。有沒有感覺像是在用Hibernate?

作者: hoojo ?
出處: ?http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html?
blog: http://blog.csdn.net/IBM_hoojo
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

JavaEE
EJB、JDBC、JDO、RMI、JPA、JTA、JMS、 JCA、 JNDI 等等
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?

NoSQL 之 Morphia 操作 MongoDB


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品午夜波多野结衣性色 | 麻豆国内精品久久久久久 | 2020国产精品视频 | 青青久久国产 | 国产精品久久亚洲不卡4k岛国 | 天天干天天碰 | 国产一区二区三区在线视频 | 亚洲欧美中日韩中文字幕 | 国产午夜久久精品 | www.色94色.com| 久久天天躁夜夜躁狠狠 | 亚洲专区一路线二 | 久久一er精这里有精品 | 亚洲中字在线 | 在线91精品亚洲网站精品成人 | 一级毛片一级毛片一级级毛片 | 国产深夜福利视频在线观看 | 欧美精品一区二区三区视频 | 久久这里只有精品18 | 在线成人国产 | 色爱区综合激情五月综合激情 | 日韩 国产 在线 | 一区二区不卡久久精品 | 中文字幕在线一区二区三区 | 青春禁区视频在线观看动漫版 | 国产免费成人在线视频 | 日本网站在线播放 | 一级毛片看真人在线视频 | 国产乱子伦手机在线 | 美女久久 | 国产精品视频一区二区三区 | 可以免费观看欧美一级毛片 | 国内精品久久久久尤物 | 九草视频在线 | 91视频免费观看高清观看完整 | 香蕉亚洲 | 中文字幕三级在线不卡 | 久久久久久久久久爱 | 国产成人综合久久 | 豆国产97在线 | 中国 | 久久综合九色综合狠狠97 |