一.安装
本机windows,直接安装,配置好mongodata文件夹,文件夹下存放mongo.conf,还有db,logs2个文件夹存放数据与日志,配置成windows服务启动
附mongo.conf内容:
#数据库路径
dbpath=F:\dev\mongodata\db
#日志输出文件路径
logpath=F:\dev\mongodata\logs\mongo.log
#错误日志采用追加模式
logappend=true
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true
#端口号 默认为27017
port=27017
二.配置账号密码auth
1.配置
mongodb是不需要账号密码的,但是出于安全考虑,我们还是要给mongodb配上账号密码
重启mongodb服务,加上auth,示例:
mongod --dbpath F:\dev\mongodata\db --logpath F:\dev\mongodata\logs\Mongodb.log –logappend –serviceName MongoDB --auth --install
2.创建自定义账号密码的用户
我用的是3.0+的版本,创建账号密码的命令与以前的版本不一样,网上一开始找的是旧的版本
命令示例:
db.createUser( { "user" : "admin",
"pwd": "123456",
roles:["root"]})
use spider
db.createUser(
{ user: "spiderAdmin",
customData: {description:"superuser"},
pwd: "123456",
roles: [
{ role: "readWrite", db: "spider" },
{ role: "dbAdmin", db: "spider" }
]
}
)
3.MongoDB
注意事项 authentication failed
【一定】要在【命令行
窗口
】里进行创建用户!!!,项目或第三方工具才能
使用用户名密码
连接MongoDB指定的数据库!!!
附:
1.mongodb其他命令学习:
http://www.cnblogs.com/cswuyg/p/4595799.html
三.ORM框架-morphia
pre:mongodb java 连接参考:
http://www.cnblogs.com/hcw13820042015-/p/6145067.html
其中有部分是旧版本代码,方法已经废弃
贴出最新代码:
maven依赖:
<!-- mongodb start-->
<dependency>
<groupId>
org.mongodb
</groupId>
<artifactId>
mongo-java-driver
</artifactId>
<version>
3.4.2
</version>
</dependency>
<dependency>
<groupId>
org.springframework.data
</groupId>
<artifactId>
spring-data-mongodb
</artifactId>
<version>
1.10.6.RELEASE
</version>
<exclusions>
<exclusion>
<artifactId>
spring-expression
</artifactId>
<groupId>
org.springframework
</groupId>
</exclusion>
<exclusion>
<groupId>
org.mongodb
</groupId>
<artifactId>
mongo-java-driver
</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- mongodb end -->
<dependency>
<groupId>
org.mongodb.morphia
</groupId>
<artifactId>
morphia
</artifactId>
<version>
1.3.1
</version>
<exclusions>
<exclusion>
<groupId>
org.mongodb
</groupId>
<artifactId>
mongo-java-driver
</artifactId>
</exclusion>
</exclusions>
</dependency>
java部分:
1.datastore
import
com.google.common.collect.Lists
;
import
com.mongodb.Mongo
;
import
com.mongodb.MongoClient
;
import
com.mongodb.MongoCredential
;
import
org.mongodb.morphia.Datastore
;
import
org.mongodb.morphia.Morphia
;
import
org.springframework.beans.factory.config.AbstractFactoryBean
;
import
java.util.List
;
public class
DatastoreFactoryBean
extends
AbstractFactoryBean<Datastore> {
private
Morphia
morphia
;
//morphia实例,最好是单例
private
Mongo
mongo
;
//mongo实例,最好是单例
private
String
dbName
;
//数据库名
private
String
username
;
//用户名,可为空
private
String
password
;
//密码,可为空
private boolean
toEnsureIndexes
=
false;
//是否确认索引存在,默认false
private boolean
toEnsureCaps
=
false;
//是否确认caps存在,默认false
@Override
protected
Datastore
createInstance
()
throws
Exception {
//这里的username和password可以为null,morphia对象会去处理
MongoCredential credential = MongoCredential.
createScramSha1Credential
(
username
,
dbName
,
password
.toCharArray())
;
List<MongoCredential> credentialsList =
Lists
.
newArrayList
(credential)
;
MongoClient mongoClient =
new
MongoClient(
mongo
.getAllAddress()
,
credentialsList)
;
Datastore ds =
morphia
.createDatastore(mongoClient
,
dbName
)
;
//morphia.createDatastore(mongo, dbName, username, password == null ? null : password.toCharArray());
if
(
toEnsureIndexes
) {
ds.ensureIndexes()
;
}
if
(
toEnsureCaps
) {
ds.ensureCaps()
;
}
return
ds
;
}
@Override
public
Class<?>
getObjectType
() {
return
Datastore.
class;
}
@Override
public void
afterPropertiesSet
()
throws
Exception {
super
.afterPropertiesSet()
;
if
(
mongo
==
null
) {
throw new
IllegalStateException(
"mongo is not set"
)
;
}
if
(
morphia
==
null
) {
throw new
IllegalStateException(
"morphia is not set"
)
;
}
}
/*----------------------setters-----------------------*/
}
2.mongo
import
com.mongodb.*
;
import
org.springframework.beans.factory.config.AbstractFactoryBean
;
import
java.util.ArrayList
;
import
java.util.List
;
public class
MongoFactoryBean
extends
AbstractFactoryBean<Mongo> {
// 表示服务器列表(主从复制或者分片)的字符串数组
private
String[]
serverStrings
;
// 是否主从分离(读取从库),默认读写都在主库
private boolean
readSecondary
=
false;
// 设定写策略(出错时是否抛异常),默认采用SAFE模式(需要抛异常)
private
WriteConcern
writeConcern
= WriteConcern.
JOURNALED
;
@Override
public
Class<?>
getObjectType
() {
return
Mongo.
class;
}
@Override
protected
Mongo
createInstance
()
throws
Exception {
MongoClient mongo = initMongo()
;
// 设定主从分离
if
(
readSecondary
) {
mongo.setReadPreference(ReadPreference.
secondaryPreferred
())
;
}
// 设定写策略
mongo.setWriteConcern(
writeConcern
)
;
return
mongo
;
}
/**
* 初始化mongo实例
*
*
@return
*
@throws
Exception
*/
private
MongoClient
initMongo
()
throws
Exception {
// 根据条件创建Mongo实例
MongoClient mongo =
null;
List<ServerAddress> serverList = getServerList()
;
if
(serverList.size() ==
0
) {
mongo =
new
MongoClient()
;
}
else if
(serverList.size() ==
1
) {
mongo =
new
MongoClient(serverList.get(
0
))
;
}
else
{
mongo =
new
MongoClient(serverList)
;
}
return
mongo
;
}
/**
* 根据服务器字符串列表,解析出服务器对象列表
*
<p>
*
*
@return
*
@throws
Exception
*
@Title:
getServerList
*
</p>
*/
private
List<ServerAddress>
getServerList
()
throws
Exception {
List<ServerAddress> serverList =
new
ArrayList<ServerAddress>()
;
try
{
for
(String serverString :
serverStrings
) {
String[] temp = serverString.split(
":"
)
;
String host = temp[
0
]
;
if
(temp.
length
>
2
) {
throw new
IllegalArgumentException(
"Invalid server address string: "
+ serverString)
;
}
if
(temp.
length
==
2
) {
serverList.add(
new
ServerAddress(host
,
Integer
.
parseInt
(temp[
1
])))
;
}
else
{
serverList.add(
new
ServerAddress(host))
;
}
}
return
serverList
;
}
catch
(Exception e) {
throw new
Exception(
"Error while converting serverString to ServerAddressList"
,
e)
;
}
}
}
3.morphia
import
org.mongodb.morphia.Morphia
;
import
org.springframework.beans.factory.config.AbstractFactoryBean
;
public class
MorphiaFactoryBean
extends
AbstractFactoryBean<Morphia> {
/**
* 要扫描并映射的包
*/
private
String[]
mapPackages
;
/**
* 要映射的类
*/
private
String[]
mapClasses
;
/**
* 扫描包时,是否忽略不映射的类
* 这里按照Morphia的原始定义,默认设为false
*/
private boolean
ignoreInvalidClasses
;
@Override
protected
Morphia
createInstance
()
throws
Exception {
Morphia m =
new
Morphia()
;
if
(
mapPackages
!=
null
) {
for
(String packageName :
mapPackages
) {
m.mapPackage(packageName
,
ignoreInvalidClasses
)
;
}
}
if
(
mapClasses
!=
null
) {
for
(String entityClass :
mapClasses
) {
m.map(Class.
forName
(entityClass))
;
}
}
return
m
;
}
@Override
public
Class<?>
getObjectType
() {
return
Morphia.
class;
}
}
dao示例:
import
com.lianj.data.spider.center.mongo.pojo.OriginalMatPrice
;
import
org.mongodb.morphia.Datastore
;
import
org.mongodb.morphia.dao.BasicDAO
;
public class
OriginalMatPriceDAO
extends
BasicDAO<
OriginalMatPrice
,
Integer> {
protected
OriginalMatPriceDAO
(Datastore ds) {
super
(ds)
;
}
}
xml部分:
<
mongo
:mongo-client
id
="mongo"
replica-set
="${mongoDB.server}"
>
<
mongo
:client-options
connections-per-host
="${mongoDB.preHost}"
threads-allowed-to-block-for-connection-multiplier
="${mongoDB.multiplier}"
connect-timeout
="${mongoDB.connectTimeout}"
max-wait-time
="${mongoDB.waitTimeout}"
socket-keep-alive
="${mongoDB.keepAlive}"
socket-timeout
="${mongoDB.socketTimeout}"
/>
</
mongo
:mongo-client>
<!-- 使用工厂创建morphia实例,同时完成类映射操作 -->
<bean
id
="morphia"
class
="com.lianj.data.spider.center.mongo.factory.MorphiaFactoryBean"
>
<!-- 指定要扫描的POJO包路径 -->
<property
name
="mapPackages"
>
<array>
<value>
com.lianj.data.spider.center.mongo.pojo
</value>
</array>
</property>
<!-- 指定要映射的类 -->
<!-- <property name="mapClasses">
<array>
<value>me.watchzerg.test.morphia.pojo.Hotel</value>
<value>me.watchzerg.test.morphia.pojo.Address</value>
</array>
</property> -->
<!-- 扫描包时是否忽略不可用的类,默认为false -->
<!-- <property name="ignoreInvalidClasses" value="false"/> -->
</bean>
<!-- 使用工厂创建datastore,同时完成index和caps的确认操作 -->
<bean
id
="datastore"
class
="com.lianj.data.spider.center.mongo.factory.DatastoreFactoryBean"
>
<property
name
="morphia"
ref
="morphia"
/>
<property
name
="mongo"
ref
="mongo"
/>
<!-- collection的名称 -->
<property
name
="dbName"
value
="${mongoDB.dbName}"
/>
<!-- 用户名和密码可以为空 -->
<property
name
="username"
value
="${mongoDB.username}"
/>
<property
name
="password"
value
="${mongoDB.password}"
/>
<!-- 是否进行index和caps的确认操作,默认为flase -->
<property
name
="toEnsureIndexes"
value
="true"
/>
<property
name
="toEnsureCaps"
value
="true"
/>
</bean>
<!-- ===============以下是具体DAO的实现===================== -->
<bean
id
="originalSupplierDAO"
class
="com.lianj.data.spider.center.mongo.dao.OriginalSupplierDAO"
>
<constructor-arg
ref
="datastore"
/>
</bean>
properties部分:
#mongo 属性配置
mongoDB.preHost
=
200
mongoDB.multiplier
=
100
mongoDB.connectTimeout
=
1000
mongoDB.waitTimeout
=
1500
mongoDB.keepAlive
=
true
mongoDB.socketTimeout
=
1500
#mongodb账号密码
mongoDB.username
=
xxx
mongoDB.password
=
xxx
mongoDB.server
=
192.168.xxx.xxx:27017
mongoDB.dbName
=
xxx
附morphia学习网页:
3.
使用 Morphia 和 MongoDB 实现域模型持久性