大明天 發表於 2019-10-28 09:24:00

Spring整合MongoDB(转)

<p>1.认识Spring Data MongoDB</p>
<p><br>&nbsp; &nbsp; &nbsp; &nbsp; 之前还的确不知道Spring连集成Nosql的东西都实现了,还以为自己又要手动封装一个操作MongoDB的API呢,结果就发现了Spring Data MongoDB。不愧是Spring,真是给了我们春天,佩服的渣渣我目瞪狗呆……</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 废话少说,看招。Spring Data其实是一个高级别的Spring Source项目,而Spring Data MongoDB仅仅是其中的一个子项目。Spring Data旨在为关系型数据库、非关系型数据、Map-Reduce框架、云数据服务等等提供统一的数据访问API。<br>&nbsp; &nbsp; &nbsp; &nbsp; 无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。</p>
<p>Spring Data 包含多个子项目:</p>
<p>Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化<br>Hadoop&nbsp;- 基于 Spring 的 Hadoop 作业配置和一个 POJO 编程模型的 MapReduce 作业<br>Key-Value &nbsp;- 集成了&nbsp;Redis&nbsp;和&nbsp;Riak&nbsp;,提供多个常用场景下的简单封装<br>Document - 集成文档数据库:CouchDB&nbsp;和&nbsp;MongoDB&nbsp;并提供基本的配置映射和资料库支持<br>Graph - 集成&nbsp;Neo4j&nbsp;提供强大的基于 POJO 的编程模型<br>Graph Roo AddOn - Roo support for Neo4j<br>JDBC Extensions - 支持&nbsp;Oracle&nbsp;RAD、高级队列和高级数据类型<br>JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能<br>Mapping - 基于 Grails 的提供对象映射框架,支持不同的数据库<br>Examples - 示例程序、文档和图数据库<br>Guidance - 高级文档<br>2. HelloWorld</p>
<p>好了,说了这么多,还是用代码表现最为实在,老规矩,Hello World,我这里创建了一个Maven Java项目demo。<br>2.1 配置依赖</p>
<p>【pom.xml】</p>
<div class="cnblogs_code">
<pre>&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<span style="color: rgba(0, 0, 0, 1)">
    xsi:schemaLocation</span>="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

    &lt;groupId&gt;com.jastar&lt;/groupId&gt;
    &lt;artifactId&gt;demo&lt;/artifactId&gt;
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
    &lt;packaging&gt;jar&lt;/packaging&gt;

    &lt;name&gt;demo&lt;/name&gt;
    &lt;url&gt;http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.jastar-wang.tech&lt;/url&gt;</span>

    &lt;!-- 版本配置 --&gt;
    &lt;properties&gt;
      &lt;spring.version&gt;4.1.4.RELEASE&lt;/spring.version&gt;
      &lt;spring.data.version&gt;1.7.0.RELEASE&lt;/spring.data.version&gt;
      &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt;
    &lt;/properties&gt;

    &lt;dependencies&gt;
      &lt;!-- 单元测试包 --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;junit&lt;/groupId&gt;
            &lt;artifactId&gt;junit&lt;/artifactId&gt;
            &lt;version&gt;4.10&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
      &lt;/dependency&gt;

      &lt;!-- spring核心包 --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-context&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-beans&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-tx&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-aop&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-test&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;!-- 关系型数据库整合时需配置 如hibernate jpa等 --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-orm&lt;/artifactId&gt;
            &lt;version&gt;${spring.version}&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;!-- spring aop 关联 --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
            &lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;
            &lt;version&gt;1.8.7&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;!-- log4j --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;log4j&lt;/groupId&gt;
            &lt;artifactId&gt;log4j&lt;/artifactId&gt;
            &lt;version&gt;${log4j.version}&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;!-- spring整合MongoDB --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.data&lt;/groupId&gt;
            &lt;artifactId&gt;spring-data-mongodb&lt;/artifactId&gt;
            &lt;version&gt;${spring.data.version}&lt;/version&gt;
      &lt;/dependency&gt;

    &lt;/dependencies&gt;

    &lt;repositories&gt;
      &lt;repository&gt;
            &lt;id&gt;spring-milestone&lt;/id&gt;
            &lt;name&gt;Spring Maven MILESTONE Repository&lt;/name&gt;
            &lt;url&gt;http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">repo.spring.io/libs-milestone&lt;/url&gt;</span>
      &lt;/repository&gt;
    &lt;/repositories&gt;

    &lt;build&gt;
      &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
                &lt;configuration&gt;
                  &lt;source&gt;1.7&lt;/source&gt;
                  &lt;target&gt;1.7&lt;/target&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/build&gt;
&lt;/project&gt;</pre>
</div>
<div>
<div>
<div>注意:这里我使用的是Spring Data MongoDB 1.7.0版本,截止当前发文时间最新稳定版本应该是1.10.1</div>
</div>
</div>
<h2>2.2 映射实体类</h2>
<div>【UserInfo.java】</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.entity;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.Serializable;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.sql.Timestamp;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.annotation.Id;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.index.IndexDirection;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.index.Indexed;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.Document;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.Field;

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 用户实体类
* &lt;p&gt;
* ClassName: UserInfo
* &lt;/p&gt;
* &lt;p&gt;
* Description:本类用来展示MongoDB实体类映射的使用
* &lt;/p&gt;
* &lt;p&gt;
* Copyright: (c)2017 Jastar·Wang,All rights reserved.
* &lt;/p&gt;
*
* </span><span style="color: rgba(128, 128, 128, 1)">@author</span><span style="color: rgba(0, 128, 0, 1)"> Jastar·Wang
* @date 2017年4月12日
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Document(collection </span>= "coll_user"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> UserInfo <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> Serializable {

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)"> serialVersionUID </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">long</span> serialVersionUID = 1L<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 主键使用此注解</span>
<span style="color: rgba(0, 0, 0, 1)">    @Id
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 字段使用此注解</span>
<span style="color: rgba(0, 0, 0, 1)">    @Field
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 字段还可以用自定义名称</span>
    @Field("myage"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 还可以生成索引</span>
    @Indexed(name = "index_birth", direction =<span style="color: rgba(0, 0, 0, 1)"> IndexDirection.DESCENDING)
    @Field
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Timestamp birth;

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getId() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> id;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setId(String id) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.id =<span style="color: rgba(0, 0, 0, 1)"> id;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getName() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> name;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setName(String name) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name =<span style="color: rgba(0, 0, 0, 1)"> name;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getAge() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> age;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> setAge(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.age =<span style="color: rgba(0, 0, 0, 1)"> age;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Timestamp getBirth() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> birth;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setBirth(Timestamp birth) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.birth =<span style="color: rgba(0, 0, 0, 1)"> birth;
    }

}</span></pre>
</div>
<p>附录:<br>@Id&nbsp;- 用于字段级别,标记这个字段是一个主键,默认生成的名称是“_id”</p>
<p>@Document&nbsp;- 用于类,以表示这个类需要映射到数据库,您也可以指定映射到数据库的集合名称</p>
<p>@DBRef&nbsp;- 用于字段,以表示它将使用com.mongodb.DBRef进行存储。</p>
<p>@Indexed&nbsp;- 用于字段,表示该字段需要如何创建索引</p>
<p>@CompoundIndex&nbsp;- 用于类,以声明复合索引</p>
<p>@GeoSpatialIndexed&nbsp;- 用于字段,进行地理位置索引</p>
<p>@TextIndexed&nbsp;- 用于字段,标记该字段要包含在文本索引中</p>
<p>@Language&nbsp;- 用于字段,以设置文本索引的语言覆盖属性。</p>
<p>@Transient&nbsp;- 默认情况下,所有私有字段都映射到文档,此注解将会去除此字段的映射</p>
<p>@PersistenceConstructor&nbsp;- 标记一个给定的构造函数,即使是一个protected修饰的,在从数据库实例化对象时使用。构造函数参数通过名称映射到检索的DBObject中的键值。</p>
<p>@Value&nbsp;- 这个注解是Spring框架的一部分。在映射框架内,它可以应用于构造函数参数。这允许您使用Spring表达式语言语句来转换在数据库中检索的键值,然后再用它来构造一个域对象。为了引用给定文档的属性,必须使用以下表达式:@Value("#root.myProperty"),root要指向给定文档的根。</p>
<p>@Field&nbsp;- 用于字段,并描述字段的名称,因为它将在MongoDB BSON文档中表示,允许名称与该类的字段名不同。</p>
<p>@Version&nbsp;- 用于字段锁定,保存操作时检查修改。初始值是0,每次更新时自动触发。</p>
<p>2.3 整合配置</p>
<p>【db.properties】</p>
<div class="cnblogs_code">
<pre>###---The mongodb settings---<span style="color: rgba(0, 0, 0, 1)">
mongo.dbname</span>=<span style="color: rgba(0, 0, 0, 1)">demo
mongo.host</span>=<span style="color: rgba(0, 0, 0, 1)">localhost
mongo.port</span>=27017<span style="color: rgba(0, 0, 0, 1)">
mongo.connectionsPerHost</span>=8<span style="color: rgba(0, 0, 0, 1)">
mongo.threadsAllowedToBlockForConnectionMultiplier</span>=4<span style="color: rgba(0, 0, 0, 1)">
mongo.connectTimeout</span>=1000<span style="color: rgba(0, 0, 0, 1)">
mongo.maxWaitTime</span>=1500<span style="color: rgba(0, 0, 0, 1)">
mongo.autoConnectRetry</span>=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
mongo.socketKeepAlive</span>=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
mongo.socketTimeout</span>=1500<span style="color: rgba(0, 0, 0, 1)">
mongo.slaveOk</span>=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
mongo.writeNumber</span>=1<span style="color: rgba(0, 0, 0, 1)">
mongo.writeTimeout</span>=0<span style="color: rgba(0, 0, 0, 1)">
mongo.writeFsync</span>=<span style="color: rgba(0, 0, 255, 1)">true</span></pre>
</div>
<p>【spring-mgo.xml】</p>
<div class="cnblogs_code">
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"<span style="color: rgba(0, 0, 0, 1)">
    xmlns:xsi</span>="http://www.w3.org/2001/XMLSchema-instance"<span style="color: rgba(0, 0, 0, 1)">
    xmlns:context</span>="http://www.springframework.org/schema/context"<span style="color: rgba(0, 0, 0, 1)">
    xmlns:mongo</span>="http://www.springframework.org/schema/data/mongo"<span style="color: rgba(0, 0, 0, 1)">
    xsi:schemaLocation</span>="http://www.springframework.org/schema/context
          http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.springframework.org/schema/context/spring-context-3.0.xsd</span>
          http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.springframework.org/schema/data/mongo </span>
          http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd</span>
          http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.springframework.org/schema/beans</span>
          http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.springframework.org/schema/beans/spring-beans-3.0.xsd"&gt;</span>

    &lt;!-- 读取属性文件 --&gt;
    &lt;context:property-placeholder location="classpath:db.properties" /&gt;

    &lt;!-- 启用注解支持 --&gt;
    &lt;context:annotation-config /&gt;

    &lt;!-- 扫描组件包 --&gt;
    &lt;context:component-scan base-<span style="color: rgba(0, 0, 255, 1)">package</span>="com.jastar.demo" /&gt;

    &lt;!-- SpringData类型转换器 --&gt;
    &lt;mongo:mapping-converter id="mongoConverter"&gt;
      &lt;mongo:custom-converters&gt;
            &lt;mongo:converter&gt;
                &lt;bean <span style="color: rgba(0, 0, 255, 1)">class</span>="com.jastar.demo.converter.TimestampConverter" /&gt;
            &lt;/mongo:converter&gt;
      &lt;/mongo:custom-converters&gt;
    &lt;/mongo:mapping-converter&gt;

    &lt;!--<span style="color: rgba(0, 0, 0, 1)">
      MongoDB配置部分
      </span>1<span style="color: rgba(0, 0, 0, 1)">.mongo:连接配置
      </span>2.db-<span style="color: rgba(0, 0, 0, 1)">factory:相当于sessionFactory
      </span>3<span style="color: rgba(0, 0, 0, 1)">.mongoTemplate:与数据库接口交互的主要实现类
    </span>--&gt;
    &lt;mongo:mongo host="${mongo.host}" port="${mongo.port}"&gt;
      &lt;<span style="color: rgba(0, 0, 0, 1)">mongo:options
            connections</span>-per-host="${mongo.connectionsPerHost}"<span style="color: rgba(0, 0, 0, 1)">
            threads</span>-allowed-to-block-<span style="color: rgba(0, 0, 255, 1)">for</span>-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"<span style="color: rgba(0, 0, 0, 1)">
            connect</span>-timeout="${mongo.connectTimeout}"<span style="color: rgba(0, 0, 0, 1)">
            max</span>-wait-time="${mongo.maxWaitTime}"<span style="color: rgba(0, 0, 0, 1)">
            auto</span>-connect-retry="${mongo.autoConnectRetry}"<span style="color: rgba(0, 0, 0, 1)">
            socket</span>-keep-alive="${mongo.socketKeepAlive}"<span style="color: rgba(0, 0, 0, 1)">
            socket</span>-timeout="${mongo.socketTimeout}"<span style="color: rgba(0, 0, 0, 1)">
            slave</span>-ok="${mongo.slaveOk}"<span style="color: rgba(0, 0, 0, 1)">
            write</span>-number="${mongo.writeNumber}"<span style="color: rgba(0, 0, 0, 1)">
            write</span>-timeout="${mongo.writeTimeout}"<span style="color: rgba(0, 0, 0, 1)">
            write</span>-fsync="${mongo.writeFsync}" /&gt;
    &lt;/mongo:mongo&gt;

    &lt;mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongo" /&gt;

    &lt;bean id="mongoTemplate" <span style="color: rgba(0, 0, 255, 1)">class</span>="org.springframework.data.mongodb.core.MongoTemplate"&gt;
      &lt;constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /&gt;
      &lt;constructor-arg name="mongoConverter" ref="mongoConverter" /&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</pre>
</div>
<p>说明:<br>mongo:options - 用于配置一些数据库连接设置信息<br>mongo:db-factory - 相当于Hibernate中的SessionFactory<br>mongoTemplate - 非常重要,整个与数据库的交互操作全是靠他,相当于Hibernate的HibernateTemplate</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 另外,以上配置中有一个类型转换器,因为Spring Data MongoDB本身默认时间类型是java.util.Date,如果实体字段含有java.sql.Timestamp类型,需要自定义转换器进行转换,否则后续操作会报错(深有感触)!什么?不把转换器代码贴出来?别着急,文章最后有整个项目地址,去里面找吧……偷笑.GIF</p>
<p>2.4 Dao层参考实现</p>
<p>【BaseDaoImpl.java】</p>
<div class="cnblogs_code"><img id="code_img_closed_378902ee-f135-400c-be79-258a63e5cbd6" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_378902ee-f135-400c-be79-258a63e5cbd6" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_378902ee-f135-400c-be79-258a63e5cbd6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.dao.impl;

</span><span style="color: rgba(0, 0, 255, 1)">import</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Criteria.where;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.Serializable;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.lang.reflect.Field;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.lang.reflect.Method;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.lang.reflect.Modifier;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.ArrayList;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.HashMap;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Map;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.annotation.Id;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.domain.Sort;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.domain.Sort.Direction;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.domain.Sort.Order;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.MongoTemplate;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Query;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Update;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.dao.IBaseDao;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.util.EmptyUtil;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.util.PageModel;

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 基本操作接口MongoDB数据库实现类
* &lt;p&gt;
* ClassName: BaseDaoImpl
* &lt;/p&gt;
* &lt;p&gt;
* Description:本实现类适用于MongoDB数据库,以下代码仅供参考,本人水平有限,可能会存在些许问题(如有更好方案可告知我,一定虚心学习),
* 再次提醒,仅供参考!!
* &lt;/p&gt;
* &lt;p&gt;
* Copyright: (c)2017 Jastar·Wang,All rights reserved.
* &lt;/p&gt;
*
* </span><span style="color: rgba(128, 128, 128, 1)">@author</span><span style="color: rgba(0, 128, 0, 1)"> Jastar·Wang
* @date 2017年4月12日
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span> BaseDaoImpl&lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">implements</span> IBaseDao&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> {

    </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> getEntityClass();

    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate mgt;

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> save(T entity) {
      mgt.save(entity);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> update(T entity) {

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 反向解析对象</span>
      Map&lt;String, Object&gt; map = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            map </span>=<span style="color: rgba(0, 0, 0, 1)"> parseEntity(entity);
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            e.printStackTrace();
      }

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ID字段</span>
      String idName = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      Object idValue </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 生成参数</span>
      Update update = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Update();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(map)) {
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (String key : map.keySet()) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (key.indexOf("{") != -1<span style="color: rgba(0, 0, 0, 1)">) {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置ID</span>
                  idName = key.substring(key.indexOf("{") + 1, key.indexOf("}"<span style="color: rgba(0, 0, 0, 1)">));
                  idValue </span>=<span style="color: rgba(0, 0, 0, 1)"> map.get(key);
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  update.set(key, map.get(key));
                }
            }
      }
      mgt.updateFirst(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query().addCriteria(where(idName).is(idValue)), update, getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> delete(Serializable... ids) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(ids)) {
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (Serializable id : ids) {
                mgt.remove(mgt.findById(id, getEntityClass()));
            }
      }

    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> T find(Serializable id) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mgt.findById(id, getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> findAll() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mgt.findAll(getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> findAll(String order) {
      List</span>&lt;Order&gt; orderList =<span style="color: rgba(0, 0, 0, 1)"> parseOrder(order);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isEmpty(orderList)) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> findAll();
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> mgt.find(<span style="color: rgba(0, 0, 255, 1)">new</span> Query().with(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Sort(orderList)), getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> findByProp(String propName, Object propValue) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> findByProp(propName, propValue, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> findByProp(String propName, Object propValue, String order) {
      Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query();
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 参数</span>
<span style="color: rgba(0, 0, 0, 1)">      query.addCriteria(where(propName).is(propValue));
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排序</span>
      List&lt;Order&gt; orderList =<span style="color: rgba(0, 0, 0, 1)"> parseOrder(order);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(orderList)) {
            query.with(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Sort(orderList));
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mgt.find(query, getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> findByProps(String[] propName, Object[] propValue) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> findByProps(propName, propValue, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> findByProps(String[] propName, Object[] propValue, String order) {
      Query query </span>=<span style="color: rgba(0, 0, 0, 1)"> createQuery(propName, propValue, order);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mgt.find(query, getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> T uniqueByProp(String propName, Object propValue) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> mgt.findOne(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query(where(propName).is(propValue)), getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> T uniqueByProps(String[] propName, Object[] propValue) {
      Query query </span>= createQuery(propName, propValue, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mgt.findOne(query, getEntityClass());
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> PageModel&lt;T&gt; pageAll(<span style="color: rgba(0, 0, 255, 1)">int</span> pageNo, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> pageAll(pageNo, pageSize, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> PageModel&lt;T&gt; pageAll(<span style="color: rgba(0, 0, 255, 1)">int</span> pageNo, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize, String order) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> pageByProp(pageNo, pageSize, <span style="color: rgba(0, 0, 255, 1)">null</span>, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, order);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> PageModel&lt;T&gt; pageByProp(<span style="color: rgba(0, 0, 255, 1)">int</span> pageNo, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize, String param, Object value) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> pageByProp(pageNo, pageSize, param, value, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> PageModel&lt;T&gt; pageByProp(<span style="color: rgba(0, 0, 255, 1)">int</span> pageNo, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize, String param, Object value, String order) {
      String[] params </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      Object[] values </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(param)) {
            params </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> String[] { param };
            values </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Object[] { value };
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> pageByProps(pageNo, pageSize, params, values, order);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> PageModel&lt;T&gt; pageByProps(<span style="color: rgba(0, 0, 255, 1)">int</span> pageNo, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize, String[] params, Object[] values) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> pageByProps(pageNo, pageSize, params, values, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> PageModel&lt;T&gt; pageByProps(<span style="color: rgba(0, 0, 255, 1)">int</span> pageNo, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize, String[] params, Object[] values, String order) {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建分页模型对象</span>
      PageModel&lt;T&gt; page = <span style="color: rgba(0, 0, 255, 1)">new</span> PageModel&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">(pageNo, pageSize);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 查询总记录数</span>
      <span style="color: rgba(0, 0, 255, 1)">int</span> count =<span style="color: rgba(0, 0, 0, 1)"> countByCondition(params, values);
      page.setTotalCount(count);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 查询数据列表</span>
      Query query =<span style="color: rgba(0, 0, 0, 1)"> createQuery(params, values, order);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置分页信息</span>
<span style="color: rgba(0, 0, 0, 1)">      query.skip(page.getFirstResult());
      query.limit(page.getPageSize());

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 封装结果数据</span>
<span style="color: rgba(0, 0, 0, 1)">      page.setList(mgt.find(query, getEntityClass()));

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> page;
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> countByCondition(String[] params, Object[] values) {
      Query query </span>= createQuery(params, values, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
      Long count </span>=<span style="color: rgba(0, 0, 0, 1)"> mgt.count(query, getEntityClass());
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> count.intValue();
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 创建带有where条件(只支持等值)和排序的Query对象
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> params
   *            参数数组
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> values
   *            参数值数组
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> order
   *            排序
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> Query对象
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> Query createQuery(String[] params, Object[] values, String order) {
      Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query();

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> where 条件</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (EmptyUtil.isNotEmpty(params) &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> EmptyUtil.isNotEmpty(values)) {
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; params.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
                query.addCriteria(where(params).is(values));
            }
      }

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排序</span>
      List&lt;Order&gt; orderList =<span style="color: rgba(0, 0, 0, 1)"> parseOrder(order);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(orderList)) {
            query.with(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Sort(orderList));
      }

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> query;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 解析Order字符串为所需参数
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> order
   *            排序参数,如、、
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> Order对象集合
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">protected</span> List&lt;Order&gt;<span style="color: rgba(0, 0, 0, 1)"> parseOrder(String order) {
      List</span>&lt;Order&gt; list = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(order)) {
            list </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;Order&gt;<span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 共有几组排序字段</span>
            String[] fields = order.split(","<span style="color: rgba(0, 0, 0, 1)">);
            Order o </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            String[] item </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; fields.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isEmpty(fields)) {
                  </span><span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;
                }
                item </span>= fields.split(" "<span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (item.length == 1<span style="color: rgba(0, 0, 0, 1)">) {
                  o </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Order(Direction.ASC, item);
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (item.length == 2<span style="color: rgba(0, 0, 0, 1)">) {
                  o </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Order("desc".equalsIgnoreCase(item) ? Direction.DESC : Direction.ASC, item);
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> RuntimeException("排序字段参数解析出错"<span style="color: rgba(0, 0, 0, 1)">);
                }
                list.add(o);
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> list;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 将对象的字段及值反射解析为Map对象&lt;br&gt;
   * 这里使用Java反射机制手动解析,并且可以识别注解为主键的字段,以达到根据id进行更新实体的目的&lt;br&gt;
   * key:字段名称,value:字段对应的值
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> t
   *            要修改的对象
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> Map对象,注意:id字段的key封装为“{id字段名称}”,以供后续识别
   * </span><span style="color: rgba(128, 128, 128, 1)">@throws</span><span style="color: rgba(0, 128, 0, 1)"> Exception
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">protected</span> Map&lt;String, Object&gt; parseEntity(T t) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
      Map</span>&lt;String, Object&gt; map = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)">();
      </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
         * 解析ID
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      String idName </span>= ""<span style="color: rgba(0, 0, 0, 1)">;
      Field[] declaredFields </span>=<span style="color: rgba(0, 0, 0, 1)"> getEntityClass().getDeclaredFields();
      </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (Field field : declaredFields) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (field.isAnnotationPresent(Id.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">)) {
                field.setAccessible(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
                map.put(</span>"{" + field.getName() + "}"<span style="color: rgba(0, 0, 0, 1)">, field.get(t));
                idName </span>=<span style="color: rgba(0, 0, 0, 1)"> field.getName();
                </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
         * 解析其他属性
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      Method[] methods </span>=<span style="color: rgba(0, 0, 0, 1)"> getEntityClass().getDeclaredMethods();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (EmptyUtil.isNotEmpty(methods)) {
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (Method method : methods) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (method.getName().startsWith("get") &amp;&amp; method.getModifiers() ==<span style="color: rgba(0, 0, 0, 1)"> Modifier.PUBLIC) {
                  String fieldName </span>=<span style="color: rgba(0, 0, 0, 1)"> parse2FieldName(method.getName());
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">fieldName.equals(idName)) {
                        map.put(fieldName, method.invoke(t));
                  }
                }
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> map;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 将get方法名转换为对应的字段名称
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> methodName
   *            如:getName
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> 如:name
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String parse2FieldName(String methodName) {
      String name </span>= methodName.replace("get", ""<span style="color: rgba(0, 0, 0, 1)">);
      name </span>= name.substring(0, 1).toLowerCase() + name.substring(1<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> name;
    }

}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>说明:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 以上实现仅供参考某些实现点,mongoTemplate如何使用还要自己去详细的摸索,我也没办法,毕竟我也这样过来的,大多数方法都已经提供了,只是update方法不像关系型数据库那样,给个实体类就能更新,需要自己去想办法搞定。</p>
<p>&nbsp;【TestUseService.java】</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.test;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.sql.Timestamp;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.junit.Test;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.junit.runner.RunWith;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.test.context.ContextConfiguration;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.entity.UserInfo;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.service.UserService;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.jastar.demo.util.PageModel;

@RunWith(SpringJUnit4ClassRunner.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">)
@ContextConfiguration(locations </span>= "classpath:spring-mgo.xml"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> TestUserService {

    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> UserService service;

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> save() {
      UserInfo user </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> UserInfo();
      user.setName(</span>"张三"<span style="color: rgba(0, 0, 0, 1)">);
      user.setAge(</span>25<span style="color: rgba(0, 0, 0, 1)">);
      user.setBirth(Timestamp.valueOf(</span>"2017-4-12 16:52:00"<span style="color: rgba(0, 0, 0, 1)">));
      service.save(user);
      System.out.println(</span>"已生成ID:" +<span style="color: rgba(0, 0, 0, 1)"> user.getId());
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> find() {
      UserInfo user </span>= service.find("58edf1b26f033406394a8a61"<span style="color: rgba(0, 0, 0, 1)">);
      System.out.println(user.getName());
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> update() {
      UserInfo user </span>= service.find("58edf1b26f033406394a8a61"<span style="color: rgba(0, 0, 0, 1)">);
      user.setAge(</span>18<span style="color: rgba(0, 0, 0, 1)">);
      service.update(user);
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> delete() {
      service.delete(</span>"58edef886f03c7b0fdba51b9"<span style="color: rgba(0, 0, 0, 1)">);
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> findAll() {
      List</span>&lt;UserInfo&gt; list = service.findAll("age desc"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (UserInfo u : list) {
            System.out.println(u.getName());
      }
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> findByProp() {
      List</span>&lt;UserInfo&gt; list = service.findByProp("name", "张三"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (UserInfo u : list) {
            System.out.println(u.getName());
      }
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> findByProps() {
      List</span>&lt;UserInfo&gt; list = service.findByProps(<span style="color: rgba(0, 0, 255, 1)">new</span> String[] { "name", "age" }, <span style="color: rgba(0, 0, 255, 1)">new</span> Object[] { "张三", 18<span style="color: rgba(0, 0, 0, 1)"> });
      </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (UserInfo u : list) {
            System.out.println(u.getName());
      }
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> pageAll() {
      PageModel</span>&lt;UserInfo&gt; page = service.pageAll(1, 10<span style="color: rgba(0, 0, 0, 1)">);
      System.out.println(</span>"总记录:" + page.getTotalCount() + ",总页数:" +<span style="color: rgba(0, 0, 0, 1)"> page.getTotalPage());
      </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (UserInfo u : page.getList()) {
            System.out.println(u.getName());
      }
    }

    @Test
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> pageByProp() {
      PageModel</span>&lt;UserInfo&gt; page = service.pageByProp(1, 10, "name", "张三"<span style="color: rgba(0, 0, 0, 1)">);
      System.out.println(</span>"总记录:" + page.getTotalCount() + ",总页数:" +<span style="color: rgba(0, 0, 0, 1)"> page.getTotalPage());
      </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (UserInfo u : page.getList()) {
            System.out.println(u.getName());
      }
    }

}</span></pre>
</div>
<p>————————————————<br>版权声明:本文为CSDN博主「代码与酒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。<br>原文链接:https://blog.csdn.net/qq_16313365/article/details/70142729</p>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/muxi0407/p/11750435.html
頁: [1]
查看完整版本: Spring整合MongoDB(转)