在前人的基础上,进行了spring与mongodb的初期整合,如果有什么不对的地方,请指正
Maven的pom.xml(部分jar多余,可考虑删除)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springForMongo</groupId> <artifactId>springForMongo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name/> <description/> <properties> <!-- spring版本号 --> <spring.version>3.2.4.RELEASE</spring.version> <!-- log4j日志文件管理包版本 --> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.9</log4j.version> </properties> <dependencies> <!-- spring核心包 --> <!-- springframe start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</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-jdbc</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-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- springframe end --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <type>jar</type> <scope>provided</scope> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.10.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb-cross-store</artifactId> <version>1.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb-log4j</artifactId> <version>1.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- junit测试包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- 日志文件管理包 --> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <!-- log end --> </dependencies> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
spring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.mongodb" /> <mongo:mongo host="127.0.0.1" port="27017" /> <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <mongo:db-factory dbname="test_mongodb" mongo-ref="mongo" /> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean> <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 --> <mongo:mapping-converter base-package="com.mongodb.model" /> <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 --> <mongo:repositories base-package="com.mongodb.dao.impl" /> <context:annotation-config /> </beans>
BaseDaoI
@Transactional
public interface BaseDaoI<T> {
public abstract void _test();
public abstract void createCollection(T object);
public abstract List<T> findList(int skip, int limit);
public abstract T findOneByItems(Map<String, Object> params);
public abstract void insert(T t);
public abstract void update(String id,Map<String, Object> params,T t);
public abstract long count(Map<String, Object> params);
public abstract List<T> findByItems(Map<String, Object> params);
public abstract List<T> findListByPageAndItems(int skip, int rows, Map<String, Object> params);
public abstract void deleteById(String id);
public abstract void saveFile(File file,String fileUrl);
public abstract GridFSDBFile retrieveFileOne(String filename);
}
StaffDaoI
import org.springframework.transaction.annotation.Transactional;
import com.mongodb.model.Staff;
@Transactional
public interface StaffDaoI extends BaseDaoI<Staff> {
}
BaseDaoImpl.class
import java.io.File;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import com.mongodb.DB;
import com.mongodb.dao.BaseDaoI;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
@Repository
public class BaseDaoImpl<T> implements BaseDaoI<T> {
public static final Logger logger = LoggerFactory.getLogger(BaseDaoImpl.class);
public static final String FILEURL="imgRespository";
@Autowired
private MongoTemplate mongoTemplate;
private Class<?> clz;
public Class<?> getClz() {
if(clz==null) {
//获取泛型的Class对象
clz = ((Class<?>)
(((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]));
}
return clz;
}
public BaseDaoImpl() {
}
@Override
public void _test() {
Set<String> colls = this.mongoTemplate.getCollectionNames();
for (String coll : colls) {
logger.info("CollectionName=" + coll);
}
DB db = this.mongoTemplate.getDb();
logger.info("db=" + db.toString());
}
@Override
public void createCollection(T object) {
if (!this.mongoTemplate.collectionExists(getClz())) {
this.mongoTemplate.createCollection(getClz());
}
}
@Override
public List<T> findList(int skip, int limit) {
Query query = new Query();
query.with(new Sort(new Order(Direction.ASC, "_id")));
query.skip(skip).limit(limit);
return (List<T>)this.mongoTemplate.find(query, getClz());
}
@Override
public T findOneByItems(Map<String, Object> params) {
Query query = new Query();
if ((params != null) && (!(params.isEmpty()))) {
for (String key : params.keySet()) {
query.addCriteria(new Criteria(key).is(params.get(key)));
}
}
return (T)mongoTemplate.findOne(query, getClz());
}
@Override
public void insert(T t) {
this.mongoTemplate.insert(t);
}
@Override
public long count(Map<String, Object> params) {
Query query = new Query();
if ((params != null) && (!(params.isEmpty()))) {
for (String key : params.keySet()) {
query.addCriteria(new Criteria(key).is(params.get(key)));
}
}
return (long)mongoTemplate.find(query, getClz()).size();
}
@Override
public List<T> findByItems(Map<String, Object> params) {
Query query = new Query();
if ((params != null) && (!(params.isEmpty()))) {
for (String key : params.keySet()) {
query.addCriteria(new Criteria(key).is(params.get(key)));
}
}
return (List<T>)this.mongoTemplate.find(query, getClz());
}
@Override
public List<T> findListByPageAndItems(int skip, int rows,
Map<String, Object> params) {
Query query = new Query();
if ((params != null) && (!(params.isEmpty()))) {
for (String key : params.keySet()) {
query.addCriteria(new Criteria(key).is(params.get(key)));
}
}
query.skip(skip).limit(rows);
return (List<T>)this.mongoTemplate.find(query, getClz());
}
@Override
public void update(String id, Map<String, Object> params,T t) {
Query query = new Query();
query.addCriteria(new Criteria("_id").is(id));
Update update = new Update();
if ((params != null) && (!(params.isEmpty()))) {
for (String key : params.keySet()) {
update.set(key, params.get(key));
}
}
this.mongoTemplate.updateFirst(query, update,getClz());
}
@Override
public void deleteById(String id) {
mongoTemplate.remove(new Query(Criteria.where("_id").is(id)), getClz());
}
@Override
public void saveFile(File file, String fileUrl) {
try {
DB db = mongoTemplate.getDb();
GridFS fs = new GridFS(db, FILEURL);
GridFSInputFile inputFile = fs.createFile(file);
inputFile.setFilename(fileUrl);
inputFile.setContentType(fileUrl.substring(fileUrl.lastIndexOf(".")));
inputFile.save();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public GridFSDBFile retrieveFileOne(String filename) {
try {
DB db = mongoTemplate.getDb();
// 获取fs的根节点
GridFS gridFS = new GridFS(db, FILEURL);
GridFSDBFile dbfile = gridFS.findOne(filename);
if (dbfile != null) {
return dbfile;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
StaffDaoImpl
import org.springframework.stereotype.Repository;
import com.mongodb.dao.StaffDaoI;
import com.mongodb.model.Staff;
@Repository
public class StaffDaoImpl extends BaseDaoImpl<Staff> implements StaffDaoI{
}
Entity Staff.java(@Id是import org.springframework.data.annotation.Id)
@Document(collection = "staff")
public class Staff {
@Id
private String id;
/**
* 姓名
*/
private String name;
/**
* 邮箱
*/
private String[] email;
/**
* 出身日期
*/
private Date birthday;
/**
* 部门名称
*/
private String department;
/**
* 毕业学校
*/
private String school;
/**
* 现居地
*/
private String location;
/**
* 年龄
*/
private int age;
/**
* 员工评论
*/
private List<Comment> comments;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getEmail() {
return email;
}
public void setEmail(String[] email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Staff [id=" + id + ", name=" + name + ", email="
+ Arrays.toString(email) + ", birthday=" + birthday
+ ", department=" + department + ", school=" + school
+ ", location=" + location + ", age=" + age + ", comments="
+ comments + "]";
}
}
Comment.class(员工评论与员工一对多)
@Document
public class Comment {
@Id
private String id;
/**
* 评论内容
*/
private String content;
/**
* 评论日期
*/
private Date conDate;
public Comment() {
}
public Comment(String content, Date conDate) {
this.content = content;
this.conDate = conDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getConDate() {
return conDate;
}
public void setConDate(Date conDate) {
this.conDate = conDate;
}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring.xml" })
public class TestMongoDb {
@Autowired
public StaffDaoI staffDao;
/**
* 在数据库test_mongodb中创建一个collection集合staff
*/
@Test
public void test1() {
Staff staff = new Staff();
staffDao.createCollection(staff);
}
/**
* 保存一条数据
*/
@Test
public void test2() {
Staff staff = new Staff();
staff.setName("chenjunfeng");
staff.setAge(35);
staff.setDepartment("1-4-4");
staff.setLocation("sanshanjie");
staff.setBirthday(new Date());
staff.setId("000111");
staff.setSchool("nanjingdaxue");
Comment comment=new Comment();
comment.setConDate(new Date());
comment.setContent("good leader");
Comment comment1=new Comment();
comment.setConDate(new Date());
comment.setContent("a very good leader");
List<Comment> comments=new ArrayList<Comment>();
comments.add(comment);
comments.add(comment1);
staff.setComments(comments);
staff.setEmail(new String[]{"cjf@123.com","smile@163.com"});
staffDao.insert(staff);
}
/**
* 根据检索条件返回检索个数
*/
@Test
public void test3() {
Map<String,Object> params=new HashMap<String, Object>();
params.put("age", 35);
System.out.println(staffDao.count(params));
}
/**
* 根据条件返回数据的集合
*/
@Test
public void test5() {
Map<String,Object> params=new HashMap<String, Object>();
params.put("age", 35);
System.out.println(staffDao.findByItems(params).get(0).toString());
}
/**
* 存储图片
*/
@Test
public void test6() {
File file=new File("D:\\cloud.jpg");
String fileUrl="cloud.jpg";
staffDao.saveFile(file, fileUrl);
}
/**
* 取出图片
* @throws IOException
*/
@Test
public void test7() throws IOException {
String fileUrl="cloud.jpg";
GridFSDBFile file=staffDao.retrieveFileOne(fileUrl);
System.out.println(file.getId());
System.out.println(file.getContentType());
System.out.println(file.getChunkSize());
file.writeTo(new File("E:\\cloud.jpg"));
}
//TODO
//分页就不做测试了,有兴趣的可以尝试一下
}
有不对的可以指正一下,或者dao层实现方式有不妥的地方请提出