SpringBoot整合MongoDB
依赖坐标
<!--这个起步依赖会帮我们自动注入一个MongodbTemplate对象-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
实体类
package cn.itcast.mongodb.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
//@Document("xxx") 指定该实体类中对应的表名称,如果不指定默认是类名
public class User {
@Id //强制指定该字段为主键
//如果主键类型是Integer类型,在插入数据时就必须指定id,如果不指定就会报错
//如果主键类型是String类型,在插入时可以不指定,不指定在默认插入数据时会默认插入一个ObjectId(0-9,a-f)
//如果主键类型是ObjectId类型,可以不指定,不指定默认也会给一个ObjectId的值
private Integer id; //id属性,即使不加@Id,默认也是主键
private String username;
private String password;
private Integer age;
}
测试
测试插入数据
package cn.itcast.mongodb;
import cn.itcast.mongodb.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner;
import javax.jws.soap.SOAPBinding;
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class TestMongodb {
@Autowired
private MongoTemplate template;
//新增一条记录
//如果在插入数据时,不指定表名,默认是类名
@Test
public void test01() {
User zhs = User.builder().id(1).username("zhs").password("123").age(23).build();
User insert = template.insert(zhs);
System.out.println("insert = " + insert);
}
批量插入数据
@Test
public void test01() {
//批量插入
User user1 = User.builder().id(2).username("zhs").password("000").age(23).build();
User user2 = User.builder().id(3).username("lisi").password("111").age(24).build();
User user3 = User.builder().id(4).username("ww").password("222").age(25).build();
User user4 = User.builder().id(5).username("zz").password("333").age(32).build();
User user5 = User.builder().id(6).username("mq").password("444").age(50).build();
ArrayList userList = new ArrayList();
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
template.insertAll(userList);
}
测试删除数据
//根据条件删除一条记录
//根据id进行删除
@Test
public void test02() {
//删除的时候要注意字段名称和字段类型 默认表中的id为_id
Query query = Query.query(Criteria.where("_id").is(1));
template.remove(query, User.class); //根据后面的实体类的类名去找对应的表名,或者注解指定的表名
//template.remove(query, "user"); //在数据库中查询指定表名的表
}
修改数据
//根据条件进行修改
@Test
public void test03(){
//只修改符合条件的第一个
//UpdateResult updateResult = template.updateFirst(Query.query(Criteria.where("username").is("zhs")), Update.update("password", "0000"), "user");
//System.out.println("updateResult = " + updateResult);
//修改多个字段
Query query = Query.query(Criteria.where("username").is("zhs"));
//Update update = Update.update("password", "789");
Update update = new Update();
update.set("password", "4512");
update.set("age", "100");
UpdateResult user = template.updateFirst(query, update, "user");
System.out.println("user = " + user);
}
模糊查询
//模糊查询
@Test
public void test07(){
//名称中包含
//正则表达式 %xx 等同于 regex("xx$") xx%等同于 regex("^xx") x等同于 regex("^x$") 相当于是 %xx% 相当于是 regex("/xx/")
Query query = Query.query(Criteria.where("username").regex("zh"));
List<User> users = template.find(query, User.class);
for (User user : users) {
System.out.println("user = " + user);
}
}
复合查询
//符合条件查询
@Test
public void test08() {
//查询条件
//姓名中包含li并且年龄大于30
Query query = Query.query(Criteria.where("username").regex("li").and("age").gt(20));
List<User> users = template.find(query, User.class);
for (User user : users) {
System.out.println("user = " + user);
}
}
//符合条件查询
@Test
public void test09() {
//查询条件
//姓名中包含li或者年龄大于30
Criteria criteria1 = Criteria.where("username").regex("li");
Criteria criteria2 = Criteria.where("age").gt(20);
Criteria criteria = new Criteria();
criteria.orOperator(criteria1, criteria2);
Query query = Query.query(criteria);
List<User> users = template.find(query, User.class);
for (User user : users) {
System.out.println("user = " + user);
}
}
分页查询
//分页查询
@Test
public void test10(){
Query query = new Query();
//表示是显示3条,跳过第一条
//query.limit(3).skip(1); //弊端 需要手动计算 跳过记录数 = (当前页码 - 1 )* 每页显示条数
query.with(PageRequest.of(1, 3)); //默认是从第0页开始的,所以,page= 前端传递过来的page-1
List<User> users = template.find(query, User.class);
for (User user : users) {
System.out.println("user = " + user);
}
}
排序查询
//排序查询
@Test
public void test11(){
Query query = new Query();
query.with(PageRequest.of(1, 3));//先对结果进行分页查询
//ASC表示升序排列 或者DESC表示降序 properties表示要对哪个字段进行排序
query.with(Sort.by(Sort.Direction.ASC, "age"));
List<User> users = template.find(query, User.class);
for (User user : users) {
System.out.println("user = " + user);
}
}
统计
//统计
@Test
public void test12() {
long count = template.count(new Query(), User.class);
System.out.println("count = " + count);
}