Spring整合MongoDB(转)
<p>1.认识Spring Data MongoDB</p><p><br> 之前还的确不知道Spring连集成Nosql的东西都实现了,还以为自己又要手动封装一个操作MongoDB的API呢,结果就发现了Spring Data MongoDB。不愧是Spring,真是给了我们春天,佩服的渣渣我目瞪狗呆……</p>
<p> 废话少说,看招。Spring Data其实是一个高级别的Spring Source项目,而Spring Data MongoDB仅仅是其中的一个子项目。Spring Data旨在为关系型数据库、非关系型数据、Map-Reduce框架、云数据服务等等提供统一的数据访问API。<br> 无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。</p>
<p>Spring Data 包含多个子项目:</p>
<p>Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化<br>Hadoop - 基于 Spring 的 Hadoop 作业配置和一个 POJO 编程模型的 MapReduce 作业<br>Key-Value - 集成了 Redis 和 Riak ,提供多个常用场景下的简单封装<br>Document - 集成文档数据库:CouchDB 和 MongoDB 并提供基本的配置映射和资料库支持<br>Graph - 集成 Neo4j 提供强大的基于 POJO 的编程模型<br>Graph Roo AddOn - Roo support for Neo4j<br>JDBC Extensions - 支持 Oracle 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><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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jastar</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<url>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.jastar-wang.tech</url></span>
<!-- 版本配置 -->
<properties>
<spring.version>4.1.4.RELEASE</spring.version>
<spring.data.version>1.7.0.RELEASE</spring.data.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<!-- 单元测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 关系型数据库整合时需配置 如hibernate jpa等 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring aop 关联 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- spring整合MongoDB -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring.data.version}</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Maven MILESTONE Repository</name>
<url>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">repo.spring.io/libs-milestone</url></span>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project></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)">
* 用户实体类
* <p>
* ClassName: UserInfo
* </p>
* <p>
* Description:本类用来展示MongoDB实体类映射的使用
* </p>
* <p>
* Copyright: (c)2017 Jastar·Wang,All rights reserved.
* </p>
*
* </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 - 用于字段级别,标记这个字段是一个主键,默认生成的名称是“_id”</p>
<p>@Document - 用于类,以表示这个类需要映射到数据库,您也可以指定映射到数据库的集合名称</p>
<p>@DBRef - 用于字段,以表示它将使用com.mongodb.DBRef进行存储。</p>
<p>@Indexed - 用于字段,表示该字段需要如何创建索引</p>
<p>@CompoundIndex - 用于类,以声明复合索引</p>
<p>@GeoSpatialIndexed - 用于字段,进行地理位置索引</p>
<p>@TextIndexed - 用于字段,标记该字段要包含在文本索引中</p>
<p>@Language - 用于字段,以设置文本索引的语言覆盖属性。</p>
<p>@Transient - 默认情况下,所有私有字段都映射到文档,此注解将会去除此字段的映射</p>
<p>@PersistenceConstructor - 标记一个给定的构造函数,即使是一个protected修饰的,在从数据库实例化对象时使用。构造函数参数通过名称映射到检索的DBObject中的键值。</p>
<p>@Value - 这个注解是Spring框架的一部分。在映射框架内,它可以应用于构造函数参数。这允许您使用Spring表达式语言语句来转换在数据库中检索的键值,然后再用它来构造一个域对象。为了引用给定文档的属性,必须使用以下表达式:@Value("#root.myProperty"),root要指向给定文档的根。</p>
<p>@Field - 用于字段,并描述字段的名称,因为它将在MongoDB BSON文档中表示,允许名称与该类的字段名不同。</p>
<p>@Version - 用于字段锁定,保存操作时检查修改。初始值是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><?xml version="1.0" encoding="UTF-8"?>
<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"></span>
<!-- 读取属性文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 启用注解支持 -->
<context:annotation-config />
<!-- 扫描组件包 -->
<context:component-scan base-<span style="color: rgba(0, 0, 255, 1)">package</span>="com.jastar.demo" />
<!-- SpringData类型转换器 -->
<mongo:mapping-converter id="mongoConverter">
<mongo:custom-converters>
<mongo:converter>
<bean <span style="color: rgba(0, 0, 255, 1)">class</span>="com.jastar.demo.converter.TimestampConverter" />
</mongo:converter>
</mongo:custom-converters>
</mongo:mapping-converter>
<!--<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>-->
<mongo:mongo host="${mongo.host}" port="${mongo.port}">
<<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}" />
</mongo:mongo>
<mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongo" />
<bean id="mongoTemplate" <span style="color: rgba(0, 0, 255, 1)">class</span>="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mongoConverter" />
</bean>
</beans></pre>
</div>
<p>说明:<br>mongo:options - 用于配置一些数据库连接设置信息<br>mongo:db-factory - 相当于Hibernate中的SessionFactory<br>mongoTemplate - 非常重要,整个与数据库的交互操作全是靠他,相当于Hibernate的HibernateTemplate</p>
<p> 另外,以上配置中有一个类型转换器,因为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数据库实现类
* <p>
* ClassName: BaseDaoImpl
* </p>
* <p>
* Description:本实现类适用于MongoDB数据库,以下代码仅供参考,本人水平有限,可能会存在些许问题(如有更好方案可告知我,一定虚心学习),
* 再次提醒,仅供参考!!
* </p>
* <p>
* Copyright: (c)2017 Jastar·Wang,All rights reserved.
* </p>
*
* </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<T> <span style="color: rgba(0, 0, 255, 1)">implements</span> IBaseDao<T><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<T><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<String, Object> 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<T><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<T><span style="color: rgba(0, 0, 0, 1)"> findAll(String order) {
List</span><Order> 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<T><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<T><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<Order> 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<T><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<T><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<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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<T> page = <span style="color: rgba(0, 0, 255, 1)">new</span> PageModel<><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) &&<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 < 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<Order> 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<Order><span style="color: rgba(0, 0, 0, 1)"> parseOrder(String order) {
List</span><Order> 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<Order><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 < 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对象<br>
* 这里使用Java反射机制手动解析,并且可以识别注解为主键的字段,以达到根据id进行更新实体的目的<br>
* 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<String, Object> parseEntity(T t) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
Map</span><String, Object> map = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap<String, Object><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") && 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> 以上实现仅供参考某些实现点,mongoTemplate如何使用还要自己去详细的摸索,我也没办法,毕竟我也这样过来的,大多数方法都已经提供了,只是update方法不像关系型数据库那样,给个实体类就能更新,需要自己去想办法搞定。</p>
<p> 【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><UserInfo> 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><UserInfo> 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><UserInfo> 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><UserInfo> 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><UserInfo> 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> </p><br><br>
来源:https://www.cnblogs.com/muxi0407/p/11750435.html
頁:
[1]