04.Java操作MongoDB

一、java原生操作MongoDB的crud

说明:mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动、这用即可

1、创建工程、引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mongodb</groupId>
    <artifactId>mongodbdemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--MongoDB驱动-->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.8.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

2、创建测试类

package com.mongodbTest.demo;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.junit.Test;


import java.util.Date;

public class MongoFirstTest {

    //插入一条数据
    @Test
    public void testInsert(){
        MongoClient mongoClients = MongoClients.create("mongodb://127.0.0.1:27017");
        MongoDatabase mongoDatabase = mongoClients.getDatabase("spitdb");
        MongoCollection<Document> collection = mongoDatabase.getCollection("spit");
        Document document = new Document("context","原生pai").append("userid","11").append("vistis","99").append("time",new Date());
        collection.insertOne(document);
        mongoClients.close();
    }
}

运行后、查看mongo

3、创建测试类curd

package com.mongodbTest.demo;

import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


import java.util.Date;

public class MongoCrudTest {
    //连接对象
    private MongoClient mongoClient=null;
    //数据库对象
    private MongoDatabase spitdbDatabase=null;
    //集合对象
    private MongoCollection<Document> collection=null;
    @Before
    public void setUp() throws Exception {
        //创建一个连接,自带连接池效果
        mongoClient= MongoClients.create("mongodb://127.0.0.1:27017");
        //操作一个数据库,如果数据库不存在,当您为该数据库首次存储数据时,会自动创建数据库。
        spitdbDatabase = mongoClient.getDatabase("spitdb");
        //得到一个集合对象,如果集合不存在,当您为该数据库首次存储数据时,会自动创建集合。
        collection = spitdbDatabase.getCollection("spit");
    }

    @After
    public void tearDown() throws Exception {
        //释放资源,关闭连接
        mongoClient.close();
    }

    //插入一个文档
    @Test
    public void testInsertOne(){

        //创建一个文档,参数可以接收键值对,也可以直接接收一个Map对象
        //文档对象的本质是BSON类型,该类型对应java.util.Map;BSON数组对应的是java.util.List
        Document document=new Document("content","1111").append("userid","111").append("visits",1234).append("publishtime",new Date());

        //插入一个文档,如果文档没有指定_id,则自动生成_id和值
        // 如果批量插入,使用insertMany(list)
        collection.insertOne(document);
    }
    //更新一个文档
    @Test
    public void testUpdateOne(){
        //条件文档数据,注意,主键_id的类型比较特殊,如果是自动生成的主键,则是ObjectId类型
        Document conditionDocument=new Document("_id",new ObjectId("5ca4c0877245b96d1060eb2d"));
        //要修改后的文档数据,其中$set代表只更新部分字段
        Document document=new Document("$set",new Document("content","原生"));

        //更新一个文档,参数1:条件,参数2:要更新的内容
        collection.updateOne(conditionDocument,document);
        // 如果批量更新,使用updateMany(bson1,bson2),条件文档中可以编写更复杂的条件。
    }

    //删除一个文档
    @Test
    public void testDeleteOne(){
        //条件文档数据,注意,主键_id的类型比较特殊,如果是自动生成的主键,则是ObjectId类型
        Document conditionDocument=new Document("_id",new ObjectId("5ca461d37245b9a3d0525203"));
        //更新一个文档,参数1:条件
        collection.deleteOne(conditionDocument);
        // 如果批量删除,使用deleteMany(bson1,bson2),条件文档中可以编写更复杂的条件。
    }
    
    //查询所有
    @Test
    public void testFindAll(){
        //查询所有文档
        FindIterable<Document> documents = collection.find();
        printDocument(documents);
        //如果需要限制返回行数,可以在find()方法后添加first()、limit()等方法
    }

    //打印文档
    private void printDocument(FindIterable<Document> documents) {
        for (Document document : documents) {

            System.out.println("-------------------------------");
//            System.out.println("编号:" + (document.getObjectId("_id")));
            System.out.println("内容:" + document.getString("content"));
            System.out.println("用户编号:" + document.getString("userid"));
            System.out.println("浏览量 :" + document.getInteger("visits"));
            System.out.println("发布时间:" + document.getDate("publishtime"));
        }
    }


    //条件查询
    @Test
    public void testFindByCondition(){
        //查询userid为8888,且浏览量大于等于1000的所有文档:{$and:[{$eq:{"userid":"8888"},$gte:{"visits":1000}}]}
        //Filters是一个构造条件的帮助类
        FindIterable<Document> documents = collection.find(Filters.and(Filters.eq("userid","8888"),Filters.gte("visits",1000)));
        printDocument(documents);
    }

}

二、SpringDataMongoDB使用

SpringDataMongo是DBSpringData家族成员之一,用于操作MongoDB的持久层框架,封装了底层的mongodb-driver。

1、创建工程、引入依赖

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

2、创建application.yml

 #数据源配置
  data:
    mongodb:
      # 主机地址
      host: 127.0.0.1
      # 数据库
      database: spitdb
      # 默认端口是27017
      port: 27017

 3、启动类

@SpringBootApplication
public class SpitApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpitApplication.class, args);
	}

	@Bean
	public IdWorker idWorker(){
		return new IdWorker(1, 1);
	}
	
}

4、增删改查

--实体类

//把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
@Document(collection="spit")
public class Spit implements Serializable {
    //主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
    @Id
    private String id;//主键
    //该属性对应mongodb的字段的名字,如果一致,则无需该注解
    @Field("content")
    private String content;//吐槽内容
    private Date publishtime;//发布日期
    private String userid;//发布人ID
    private String nickname;//昵称
    private Integer visits;//浏览量
    private Integer thumbup;//点赞数
    private Integer share;//分享数
    private Integer comment;//回复数
    private String state;//状态
    private String parentid;//上级ID
    //getter and setter.....

--数据访问接口

public interface SpitRepository extends MongoRepository<Spit,String> {
}

--业务逻辑层

@Service
public class SpitService {
    @Autowired
    private SpitRepository spitRepository;

    @Autowired
    private IdWorker idWorker;

    /**
     * 增加
     *
     * @param spit
     */
    public void saveSpit(Spit spit) {
        spit.setId(idWorker.nextId() + "");
        spitRepository.save(spit);
    }

    /**
     * 修改
     *
     * @param spit
     */
    public void updateSpit(Spit spit) {
        spitRepository.save(spit);
    }

    /**
     * 删除
     *
     * @param id
     */
    public void deleteSpitById(String id) {
        spitRepository.deleteById(id);
    }

    /**
     * 查询全部列表
     *
     * @return
     */
    public List<Spit> findSpitList() {
        return spitRepository.findAll();
    }

    /**
     * 根据ID查询实体
     *
     * @param id
     * @return
     */
    public Spit findSpitById(String id) {
        return spitRepository.findById(id).get();
    }
}

--controll层

@RestController
@CrossOrigin
@RequestMapping("/spit")
public class SpitController {

    @Autowired
    private SpitService spitService;
    /**
     * 增加
     * @param spit
     */
    @PostMapping
    public ResultDTO add(@RequestBody Spit spit){
        spitService.saveSpit(spit);
        return new ResultDTO(true, StatusCode.OK,"增加成功");
    }

    /**
     * 修改
     * @param spit
     */
    @PutMapping("/{id}")
    public ResultDTO edit(@RequestBody Spit spit, @PathVariable String id ){
        spit.setId(id);
        spitService.updateSpit(spit);
        return new ResultDTO(true,StatusCode.OK,"修改成功");
    }

    /**
     * 删除
     * @param id
     */
    @DeleteMapping("/{id}")
    public ResultDTO remove(@PathVariable String id ){
        spitService.deleteSpitById(id);
        return new ResultDTO(true,StatusCode.OK,"删除成功");
    }

    /**
     * 查询全部数据
     * @return
     */
    @GetMapping
    public ResultDTO list(){
        return new ResultDTO(true,StatusCode.OK,"查询成功",spitService.findSpitList());
    }

    /**
     * 根据ID查询
     * @param id ID
     * @return
     */
    @GetMapping("/{id}")
    public ResultDTO listById(@PathVariable String id){
        return new ResultDTO(true,StatusCode.OK,"查询成功",spitService.findSpitById(id));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值