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 数据库
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);
}*/
}