Spring+Mongo混合自定义CRUD功能
来源:互联网 发布:java清除缓存代码 编辑:程序博客网 时间:2024/05/21 10:46
配置请参考上一篇移至Spring注解配置Mongo,Mongo的DAO接口方法定义分为3种:自定义(查询)操作、指定(查询)操作、混合自定义功能操作
1、自定义方法的方法名及是根据CRUD操作及查询参数、查询数据库字段名设置的
例:(1)根据顾客名参数(对应字段customer)查询order集合方法名-----findByCustomer(String name)/getByCustomer(String name)/readByCustomer(String name)
(2)根据顾客名模糊查询:findByCustomerLike(String n)
(3)、根据类型字段type和顾客名模糊查询:findByCustomerLikeAndTypeLike(String name,String type)
查询方法名以find、read、get为前缀均可,条件查询时需加上By,参数顺序与方法名字段名顺序一一对应,如3的参数name对应字段customer,type对应Type,这是Spring-Data的一个特性,Repository方法由一个动词、一个可选的主题、关键词By及一个断言所组成
其它CRUD操作同理,如根据客户名删除:deleteByCustomer(String name);
2、指定操作
指定操作方法名不受限制,但需在@Query补充完整操作
例:(1)根据类型查询:
@Query(value="{ 'type',?0}")
List<Order> customSelect(String type); //?0对应第一个参数位
那要是模糊查询呢?Mongo的数据都为json格式,所以模糊查询时的参数肯定不是%param%的格式,而是正则表达式形式,即/???/形式,JDK1.8中有一个Pattern类可以为我们创建正则表达式,创建时调用该类的compile静态方法进行创建,所以此时我们传参就不再是字符串,而是正则表达式,如:
(2)根据类型模糊查询:
@Query(value="{ 'type',?0}")
List<Order> customSelect(Pattern pattern);
(3)根据类型删除
@Query(value = "{'type':?0}",delete = true)
int customDelete(String type);
@Query中还含有exists根据条件判断数据是否存在,count进行数据统计
3、混合自定义功能
自定义的方法混合到自动生成的Repository中时,还需要涉及到创建一个中间接口来声明自定义的方法。
在上一篇中,OrderRepository只继承了MongoRepository接口,若想添加自定义方法,则需再继承一个自定义的接口,同时也要再编写一个实现类实现该自定义接口。如我想定义额外的Order操作方法,于是新建了一个OrderDAO接口,并使OrderRepository接口继承OrderDAO接口,再新建一个实现类OrderRepositoryImpl实现OrderDAO接口,实现类的命名须已pojo类名+Repository+Impl命名,后缀impl可修改,只需在配置类中的@EnableMongoRespositories中添加repositoryImplementationPostfix='xxx'即可设置后缀。
代码附录(POJO类与上篇相同):
OrderDAO.java:
package per.nosql.dao;import per.nosql.pojo.Order;import java.util.List;/** * Created by Wilson on 2017/5/5. */public interface OrderDAO { List<Order> findByParam();}OrderRespositoryImpl.java:
package per.nosql.dao.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoOperations;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import per.nosql.dao.OrderDAO;import per.nosql.pojo.Order;import java.util.List;/** * Created by Wilson on 2017/5/5. */public class OrderRepositoryImpl implements OrderDAO { @Autowired private MongoOperations operations; //MongoTemplate的父接口 @Override public List<Order> findByParam() { Criteria criteria = Criteria.where("type").is("1").and("customer").regex("tom"); return operations.find(Query.query(criteria), Order.class); }}OrderRepository.java:
package per.nosql.dao;import org.springframework.data.mongodb.repository.MongoRepository;import org.springframework.data.mongodb.repository.Query;import per.nosql.pojo.Order;import java.util.List;import java.util.regex.Pattern;/** * Created by Wilson on 2017/5/5. */public interface OrderRepository extends MongoRepository<Order, String>, OrderDAO { /*自定义查询方法*/ @Query("{'type' : '1'},{'customer': ?1}") List<Order> findByTypeAndName(String type, String name); List<Order> readByType(String type); List<Order> getByCustomerLikeAndType(String name,String type); int countByCustomerLike(String name); List<Order> findByTypeAndCustomer(String type, String customer); int deleteByCustomer(String customer); @Query(value = "{'type':?0}") List<Order> customSelect(Pattern pattern); @Query(value = "{'type':?0}",delete = true) int customDelete(String type);}测试类MongoTest.java:
自定义查询方法getByCustomerLikeAndType(String name,String type)测试结果:package per.nosql.test;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import per.nosql.config.MongoConfig;import per.nosql.dao.OrderRepository;import per.nosql.pojo.Order;import java.util.List;import java.util.regex.Pattern;/** * Created by Wilson on 2017/5/5. */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = MongoConfig.class)public class MongoTest { @Autowired OrderRepository orderRepository; @Test public void addOrder() { orderRepository.save(new Order(null, "Wilson", "22", null /*Arrays.asList( new Item(null, null, "面条", 13, 5))*/)); findAllOrders(); } @Test public void findByType() { System.out.println("----------------------------------------findByType-------------------------------------------"); listToString(orderRepository.readByType("2")); } @Test public void findByTypeAndName() { findAllOrders(); System.out.println("------------------------------------findByTypeAndName----------------------------------------------"); listToString(orderRepository.findByTypeAndName("2", "Wilson")); } @Test public void getByCustomerLikeAndType() { findAllOrders(); System.out.println("------------------------------------getByCustomerLikeAndType----------------------------------------------"); listToString(orderRepository.getByCustomerLikeAndType("ls", "2")); } @Test public void countAll() { System.out.println("------------------------------------count----------------------------------------------"); System.out.println("db记录数:" + orderRepository.count()); } @Test public void countByNameLike() { findAllOrders(); System.out.println("------------------------------------countByNameLike----------------------------------------------"); System.out.println("name like num:" + orderRepository.countByCustomerLike("il")); } @Test public void findAllOrders() { System.out.println("------------------------------------findAll----------------------------------------------"); listToString(orderRepository.findAll()); } @Test public void findByParam() { findAllOrders(); System.out.println("------------------------------------findByParam----------------------------------------------"); listToString(orderRepository.findByParam()); } @Test public void findByTypeAndCustomer() { findAllOrders(); System.out.println("------------------------------------findByTypeAndCustomer----------------------------------------------"); listToString(orderRepository.findByTypeAndCustomer("2", "il")); } @Test public void deleteById() { orderRepository.delete("590c4f39b81fcf661ee40e13"); findAllOrders(); } @Test public void deleteByCustomer() { findAllOrders(); System.out.println("删除数目:" + orderRepository.deleteByCustomer("Wilson")); findAllOrders(); } @Test public void customSelect() { findAllOrders(); System.out.println("------------------------------------customSelect----------------------------------------------"); listToString(orderRepository.customSelect(Pattern.compile("2"))); } @Test public void customDelete() { findAllOrders(); System.out.println("------------------------------------customDelete----------------------------------------------"); System.out.println("自定义删除数:" + orderRepository.customDelete("22")); findAllOrders(); } private void listToString(List<Order> orderList) { StringBuffer buffer = new StringBuffer(); orderList.forEach(each -> buffer.append(each).append("\n")); System.out.println(buffer.toString()); }}
混合自定义功能方法findByParam()测试结果:
指定操作删除方法customDelete(String type)测试结果:
- Spring+Mongo混合自定义CRUD功能
- Spring注解配置Mongo及基本CRUD操作简介
- 三、Mongo中的CRUD
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
- spring+mongo
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能(转)
- 再谈《Hibernate+Spring+Struts2+ExtJS开发CRUD功能》
- [SpringBoot实践]spring-data-mongo自定义Repository接口及其实现
- mongo 的crud操作&&mongo的数据聚合
- mongo CRUD数据操作符汇总
- java实现mongo数据库的CRUD操作
- ibatis实现CRUD功能
- MyBatis 的CRUD 功能
- java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
- Mysql数据库将同一表中的A字段数据复制到B字段
- JSP页面中外部文件路径,AJAX的请求地址(:url)到底该怎么写呢?
- 学生表查询
- opencv图像分割
- Spring+Mongo混合自定义CRUD功能
- 周期函数,及一个没有最小正周期的特例(Dirichlet函数)
- 二叉树的基本操作及部分面试题
- 逢三退一 双向链表实现
- 蓝桥杯 算法训练 乘积最大(动态规划)
- docker 背后的内核知识:cgroup机理
- J2EE搭建Dynamic web SpringMVC工程404错误分析(三)
- PLSQL怎样导出oracle表结构和数据
- Boost.Aiso概述 核心概念和功能1