Spring Boot使用mongodb进行增删改查操作

SpringBoot mongodb

菜鸟教程下载安装,可以多装一个可视化工具
http://www.runoob.com/mongodb/mongodb-tutorial.html
百度云盘源码也发布测试好了,里面有mongodb windows的安装包,可视化工具,源码
链接:https://pan.baidu.com/s/1xW25kq4H2uYqRzb-qJ0r1Q
提取码:2jbr

POM

		<dependency> 
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-data-mongodb</artifactId>
	    </dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-couchbase</artifactId>
		</dependency>

连接你的mongodb
新建一个test01 数据库
新建一个test01数据库 sequence是id序列表,user是我练习操作的test表
application.yml

	server: 
	  port: 8888
	spring:
	  data:
	    mongodb:
	      uri: mongodb://localhost:27017/test01
	  application:
	    name: mongoweb

实体类

public class User {
   
	@Id
	@AutoIncKey//由于mongodb默认是没有自动生成id的,这里的@AutoIncKey是自己编写的注解
	private Long id=0L;//mongodb默认是不识别包装类型的null值的,如果是基本就不碍事,包装类需要给模式值,不然出错
	private String name;
    private int age;
    private List<Long> list;
    private Map<String,Long> map;
	
	
	
	public User(String name, int age, Long id, List<Long> list, Map<String, Long> map) {
		super();
		this.name = name;
		this.age = age;
		this.id = id;
		this.list = list;
		this.map = map;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", id=" + id + ", list=" + list + ", map=" + map + "]";
	}
	public Map<String, Long> getMap() {
		return map;
	}
	public void setMap(Map<String, Long> map) {
		this.map = map;
	}
	public User(String name, int age, Long id, List<Long> list) {
		super();
		this.name = name;
		this.age = age;
		this.id = id;
		this.list = list;
	}
	public List<Long> getList() {
		return list;
	}
	public void setList(List<Long> list) {
		this.list = list;
	}
	public User() {
		super();
	}
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public User(String name, int age, Long id) {
		super();
		this.name = name;
		this.age = age;
		this.id = id;
	}
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}

由于没有自动生成id所以需要自己编写一个序列id的计数器

/**
 * 序列计数类
 * @author Administrator
 *
 */
@Document(collection="sequence")
public class SeqInfo {

	/**
	 * 主键
	 */
	@Id
	private String id;
	/**
	 * 集合名字
	 */
	@Field
	private String collName;
	/**
	 * 序列号
	 */
	@Field
	private Long seqId;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCollName() {
		return collName;
	}
	public void setCollName(String collName) {
		this.collName = collName;
	}
	public Long getSeqId() {
		return seqId;
	}
	public void setSeqId(Long seqId) {
		this.seqId = seqId;
	}
	
}

自定义id自增注解

/**
 * 自定义注解,标识主键字段需要自动增长

 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoIncKey {
	
}

自增的配置类通过反射注入

/**
 * 保存文档监听类<br>
 * 在保存对象时,通过反射方式为其生成ID
 */
@Component
public class SaveEventListener extends AbstractMongoEventListener<Object> {
 
	@Autowired
	private MongoTemplate mongo;
 
	@Override
	public void onBeforeConvert(BeforeConvertEvent<Object> event) {
		Object source = event.getSource();
		if(source != null) {
			ReflectionUtils.doWithFields(source.getClass(),new ReflectionUtils.FieldCallback() {
				@Override
				public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
					ReflectionUtils.makeAccessible(field);
					//如果字段添加了我们自定义的AutoIncKey注解
					if(field.isAnnotationPresent(AutoIncKey.class)) {
						//设置自增id
						field.set(source, getNextId(source.getClass().getSimpleName()));
					}
				}
			});
		}
			
		
	}
 
	/**
	 * 获取下一个自增ID
	 * 
	 * @param collName
	 *            集合(这里用类名,就唯一性来说最好还是存放长类名)名称
	 * @return 序列值
	 */
	private Long getNextId(String collName) {
		Query query = new Query(Criteria.where("collName").is(collName));
		Update update = new Update();
		update.inc("seqId", 1);
		FindAndModifyOptions options = new FindAndModifyOptions();
		options.upsert(true);
		options.returnNew(true);
		SeqInfo seq = mongo.findAndModify(query, update, options, SeqInfo.class);
		return seq.getSeqId();
	}
}

Dao层

public interface UserDao {
	
	void insert(User user);
	
	void  update(User user);

	List<User> findAll();

	User findOne();

	User findById(Long id);

	List<User> find();

	List<User> findOr();

	List<User> findOrAnd();

	List<User> findAnd();

	List<User> findDayuXiaoyu();

	List<User> findInNot();

	List<User> findDie();

	List<User> findAllMatching();

	List<User> findSize();

	List<User> findExists();

	List<User> findType();

	List<User> findNot();

	long count();

	List<?> distinct();

	List<?> sort();

	List<?> limit();

	List<User> findLike();
}

实现类
注意:mongodb里的long类型与int类型是有区别的,传入一个int类型但是数据库值为long则会查询失败

@Repository("userDao")
public class UserDaoImpl implements UserDao {

	/**
	 * 由springboot自动注入,默认配置会产生mongoTemplate这个bean
	 */
	@Autowired
	private MongoTemplate mongoTemplate;

	@Override
	public void insert(User user) {
		//插入数据id自增
		mongoTemplate.insert(user);
	}

	@Override
	public void update(User user) {
		//根据id修改 update user set name=user.getName(),age=user.getAge() where id =user.getId()
		mongoTemplate.updateFirst(new Query(Criteria.where("id").is(user.getId())),
				new Update().set("name", user.getName()).set("age", user.getAge()), User.class);
	}

	@Override
	public List<User> findAll() {
		//select * from A
		return mongoTemplate.findAll(User.class);

	}

	@Override
	public User findOne() {
		//select * from A LIMIT 1
		return mongoTemplate.findOne(new Query(), User.class);// 第一条
	}

	@Override
	public User findById(Long id) {
		//Select * from A where a.id=id;
		return mongoTemplate.findById(id, User.class);// id查询
	}

	@Override
	public List<User> find() {
		//select name from A where name='10'
		DBObject dbObject = new BasicDBObject();
		dbObject.put("name", "10"); // 查询条件
		BasicDBObject fieldsObject = new BasicDBObject();
		// 指定返回的字段
		fieldsObject.put("name", true);
		return mongoTemplate.find(new BasicQuery(dbObject, fieldsObject), User.class);
	}

	@Override
	public List<User> findOr() {
		//select * from A where name='10' or age=13
		return mongoTemplate.find(
				new Query(new Criteria().orOperator(Criteria.where("name").is("10"),Criteria.where("age").is(11))),
				User.class);
	}
	@Override
	public List<User> findAnd(){
		//select * from A where name='13' and id=1
		return mongoTemplate.find(new  Query(Criteria.where("name").is("13").and("id").is(1)), User.class);
	}
	@Override
	public List<User> findOrAnd() {
		//select * from A where a.id=1 and (age=9 or name =13)
		return mongoTemplate.find(
				new Query(Criteria.where("id").is(1).andOperator(new Criteria().orOperator(new Criteria().orOperator(Criteria.where("age").is(10),Criteria.where("name").is("13"))))),
				User.class);
	}
	@Override
	public List<User> findDayuXiaoyu(){
		//select * from A where  age>1 and age<10
		//gte大于等于 lte小于等于
		//ge大于 lt小于
		//ne 不等于
		Query ge_lt =  new Query(Criteria.where("age").gt(1).lt(10));//大于等于
		Query gte_lte =  new Query(Criteria.where("age").gte(1).lte(10));//小于等于
		Query ne =  new Query(Criteria.where("age").ne(5));//不等于
		return mongoTemplate.find(ne, User.class);
	}
	/**
	 * 模糊查询  regex
			完全匹配  "^hzb$"
			右匹配    "^.*hzb$"
			左匹配    "^hzb.*$"
			双开       "^.*hzb.*$"
	 */
	@Override
	public List<User> findLike(){
		Query query =  new Query(Criteria.where("name").regex("^.*2$"));
		return mongoTemplate.find(query, User.class);
	}
	@Override
	public List<User> findInNot(){
		//in 和not in
		Query in =  new Query(Criteria.where("age").in(5,6,7));
		//in
		Query notIn =  new Query(Criteria.where("age").nin(5,6,7));
		//not in
		return mongoTemplate.find(notIn, User.class);
	}
	@Override
	public List<User> findDie(){
		Query findDie =  new Query(Criteria.where("age").mod(9, 1));
		//取模(取余) age % 5==1
		return mongoTemplate.find(findDie, User.class);
	}
	@Override
	public List<User> findAllMatching(){
		Query findAllMatching =  new Query(Criteria.where("list").all(1L,2L));
		//all 数据 [name=10, age=10, id=4, list=[1, 2]]
		//完全匹配返回数据
		return mongoTemplate.find(findAllMatching, User.class);
	}
	
	@Override
	public List<User> findSize(){
		Query findSize =  new Query(Criteria.where("list").size(2));
		//size 数据 [name=10, age=10, id=4, list=[1, 2]] 匹配数组内的元素数量的 list.size =2 返回 
		return mongoTemplate.find(findSize, User.class);
	}
	@Override
	public List<User> findExists(){
		Query findExists =  new Query(Criteria.where("list").exists(false));
		//exists 判断字段是否为空  等同于sql的  list is null  和 list  is not null
		return mongoTemplate.find(findExists, User.class);
	}
	@Override
	public List<User> findType(){
		Query findType =  new Query(Criteria.where("list").type(4));
		//匹配数据类型
		//Double				1	“double”	
		//String				2	“string”	
		//Object				3	“object”	
		//Array	  			    4	“array”	
		//Binary data			5	“binData”	
		//Undefined				6	“undefined”	Deprecated.
		//ObjectId				7	“objectId”	
		//Boolean				8	“bool”	
		//Date	    			9	“date”	
		//Null	  				10	“null”	
		//Regular Expression	11	“regex”	
		//DBPointer				12	“dbPointer”	Deprecated.
		//JavaScript			13	“javascript”	
		//Symbol				14	“symbol”	Deprecated.
		//JavaScript (with scope)	15	“javascriptWithScope”	
		//32-bit integer		16	“int”	
		//Timestamp				17	“timestamp”	
		//64-bit integer		18	“long”	
		//Decimal128			19	“decimal”	New in version 3.4.
		//Min key				-1	“minKey”	
		//Max key				127	“maxKey”
		return mongoTemplate.find(findType, User.class);
	}
	@Override
	public List<User> findNot() {
		Query findDie =  new Query(Criteria.where("age").not().mod(9, 1));
		//not取反
		return mongoTemplate.find(findDie, User.class);
	}
	@Override
	public long count() {
		Query count =  new Query(Criteria.where("age").not().mod(9, 1));
		//总条数
		return mongoTemplate.count(count, User.class);
		
	}
	@Override
	public List<?> distinct(){
		return mongoTemplate.getCollection("User").distinct("name");
	}
	@Override
	public List<?> sort(){
		Query sort =  new Query();
		//排序
		return mongoTemplate.find(sort.with(new Sort(Direction.DESC, "id")), User.class);
	}
	@Override
	public List<?> limit(){
		Query limit =  new Query();
		//分页
		//skip 设置起始数
		//limit 设置查询条数
		return mongoTemplate.find(limit.skip(1).limit(3), User.class);
	}
	/*@Override
	public BasicDBList  groud(){
		 GroupByResults<User> user =  mongoTemplate.group("user", new GroupBy("age"), User.class);
		 DBObject obj = user.getRawResults();
         BasicDBList dbList = (BasicDBList) obj.get("retval");
		 return dbList;
	}*/
	/*@Override
	public List<User> findElemMatch(){
		Query ElemMatch =  new Query(Criteria.where("map").elemMatch(Criteria.where("test1").is(1L).and("test2").is(2L)));
		//如果字段中是一个集合,可以通过key 与value做判断,注:这个集合需要有key与value
		return mongoTemplate.find(ElemMatch, User.class);
	}
	*/
}

junit测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes=MongodbApplication.class)
public class test {
		@Autowired
	    private UserDao userDao;
		@Autowired
		private StudentDao studentDao;
		@Autowired
		private MongoTemplate mongo;
		/**
		* 循环打印到控制台
		*/
		public  void forList(List<?> list) {
		for (Object object : list) {
			System.err.println(((User)object).toString());
		}
			
		}
		//添加
		@Test
		public void insert() {
			List<Long> list = new ArrayList<>();
			list.add(1L);
			list.add(2L);
			
			Map<String,Long> map = new HashMap<String,Long>();
			map.put("test1", 1L);
			map.put("test2", 2L);
			User user =	new User();
			user.setAge(10);
			user.setName(""+10);
			user.setList(list);
			user.setMap(map);
			userDao.insert(user);
		}
		//修改
		@Test
		public void update() {
			User user =	new User();
			user.setId(3l);
			user.setAge(5);
			user.setName(""+1+""+2);
			userDao.update(user);
		}
		//查询所有
		@Test
		public void select() {
			List<User> list = userDao.findAll();
			forList(list);
		}
		//查询第一条
		@Test
		public void fondOne() {
			User user = userDao.findOne();
			System.err.println(user.toString());
		}
		//id查询
		@Test
		public void findById() {
			User user = userDao.findById(1L);
			System.err.println(user.toString());
		}
		//指定返回啥字段
		@Test
		public void find() {
			List<User> list =userDao.find();
			forList(list);
		}
		//or (或)
		@Test
		public void or() {
			List<User> list =userDao.findOr();
			forList(list);
		}
		//or  and  
		@Test
		public void orAnd() {
			List<User> list =userDao.findOrAnd();
			forList(list);
		}
		// 大于小于 ,大于等于小于等于,不等于
		@Test
		public void arithmetical() {
			List<User> list =userDao.findDayuXiaoyu();
			forList(list);
		}
		//in ,not in
		@Test
		public void in() {
			List<User> list = userDao.findInNot();
			forList(list);
		}
		//Die 取模
		@Test
		public void Die() {
			List<User> list = userDao.findDie();
			forList(list);
		}
		//匹配list
		@Test
		public void findAllMatching() {
			List<User> list = userDao.findAllMatching();
			forList(list);
			
		}
		//list最大长度
		@Test
		public void findSize() {
			List<User> list = userDao.findSize();
			forList(list);
		}
		//是否为空
		@Test
		public void findExists() {
			List<User> list = userDao.findExists();
			forList(list);
		}
		//type类型
		@Test
		public void findType() {
			List<User> list = userDao.findType();
			forList(list);
		}
		//取反
		@Test
		public void findNot() {
			List<User> list = userDao.findNot();
			forList(list);
		}
		//最大值
		@Test
		public void count() {
			long count = userDao.count();
			System.err.println(count);
		}
		//去重
		@Test
		public void distinct() {
			List list = userDao.distinct();
			forList(list);
		}
		//排序
		@Test
		public void sort() {
			List list = userDao.sort();
			forList(list);
		}
		//分页
		@Test
		public void limit() {
			List list = userDao.limit();
			forList(list);
		}
		//模糊查询
		@Test
		public void like() {
			List list =  userDao.findLike();
			forList(list);
		}
		
		/*@Test
		public void findElemMatch() {
			List<User> list = userDao.findElemMatch();
			forList(list);
		}*/
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值