Spring-data-mongodb初步使用
2016-11-30 00:00
387 查看
摘要: 使用示例
前几天调研了一下spring-data的使用。此处做一下使用的简单介绍:
在使用关系型数据库的传统Java web开发中,我们通常使用如下层级结构:
Dao层主要完成OR-Mapping的功能,进行数据的存储。但是在我们使用Mongo数据库之后,原本的层级就可能变成了如下:
因为我们从mongo的数据为json格式,可以使用fastjson与POJO进行相互转换。
这样层级设计,开发就可以能很快地完成,但是造成一些问题:
业务逻辑代码和数据库操作代码耦合在一起,较为难以分离
加大了单元测试的难度
结构层次不清晰
以下是理由:
上面1和3造成的原因都是因为函数体变长,业务代码和数据库代码杂糅在一起造成的,出错时,需要对整个函数进行复验,确保函数的编写的正确性。编写UT时也会造成需要覆盖的路径(语句)增多,难度因此增加。
结构层次不清晰,在分为Service和Dao层的情况下,逻辑层级更为清晰,业务层主做业务,Dao层主做数据库的CURD。
所以我们可以使用spring-data-mongo来完成dao层的编写。
以下代码都是测试通过的,主要注意几个点:
代码只需要定义成这样既可,一般的查询都可以使用这些自动生成的代码来进行完成
如果需要添加自定义的方法,在这边我使用的是JDK8的default关键字,直接将实现添加在了接口里面,实测可用
启动时spring会操作字节码自动生成实现类,所以启动可能较慢,并且一旦有bug调试起来很麻烦(基本无法调试)。
接口定义示例:
使用例子:
前几天调研了一下spring-data的使用。此处做一下使用的简单介绍:
在使用关系型数据库的传统Java web开发中,我们通常使用如下层级结构:
Dao层主要完成OR-Mapping的功能,进行数据的存储。但是在我们使用Mongo数据库之后,原本的层级就可能变成了如下:
因为我们从mongo的数据为json格式,可以使用fastjson与POJO进行相互转换。
这样层级设计,开发就可以能很快地完成,但是造成一些问题:
业务逻辑代码和数据库操作代码耦合在一起,较为难以分离
加大了单元测试的难度
结构层次不清晰
以下是理由:
上面1和3造成的原因都是因为函数体变长,业务代码和数据库代码杂糅在一起造成的,出错时,需要对整个函数进行复验,确保函数的编写的正确性。编写UT时也会造成需要覆盖的路径(语句)增多,难度因此增加。
结构层次不清晰,在分为Service和Dao层的情况下,逻辑层级更为清晰,业务层主做业务,Dao层主做数据库的CURD。
所以我们可以使用spring-data-mongo来完成dao层的编写。
以下代码都是测试通过的,主要注意几个点:
代码只需要定义成这样既可,一般的查询都可以使用这些自动生成的代码来进行完成
如果需要添加自定义的方法,在这边我使用的是JDK8的default关键字,直接将实现添加在了接口里面,实测可用
启动时spring会操作字节码自动生成实现类,所以启动可能较慢,并且一旦有bug调试起来很麻烦(基本无法调试)。
接口定义示例:
public interface UserRepository extends MongoRepository<User, String> { //////////////////////Query///////////////////// // Do not recommend using @Query annotation like this @Query("{ 'firstname' : ?0, 'password': ?1 }") public User findByUsernameAndPassword(String username, String password); // find age larger than // there are others: public List<User> findByAgeGreaterThan(Integer age); public List<User> findByAgeLessThan(Integer age); public List<User> findByAgeBetween(Integer from, Integer to); public List<User> findBySexNot(String sex); public List<User> findBySexLike(String sex); public List<User> findBySexNotLike(String sex); public List<User> findByUsernameNull(); public List<User> findByUsernameNotNull(); // find by username public User findByUsername(String username); // find distinct users by username public List<User> findDistinctUserByUsername(String username); public List<User> findUserDistinctByUsername(String username); // find users by username and age public List<User> findByUsernameAndAge(String username, Integer age); // find users by username or age public List<User> findByUsernameOrAge(String username, Integer age); // find users by sex with ignoring cases public List<User> findBySexIgnoreCase(String sex, Pageable pageable); // find users by sex with order firstname ascending public List<User> findBySexOrderByUsernameAsc(String sex); // find users by sex with the order sort specfied public List<User> findBySex(String sex, Sort sort); // find users bys sex with pageable public List<User> findBySex(String sex, Pageable pageable); // find the first ten results by user sex public Slice<User> findTop10BySex(String sex, Sort sort); public Slice<User> findFirst10BySex(String sex, Sort sort); // other query like Stream Query and Async Query could be // found here http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.query-methods // define the method by ourself default User findByUsernameAndPasswordByOwn(String username, String password) { MongoOperations ops = DbUtil.getDbUtil().getMongoTemplate(); User user = ops.findOne(query(where("username").is(username)) .addCriteria(where("password").is(password)), User.class); return user; } default GroupByResults<User> findUserGroupBySex() { GroupByResults<User> results = DbUtil.getDbUtil().getMongoTemplate() .group("user", GroupBy.key("sex").initialDocument("{ count: 0 }") .reduceFunction("function(doc, prev) { prev.count += 1 }"), User.class); return results; } //////////////////////Delete///////////////////// public void deleteByUsername(String username); public void removeByUsernameAndAge(String username, Integer age); /////////////////////update//////////////////////// // normally, we use sper.update(), if the method can't meet your demand, // you can write the method yourself default void updateMultiByUsername(String username, Integer age) { MongoOperations ops = DbUtil.getDbUtil().getMongoTemplate(); // update all the documents whose username atteribute is username // and the class need to be User ops.updateMulti(query(where("username").is(username)), Update.update("age", age), User.class); } //////////////////save/////////////// // just use default save(). forget about the others. }
使用例子:
@RestController public class UserController { @Autowired UserRepository userRepository; @RequestMapping("/") public String sayHello(String name) { return "Hello, " + name; } @RequestMapping(value="/user", method = RequestMethod.POST) public String add(@RequestParam String companyId, @RequestBody User user) { user = userRepository.save(user); return user.getId(); } @RequestMapping(value = "/user/username", method = RequestMethod.GET) public User getUserByUserName(@RequestParam String companyId, @RequestParam String username, @RequestParam String password) { User user; user = userRepository.findByUsernameAndPassword(username, password); return user; } @RequestMapping(value="/user/group/sex", method = RequestMethod.GET) public GroupByResults<User> groupUserBySex() { return userRepository.findUserGroupBySex(); } }
相关文章推荐
- 拥抱NoSQL--谈Spring Data MongoDB的简单使用
- MongoDB的使用学习之(七)MongoDB的聚合查询(spring-data-mongodb两种方式)附项目源码
- centos7安装MongoDB3.4 以及spring data mongodb的配置使用
- Mongodb系列- spring-data-mongodb使用MongoTemplate实现分页查询
- Java 访问 MongoDB (使用Spring-Data-MongoDB)
- Spring Data MongoDB : Query document(MongoDB中使用Query时的Query的编写和调用方式)
- 使用Spring Data MongoDB 做聚合操作出现的问题及解决方案
- spring-data-mongodb使用示例
- Spring Data MongoDB的简单使用
- spring-data-mongodb 配置和使用多个 mongoTemplate
- 在SPRING DATA MONGODB中使用聚合统计查询
- Spring Data MongoDB:使用GridFS保存二进制文件
- 使用springdata操作mongodb的例子
- 拥抱NoSQL--谈Spring Data MongoDB的简单使用
- dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(五)Spring中spring-data-redis的使用
- 大数据之mongodb --> (2)java集成 MongoDB 3.2,使用Spring-data-mongodb进行集成
- 使用spring data api查询分组中的mongodb最大值
- 在SPRING DATA MONGODB中使用聚合统计查询
- Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计
- spring data mongodb高级查询语句的使用(网上基本没资料)