mongdb的使用:
系统环境如下:
spring +springmvc+mongodb +spring-data-mongodb
版本:(使用说明在使用spring-data-mongodb的包的版本的时候选择的spring版本和jdk版本是有关系的,spring-data-mongodb2.X版本中用的是spring5.X版本或者是spring4.3以上的版本具体我还没有时间去研究对应的版本号,而且不同的版本里面的api方法是不一样的要对好配置文件中的属性参数,版本高的可能jdk1.7的不支持,需要jdk1.8以上版本请注意报错内容选择合适的版本)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.3.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<org.springframework.version>4.1.3.RELEASE</org.springframework.version>
《以上是相关的spring配置》
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.13.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.12.RELEASE</version>
</dependency>
《以上是相关的spring-mongo-data的配置》
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<mongo:mongo replica-set="${mongo.hostport}">
<mongo:options connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
auto-connect-retry="true"
socket-keep-alive="true"
socket-timeout="${mongo.socketTimeout}"
slave-ok="true"
write-number="1"
write-timeout="0"
write-fsync="true"
/>
</mongo:mongo>
<mongo:db-factory username="${mongo.username}" password="${mongo.password}" dbname="${mongo.dbname}" mongo-ref="mongo"/>
<!--<bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">-->
<!--<!– 去除默认生成“_class”字段的关键,即:将该类带有typeKey参数的构造函数的参数值设置为null即可 –>-->
<!--<constructor-arg name="typeKey"><null/></constructor-arg>-->
<!--</bean>-->
<!--MongoDB类型转换器,可自定义扩展类型之间的转换,注意“type-mapper-ref”属性 -->
<!--<mongo:mapping-converter id="mongoConverter" type-mapper-ref="defaultMongoTypeMapper">-->
<!--<mongo:custom-converters>-->
<!--<mongo:converter>-->
<!--<bean class="com.comm.conf.TimestampConverter" />-->
<!--</mongo:converter>-->
<!--</mongo:custom-converters>-->
<!--</mongo:mapping-converter>-->
<bean id="MongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<!--<constructor-arg name="mongoConverter" ref="mongoConverter" />-->
</bean>
</beans>
《以上是spring-mongo-的配置文件要配置到初始化加载文件中》
配置文件:
########mongoDB配置文件设置############
#host
mongo.hostport=127.0.0.1:27017
mongo.username=root
mongo.password=root
#DB name
mongo.dbname =test
#port
mongo.connectionsPerHost= 8
#线程最大连接数
mongo.threadsAllowedToBlockForConnectionMultiplier= 4
#connectTimeout ms
mongo.connectTimeout= 1500
#maxWaitTime
mongo.maxWaitTime= 1500
#自动连接
mongo.autoConnectRetry= true
#socketKeepAlive
mongo.socketKeepAlive= true
#socketTimeout
mongo.socketTimeout=1500
#读写分离
mongo.slaveOk=true
MongoTemplate
注意我们使用的是这个模板对象操作数据库的。是属于core包中的
MongoRepository 这个接口中封装了一下操作mongodb的方法,看自己使用哪一种方法来比较符合自己的业务逻辑
MongoTemplate:
(param.getCollectionName()集合名称我为了好分辨专门放了个集合名称的参数,如果不传param.getCollectionName()这个参数默认集合的名称就是类名称。
MessageMongodb.class 是集合的实体类,如果不给集合名称那么就是默认实体类名名称了。
实体类
@Document //mongodb实体映射对象 可以指定集合名称:
(collection=“”“集合名称”)指定后集合名称就是对应的这个实体类了。如果有许多集合要对应此实体类我还不知道怎么映射。?
用MongoRepository 可以自己设置集合映射名称,但是方法局限,我最后还是选择了MongoTemplate,映射集合的目的我是为了让他自动创建索引对象。 使用注解在参数上在保存数据的时候就自动创建对象索引了。
MessageMongodb{
@Id
private String id;
@Indexedprivate String mesgTableName
get set方法自己填写。
}
-------------------------------------------------------------------------------------------------------------------
mongoTemplate.createCollection(param.getCollectionName()); //创建集合,集合也就是相当于我们mysql中说的表
mongoTemplate.getCollection(param.getCollectionName()).createIndex() 创建集合索引
创建复合索引:
DBObject indexOptions = new BasicDBObject(); indexOptions.put("字段名称1", 1); indexOptions.put("字段名称2", 1);
mongoTemplate.getCollection(param.getCollectionName()).createIndex(indexOptions, "group_index");
mongoTemplate.insert(xx.class, "集合名称");
分页方法:
@Override
public Page<MessageMongodb> selectPage(Query query, MessageMongodb messageMongodb, Page<MessageMongodb> page) {
query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "created")));
int skip = (page.getCurrentPage() - 1) * page.getPageSize();
query.skip(skip);// 从那条记录开始
query.limit(page.getPageSize());// 取多少条记录
List<MessageMongodb> List= mongoTemplate.find(query, MessageMongodb.class,MessageMongodb.getMesgTableName());
//动态拼接查询条件
//计算总数
long total = mongoTemplate.count(query, MessageMongodb.class, dxMessageMongodb.getMesgTableName());
//查询结果集
// List<MessageMongodb> List = mongoTemplate.find(query.with(pageable), MessageMongodb.class, MessageMongoPara.getCollectionName());
Page<MessageMongodb> pageList = new Page<MessageMongodb>();
if (total <= 0) {
return pageList;
}
pageList.setTotalCount(((int) total));
pageList.setResult(List);
pageList.setCurrentPage(page.getCurrentPage());
return pageList;
}
结合前端分页对象展示。
mongoTemplate.remove(query, MessageMongodb.class, param.getCollectionName());//删除方法。
上述方法中有个参数query 这个query也就是sql中的where参数条件。
在mongodb中设置自己的参数条件封装个自己参数方法:
@Override
public Query setCriteriaInfo(MessageMongodb Message) {
Criteria criteria = new Criteria();
criteria.where("1=1");
if(StringUtils.isNotEmpty(Message.getMesgTableName())){
criteria.and("mesgTableName").is(Message.getMesgTableName());
}
if(StringUtils.isNotEmpty(dxMessage.getKeyId())){
criteria.and("keyId").is(dxMessage.getKeyId());
}
Query query = new Query(criteria);
return query;
}
@Override //更新方法有返回值可以判断是否更新成功。 {
mongoTemplate.updateFirst(query, update, param.getCollectionName());
final WriteResult writeResult = mongoTemplate.updateFirst(query, update,
MessageMongodb.class, param.getCollectionName());
if (writeResult.getN() <= 0) {//
throw new RuntimeException("更新数据异常!");
}
return true;
}
updateFirst更新查询出来的第一条数据。