赞
踩
最近简单看了看mongodb,在这里汇总一下我在使用mongodb开发项目的流程;
环境:
下面我就简单写个用户相关的curd;
开发项目前肯定要先创建对应的数据库和表以及对应数据,mongodb对应的就是数据库、集合和文档;
因为mongodb是nosql,相对于关系型数据库少了很多规则,一般我使用mysql时喜欢直接用navicat创建数据库和表;而mongodb我感觉直接使用指令创建也很简单,下面是我的创建流程:
创建数据库demo:
use demo
创建集合user(隐式创建)+ 新增一条文档
db.user.insert({
username: "xxxx",
age: NumberInt(18),
gender: NumberInt(0),
profile: "我是个大帅哥",
status: NumberInt(0),
createTime: new Date(),
updateTime: new Date()
})
这样就创建了一个user集合,并在该集合内新增了一条数据;
当然也可以显式创建:
db.createCollection("集合名")
都可以,我感觉第一种更好些,因为创建集合时也顺便把集合所需的字段也确定了;(因为mongodb是nosql,所以同一个集合中的数据没有过多要求,虽然确定了字段,但是如果后期新增其他字段是不会出错的,为了保证统一还是需要开发人员自行规范,靠自己约束)
操作如下:
可以通过navicat连接一下mongodb,查看我们的数据库:
创建好了数据库,接下来就要开始通过java进行mongodb的操作了;
注:这里profile写错了,写成了prifile,后面代码已经修改,这里知道就行!
springboot项目创建就不多说了,操作mongodb需要引入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
然后在配置文件添加连接配置:
spring:
application:
name: user-demo
data:
mongodb:
port: 27017 # 端口号
database: user # 数据库名
host: 你的mongodb主机地址
server:
port: 8080
logging:
level:
org.springframework.data.mongodb.core: debug # 控制台显示mongodb日志
然后可以启动项目查看是否能连接成功:
这样就表示连接mongodb连接成功了;
使用mysql时一个表对应一个实体,这里也是一样,所以我们需要创建一个User实体类:
model层User实体:
新东西就是几个注解,简单知道是干什么的就可以了;
下面是repository/mapper层;
使用过jpa的对于Repository应该比较熟悉,使用mybaits其实就是mapper,都是一个意思;
其实spring提供的mongo操作和jpa非常相似,几乎一摸一样;
创建一个UserRepository,继承接口MongoRepository:
import com.yang.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
下面就是service和controller层了,到这就和使用mysql没有什么区别了,这里就不写了;
spring提供的mongo操作和jpa非常非常像,学过jpa的可以直接上手的;
下面我写几个基本的crud操作演示一下:
新增一个用户:
controller:
@PostMapping("/add")
public String addUser(@RequestBody User user) {
userService.addUser(user);
return "新增成功";
}
service:
@Override
public void addUser(User user) {
user.setCreateTime(new Date());
user.setUpdateUpdate(new Date());
userRepository.insert(user);
}
这个insert方法就是自带的,直接用就行;
执行日志和结果:
日志:
一般新增操作也就这个最常用了;
删除操作一般会有通过id删除、通过名称等条件删除;这里演示两个接口:通过id删除和通过用户名删除
通过id删除
和新增一样,直接调用默认提供的deleteById方法即可
Controller
@PostMapping("/delete/{id}")
public String deleteUserById(@PathVariable String id) {
userService.deleteUserById(id);
return "删除成功";
}
Service
@Override
public void deleteUserById(String id) {
userRepository.deleteById(id); // 直接调用默认提供的方法
}
执行结果和日志:
通过username删除
因为通过username删除这属于我们个人定制的需求,所以默认是不会提供对应方法等;熟悉jpa的朋友,应该知道可以在Repository中通过遵循规则的方法名进行定制的查询操作,这里也是类似,比如这里想通过username删除,那么方法名就是deleteUserByUsername():
这就是一些自定义规则:
继续写:
可以看到有很多条件,这些条件都和我们前面定义的User实体有关系;
我们设置为username,就会发现除了username,下面还可以继续通过after、and、between等继续设置条件,非常方便神奇;
只要我们把这个方法名写对了,那么该方法就是我们要的功能,所以一定要按照规则来;
我们这个方法名就是deleteUserByUsername():
Repository
import com.yang.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
void deleteUserByUsername(String username);
}
然后和前面一样,在service调用,controller再调用service就行了;就不演示了;
其实会了通过方法名自定义规则,很多操作都可以完成了,下面再有类似的就不细说了;
测试接口:
修改这里再说一个新东西,我们除了可以通过对应Repository操作数据库,也可以通过一个已经注入的对象进行操作:MongoTemplate
因为在Repository中并未提供相应更新操作,可以重新保存数据实现更新,但是实际上并不是更新操作,所以我们可以通过注入该对象进行操作;
更新操作:
import com.yang.model.User; import com.yang.service.UserService; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; @Service("userService") public class UserServiceImpl implements UserService { @Resource private MongoTemplate mongoTemplate; @Override public void updateUserAgeByName(String username, Integer age) { // 设置更新对象 // 通过Criteria.where("字段名").is(字段值).and().where().is()...设置更新对象 Query query = Query.query(Criteria.where("username").is(username)); // 设置更新字段 Update update = new Update(); // 局部更新,相当于$set,可以查看set源码调用: // this.addMultiFieldOperation("$set", key, value); update.set("age", age); // 更新年龄 mongoTemplate.updateFirst(query, update, User.class); } }
这里主要了解的是:Query和Update两个对象,分别是设置更新对象和设置更新字段,其余就可以自己个人定制了;
controller调用就不写了,直接看结果和日志:
所以更新操作还是使用mongoTemplate比较方便,并且mongodb的一些函数它也有对应实现,可以方便调用;
查询其实很多复杂查询可以通过遵循方法名定制化查询:
这就不过多演示了,已经在删除详细说过了;
这里演示一下常用的分页查询:
分页无非需要两个基本参数:page页码和pageSize当页显示条数;
Repository默认提供的findAll方法可以轻松实现分页:
service
@Override
public Page<User> findUserByPage(Integer page, Integer pageSize) {
// 查询时实际page是从0开始的,需要-1
Page<User> userPage = userRepository.findAll(PageRequest.of(page - 1, pageSize));
return userPage;
使用PageRequest对page和pageSize封装,返回的Page对象中有常用的pageList和total总条数,可以自己点进去看看;
controller
@GetMapping("/list/{page}/{pageSize}")
public List<User> findUserByPage(@PathVariable Integer page, @PathVariable Integer pageSize) {
Page<User> userPage = userService.findUserByPage(page, pageSize);
return userPage.getContent(); // getContent()是获取List集合,getTotalElements()是获取总条数
}
结果和日志:
第二页显示三条数据;
可以看到实际执行的就是一个find一个count;
分页查询如果想加条件就在Repository中加一个条件对应方法即可,参数为条件和Pageable对象即可:
比如由年龄分页查询(Repository中写方法):
Page<User> getUserByAge(Integer age, Pageable pageable);
然后就是在service中调用即可,都一样;
其余复杂点的查询也是在Repository自定义即可,这里不过多演示;
通过spring操作monogdb大致就是这些了,并不难,可以试着模仿写几个crud接口调用一下就明白了,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。