赞
踩
SpringDataMongoDB是SpringData家族成员之一,底层封装了mongodb-driver。
创建一个SpringBoot工程, 引入SpringDataMongoDB依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
在配置文件中连接 MongoDB服务,这里有用户安全认证(下面两个用户都可用)。
spring:
data:
mongodb:
# 超级管理员是必须指定?后面的固定写法
uri: mongodb://mongoroot:密码@127.0.0.1:27017/m_db3?authSource=admin&authMechanism=SCRAM-SHA-1
# 普通用户不能指定?后面的固定写法
# uri: mongodb://luna1:密码@127.0.0.1:27017/m_db3
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.io.Serializable; import java.util.Date; @Document("user") @CompoundIndex(def = "{'id':1, 'age': -1}") public class User implements Serializable { @Id private String id; @Field("name") @Indexed private String name; private Integer age; private Integer sex; @Indexed(name = "index_createdTime", direction = IndexDirection.DESCENDING) private Date createdTime; private String address; private Integer state; /** * 关注者数量 */ private Integer followNum; ... getter/setter }
常用注解如下:
@Id - 用于字段级别,标记这个字段是一个主键,默认生成的名称是“_id”
@Document - 用于类,以表示这个类需要映射到数据库,您也可以指定映射到数据库的集合名称
@DBRef - 用于字段,以表示它将使用com.mongodb.DBRef进行存储。
@Indexed - 用于字段,表示该字段需要如何创建索引
@CompoundIndex - 用于类,以声明复合索引
@GeoSpatialIndexed - 用于字段,进行地理位置索引
@TextIndexed - 用于字段,标记该字段要包含在文本索引中
@Language - 用于字段,以设置文本索引的语言覆盖属性。
@Transient - 默认情况下,所有私有字段都映射到文档,此注解将会去除此字段的映射
@PersistenceConstructor - 标记一个给定的构造函数,即使是一个protected修饰的,在从数据库实例化对象时使用。构造函数参数通过名称映射到检索的DBObject中的键值。
@Value - 这个注解是Spring框架的一部分。在映射框架内,它可以应用于构造函数参数。这允许您使用Spring表达式语言语句来转换在数据库中检索的键值,然后再用它来构造一个域对象。为了引用给定文档的属性,必须使用以下表达式:@Value("#root.myProperty"),root要指向给定文档的根。
@Field - 用于字段,并描述字段的名称,因为它将在MongoDB BSON文档中表示,允许名称与该类的字段名不同。
@Version - 用于字段锁定,保存操作时检查修改。初始值是0,每次更新时自动触发。
/**
* 继承MongoRepository,指定实体和主键的类型作为泛型
*
*/
public interface UserRepository extends MongoRepository<User, String> {
}
MongoRepository接口及其子类SimpleMongoRepository,提供了一些CRUD常用方法。
@Service public class UserService { @Autowired private UserRepository userRepository; /** * 保存 * * @param user */ public void save(User user) { userRepository.save(user); } /** * 更新 * * @param user */ public void update(User user) { userRepository.save(user); } /** * 根据id删除 * * @param id */ public void deleteById(String id) { userRepository.deleteById(id); } /** * 查询所有 * * @return */ public List<User> findAll() { return userRepository.findAll(); } /** * 根据id查询 * * @param id * @return */ public User findById(String id) { return userRepository.findById(id).get(); } }
@Autowired private UserService userService; @Test public void testSave() { User user = new User(); user.setAge(10); user.setSex(1); user.setName("鲁班"); user.setState(1); user.setFollowNum(0); user.setAddress("峡谷射手位"); user.setCreatedTime(new Date()); userService.save(user); } @Test public void testUpdate() { User user = new User(); user.setId("60920480cbb9605ddb8408e6"); user.setAge(18); user.setSex(1); user.setName("蔡文姬"); user.setState(1); user.setFollowNum(0); user.setAddress("峡谷奶妈"); user.setCreatedTime(new Date()); userService.update(user); } @Test public void testFindAll() { List<User> userList = userService.findAll(); System.out.println(userList); } @Test public void testFindById() { User user = userService.findById("60920480cbb9605ddb8408e6"); System.out.println(user); } @Test public void testDelete() { userService.deleteById("60920489ae642306a39bc958"); }
按照 JPA语法来写就ok。测试一个。
/**
* 根据 age和sex查询
* @param age
* @param sex
* @return
*/
List<User> findByAgeGreaterThanEqualAndSexEquals(Integer age, Integer sex);
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; @Autowired private MongoTemplate mongoTemplate; /** * 将 followNum字段值加1 * @param id */ public void incrFollowNumCount(String id){ // 创建 Query对象 Query query = new Query(Criteria.where("_id").is(id)); // 创建更新对象 Update update = new Update(); update.inc("followNum"); // 执行update mongoTemplate.updateFirst(query, update, User.class); }
分页涉及两个类:Page和Pageable
dao层
/**
* 根据年龄分页查询
*
* @param age
* @param pageable
* @return
*/
Page<User> findByAge(Integer age, Pageable pageable);
service层
/**
* 根据名称分页查询
*
* @param age
* @param page
* @param size
* @return
*/
public Page<User> findByAgePage(Integer age, int page, int size) {
// 构造分页对象
PageRequest pageRequest = PageRequest.of(page - 1, size);
return userRepository.findByAge(age, pageRequest);
}
测试
MongoTemplate使用更丰富,可针对不同的需求。
service层
/** * 使用MongoTemplate分页查询 * * @param page * @param size * @param user * @return */ public List<User> findPageByTemplate(int page, int size, User user) { // 构造一个查询对象 Query query = new Query(); long count = mongoTemplate.count(query, User.class); System.out.println("===总数===" + count); // 设置参数 if (!StringUtils.isEmpty(user.getName())) { query.addCriteria(Criteria.where("name").regex(user.getName() + ".*")); } if (user.getAge() != null) { query.addCriteria(Criteria.where("age").gte(user.getAge())); } if (user.getSex() != null) { query.addCriteria(Criteria.where("sex").is(user.getSex())); } // 跳过多少条 query.skip((page - 1) * size); // 取出多少条 query.limit(size); // 构造排序对象 Sort.Order order = new Sort.Order(Sort.Direction.DESC, "age"); // 设置排序对象 query.with(Sort.by(order)); List<User> users = mongoTemplate.find(query, User.class); return users; }
测试
到此,使用 Java操作MongoDB就算入门了,更多操作在项目中灵活使用。
Stay Hungry, Stay Foolish. 求知若饥,虚心若愚。
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。