小试MongoDB及Java的CRUD
http://www.cnblogs.com/varlxj/archive/2010/03/12/1684181.html
最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com
看过JavaEye的Robbin的《NoSQL数据库探讨之一 - 为什么要用非关系数据库?》后,才知道,原来世界上还有这样的一种数据库,并深深的为其性能着迷。不过非关系数据库的成熟程序毕竟还不能和传统的关系数据库比,实在是不敢在实际工程中使用。
最近在想大量测试数据如何存放的时候,突然觉得非关系数据库非常合适,又查了一下,发现原来非关系数据库已经挺成熟了,很大国际性的大网站也开始运用,而我想存储的大量数据,非常的对应KEY-VALUE这样的结构。想用就学一下吧,经过比对后,我选择了MongoDB。
去官方网站下载了程序,“绿色”的,通过命令行直接运行BIN下面的服务器mongod.exe即可,不过默认的数据库位置在C盘下,这总是不大合适,可以通过加参数 -dbpath来改变,如
mongod.exe –dbpath d:/db
注意这里有个问题,Windows下,一般是使用\作为路径分隔符的,不过在这里,如果直接使用d:\db这样的话,mongod会把\去掉,变成d:db这样,导致启动失败,所以比较简单的方法就是用/来代替\
服务器启动后,可以在浏览器中访问,默认地址是:http://127.0.0.1:28017/,里面会有一些数据库的基本信息
访问数据库可以使用BIN下面的mongo.exe,是个命令行工具。对于用惯了MS-SQL,MySQL这样有良好的数据库UI工具的我来说,让我直接用命令行去操作数据库实在是有些不习惯,在网上查了一下,UI工具有倒是有,不过都不大完善的样子,也就懒得下了。在命令行下,输入help可以看到基本操作命令:
show dbs:显示数据库列表
show collections:显示当前数据库中的集合(类似关系数据库中的表)
show users:显示用户
use <db name>:切换当前数据库,这和MS-SQL里面的意思一样
db.help():显示数据库操作命令,里面有很多的命令
db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
------------------------------------------------
大致的说明一下MongoDB中的数据格式,我没有去详细的查看官方的文档,只是按我试用过的感觉来说,其数据结构,类似JSON,即key-value成对,key一般就是String,而value而无所谓了,如一个JSON数据:
{
name:"凤姐",
birthday:{
year:1987,
month:1,
day:20
}
}
只要你愿意,就可以把Value不断的复杂化,以方便存储数据
-----------------------------------------------------------
要使用Java操作MongoDB的话,要到官方网站下载一个驱动包,点击网站上的Drivers里面,可以看到目前支持的语言,非常的多……把包导入后,可以尝试来操作了(记得一定要开着服务器)
首先介绍一下比较常用的几个类
Mongo:连接服务器,执行一些数据库操作的选项,如新建立一个数据库等
DB:对应一个数据库,可以用来建立集合等操作
DBCollection:对应一个集合(类似表),可能是我们用得最多的,可以添加删除记录等
DBObject接口和BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,因为是key-value的数据结构,所以用起来其实和HashMap是基本一致的
DBCursor:用来遍历取得的数据,实现了Iterable和Iterator
接下来实际的操作一下,代码如下:
01 | import com.mongodb.*; |
02 |
03 | public class Main { |
04 | public static void main(String[] args) { |
05 | try { |
06 | Mongo m = new Mongo( "127.0.0.1" ); |
07 | //选择数据库,如果没有这个数据库的话,会自动建立 |
08 | DB db = m.getDB( "mongo" ); |
09 | //列出所有数据库名,不过发现,如果数据库里面是没有数据的话,并不会被列出来 |
10 | System.out.println( "数据库列表:" +m.getDatabaseNames()); |
11 |
12 | //建立一个集合,和数据库一样,如果没有,会自动建立 |
13 | DBCollection col = db.getCollection( "col" ); |
14 | //列出所有集合名,和数据库一样,如果集合里面是没有数据的话,并不会被列出来 |
15 | System.out.println( "当前数据库下的集合列表:" +db.getCollectionNames()); |
16 |
17 | //建立一个数据项,重复执行会多次添加一样的数据 |
18 | BasicDBObject val = new BasicDBObject(); |
19 | val.put( "name" , "凤姐" ); |
20 | col.save(val); |
21 | //保存的数据为 |
22 | //{ "_id" : "4b8de2f3053068a371e870c0" , "name" : "凤姐"} |
23 | //_id是系统自动帮加上的,全局唯一 |
24 | //多次加入一样的数据时,_id都是不一样的 |
25 |
26 | //取得所有数据并打印出来 |
27 | DBCursor ite = col.find(); |
28 | while (ite.hasNext()) |
29 | { |
30 | System.out.println(ite.next()); |
31 | } |
32 | } catch (Exception error) |
33 | { |
34 | error.printStackTrace(); |
35 | } |
36 | } |
37 | } |
----------------------------更新操作--------------------------
01 | import com.mongodb.*; |
02 |
03 | public class Main { |
04 | public static void main(String[] args) { |
05 | try { |
06 | Mongo m = new Mongo( "127.0.0.1" ); |
07 | DB db = m.getDB( "mongo" ); |
08 | DBCollection col = db.getCollection( "col" ); |
09 |
10 | System.out.println( "修改前:" ); |
11 | showData(col); |
12 |
13 | //查找所有 name=凤姐 的项,并更新 |
14 | BasicDBObject old_val = new BasicDBObject(),new_val = new BasicDBObject(); |
15 | old_val.put( "name" , "凤姐无敌" ); |
16 | new_val.put( "name" , "凤姐无敌" ); |
17 | col.update(old_val, new_val); //只会更新一个 |
18 | //col.updateMulti(new_val, old_val)不知道怎么回事,这函数不顶用 |
19 |
20 | System.out.println( "修改后:" ); |
21 | showData(col); |
22 | } catch (Exception error) |
23 | { |
24 | error.printStackTrace(); |
25 | } |
26 | } |
27 |
28 | static void showData(DBCollection col) |
29 | { |
30 | DBCursor ite = col.find(); |
31 | while (ite.hasNext()) |
32 | { |
33 | System.out.println(ite.next()); |
34 | } |
35 | } |
36 | } |
最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com
看过JavaEye的Robbin的《NoSQL数据库探讨之一 - 为什么要用非关系数据库?》后,才知道,原来世界上还有这样的一种数据库,并深深的为其性能着迷。不过非关系数据库的成熟程序毕竟还不能和传统的关系数据库比,实在是不敢在实际工程中使用。
最近在想大量测试数据如何存放的时候,突然觉得非关系数据库非常合适,又查了一下,发现原来非关系数据库已经挺成熟了,很大国际性的大网站也开始运用,而我想存储的大量数据,非常的对应KEY-VALUE这样的结构。想用就学一下吧,经过比对后,我选择了MongoDB。
去官方网站下载了程序,“绿色”的,通过命令行直接运行BIN下面的服务器mongod.exe即可,不过默认的数据库位置在C盘下,这总是不大合适,可以通过加参数 -dbpath来改变,如
mongod.exe –dbpath d:/db
注意这里有个问题,Windows下,一般是使用\作为路径分隔符的,不过在这里,如果直接使用d:\db这样的话,mongod会把\去掉,变成d:db这样,导致启动失败,所以比较简单的方法就是用/来代替\
服务器启动后,可以在浏览器中访问,默认地址是:http://127.0.0.1:28017/,里面会有一些数据库的基本信息
访问数据库可以使用BIN下面的mongo.exe,是个命令行工具。对于用惯了MS-SQL,MySQL这样有良好的数据库UI工具的我来说,让我直接用命令行去操作数据库实在是有些不习惯,在网上查了一下,UI工具有倒是有,不过都不大完善的样子,也就懒得下了。在命令行下,输入help可以看到基本操作命令:
show dbs:显示数据库列表
show collections:显示当前数据库中的集合(类似关系数据库中的表)
show users:显示用户
use <db name>:切换当前数据库,这和MS-SQL里面的意思一样
db.help():显示数据库操作命令,里面有很多的命令
db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
------------------------------------------------
大致的说明一下MongoDB中的数据格式,我没有去详细的查看官方的文档,只是按我试用过的感觉来说,其数据结构,类似JSON,即key-value成对,key一般就是String,而value而无所谓了,如一个JSON数据:
{
name:"凤姐",
birthday:{
year:1987,
month:1,
day:20
}
}
只要你愿意,就可以把Value不断的复杂化,以方便存储数据
-----------------------------------------------------------
要使用Java操作MongoDB的话,要到官方网站下载一个驱动包,点击网站上的Drivers里面,可以看到目前支持的语言,非常的多……把包导入后,可以尝试来操作了(记得一定要开着服务器)
首先介绍一下比较常用的几个类
Mongo:连接服务器,执行一些数据库操作的选项,如新建立一个数据库等
DB:对应一个数据库,可以用来建立集合等操作
DBCollection:对应一个集合(类似表),可能是我们用得最多的,可以添加删除记录等
DBObject接口和BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,因为是key-value的数据结构,所以用起来其实和HashMap是基本一致的
DBCursor:用来遍历取得的数据,实现了Iterable和Iterator
接下来实际的操作一下,代码如下:
01 | import com.mongodb.*; |
02 |
03 | public class Main { |
04 | public static void main(String[] args) { |
05 | try { |
06 | Mongo m = new Mongo( "127.0.0.1" ); |
07 | //选择数据库,如果没有这个数据库的话,会自动建立 |
08 | DB db = m.getDB( "mongo" ); |
09 | //列出所有数据库名,不过发现,如果数据库里面是没有数据的话,并不会被列出来 |
10 | System.out.println( "数据库列表:" +m.getDatabaseNames()); |
11 |
12 | //建立一个集合,和数据库一样,如果没有,会自动建立 |
13 | DBCollection col = db.getCollection( "col" ); |
14 | //列出所有集合名,和数据库一样,如果集合里面是没有数据的话,并不会被列出来 |
15 | System.out.println( "当前数据库下的集合列表:" +db.getCollectionNames()); |
16 |
17 | //建立一个数据项,重复执行会多次添加一样的数据 |
18 | BasicDBObject val = new BasicDBObject(); |
19 | val.put( "name" , "凤姐" ); |
20 | col.save(val); |
21 | //保存的数据为 |
22 | //{ "_id" : "4b8de2f3053068a371e870c0" , "name" : "凤姐"} |
23 | //_id是系统自动帮加上的,全局唯一 |
24 | //多次加入一样的数据时,_id都是不一样的 |
25 |
26 | //取得所有数据并打印出来 |
27 | DBCursor ite = col.find(); |
28 | while (ite.hasNext()) |
29 | { |
30 | System.out.println(ite.next()); |
31 | } |
32 | } catch (Exception error) |
33 | { |
34 | error.printStackTrace(); |
35 | } |
36 | } |
37 | } |
----------------------------更新操作--------------------------
01 | import com.mongodb.*; |
02 |
03 | public class Main { |
04 | public static void main(String[] args) { |
05 | try { |
06 | Mongo m = new Mongo( "127.0.0.1" ); |
07 | DB db = m.getDB( "mongo" ); |
08 | DBCollection col = db.getCollection( "col" ); |
09 |
10 | System.out.println( "修改前:" ); |
11 | showData(col); |
12 |
13 | //查找所有 name=凤姐 的项,并更新 |
14 | BasicDBObject old_val = new BasicDBObject(),new_val = new BasicDBObject(); |
15 | old_val.put( "name" , "凤姐无敌" ); |
16 | new_val.put( "name" , "凤姐无敌" ); |
17 | col.update(old_val, new_val); //只会更新一个 |
18 | //col.updateMulti(new_val, old_val)不知道怎么回事,这函数不顶用 |
19 |
20 | System.out.println( "修改后:" ); |
21 | showData(col); |
22 | } catch (Exception error) |
23 | { |
24 | error.printStackTrace(); |
25 | } |
26 | } |
27 |
28 | static void showData(DBCollection col) |
29 | { |
30 | DBCursor ite = col.find(); |
31 | while (ite.hasNext()) |
32 | { |
33 | System.out.println(ite.next()); |
34 | } |
35 | } |
36 | } |