MongoDb初识(1)
基本概念解析
MongoDb属于非关系型数据库之一,mongodb中 基本概念是 文档、集合、数据库,下表是从菜鸟教程里面复制的关于MongoDb的一些常见理念,可能写的不好,以后再对mongo认知更多的基础上,再次修改和提升文档编辑。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDb不支持 | |
primary key | primary key | 主键,MondoDb 自动将_id字段设置为主键 |
SpringMVC整合
常规的spring-mvc配置在此不多做赘述,这里面主要说下spring-mongo.xml中的配置和pom文件配置中的问题。SpringMVC中配置使用mongo的pom依赖是比较坑的一个点,springmvc中使用mongo一般情况下依赖于两个jar ,分别是mongo-java-driver和spring-data-mongodb,spring-data-mongodb主要用户注入mongoTemplate,能够比较方便的使用java对mongodb实现CRUD
- 先说pom文件中的依赖吧
首先是mongodb本身的版本是无关紧要的,直接用最新版本的都可以,但是在实际使用中,mongodb的java驱动包和spring整合的jar包版本是有版本要求的。
Mongodb的java驱动包分为1.x ,2.x,3.x ,目前主流使用的还是2.x和3.x的版本,如果项目本身spring版本是4.x版本的,那么spring-data-mongo的jar包版本只能是1.x,我之前就是因为本身spring是4.x的,但是使用了spring-data-mongo 2.x的版本,所以运行时一直报错
java.lang.NoSuchMethodError: org.springframework.util.Assert.isTrue ,下面直接贴上我的pom文件依赖
<!--MongoBD-Spring整合-->
<dependency> <groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.14.3</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.10.7.RELEASE</version>
</dependency>
然后是我自己spring-mongo.xml的配置,spring-mongo.xml中配置需要注意的就是你连接的mongodb版本是否设置了用户名密码,如果设置用户名密码,连接的配置是一样的,首先贴下具体配置文件,使用密码和不使用密码仅仅在于其中一段是否使用用户名密码注释,各自根据实际情况进行修改
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation=" http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<mongo:mongo replica-set="${mongo.hostport}">
<mongo:options connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
auto-connect-retry="true"
socket-keep-alive="true"
socket-timeout="${mongo.socketTimeout}"
slave-ok="true"
write-number="1"
write-timeout="0"
write-fsync="true" />
</mongo:mongo>
<!-- 使用用户名密码 -->
<!-- <mongo:db-factory username="${mongo.username}" password="${mongo.password}"
dbname="${mongo.databaseName}" mongo-ref="mongo"/>-->
<!-- 不使用用户名密码 -->
<mongo:db-factory dbname="${mongo.databaseName}" mongo-ref="mongo"/>
<bean id="MongoTemplate"
class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>
</beans>
除了配置spring-mongo.xml 还需要在spring-mvc.xml中引入spring-mongo.xml配置
<!-- mongodb 配置-->
<import resource="spring-mongo.xml"/>
下面贴上我的mongo.properties配置
mongo.hostport=10.10.2.4:27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#连接超时时间
mongo.connectTimeout=1000
#等待时间mongo.maxWaitTime=1500
#Socket超时时间
mongo.socketTimeout=1500
#admin登录信息
mongo.username=admin
mongo.password=123456
#DataBaseName
#认证数据库名
mongo.authenticationDbname=mongodb_demo
#要链接的数据库名
mongo.databaseName=mongodb_demo
正常来说,按照这个配置好了,并且如果mongo没有设置什么ip白名单等限制的话,项目应该是能直接启动并且通过注入的方式使用MongoTemplate的
基础查询
- 单个保存
单个保存,在定义好mongodb需要保存的类后,可以直接调用mongoTemplate.save(Object obj)方法进行保存,具体如下:
@Autowired
private MongoTemplate mongoTemplate;
/** * @description: 保存单个
* @author qjx
* @createdate: 2020-05-22 14:34
*/
@RequestMapping("/saveSingleDemo")
@ResponseBody
public OutputBean saveSingleDemo(HttpServletRequest request){
OutputBean outputBean = new OutputBean();
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);
outputBean.setMsg(CodeConstants.Basic.SUCCESS);
try{
MongoDemoDTO mongoDemoDTO = new MongoDemoDTO();
mongoDemoDTO.setId(IdUtil.getSnowflake(0,1).nextIdStr());
mongoDemoDTO.setUserName(RandomUtil.randomString(10));
mongoDemoDTO.setAge(i);
mongoDemoDTO.setCity("上海");
mongoDemoDTO.setCreateDate(new Date());
List<String> orderIdList =
Arrays.asList(IdUtil.objectId(),IdUtil.simpleUUID());
mongoDemoDTO.setOrderIdList(orderIdList);
mongoDemoDTO.setSalary(RandomUtil.randomDouble());
mongoTemplate.save(mongoDemoDTO);
}catch (Exception e){
e.printStackTrace();
}
return outputBean;
}
- 保存list
保存一个集合的方式需要使用mongoTemplate.insertAll(Collection obj);
/** * @description: 保存集合
* 数据至mongodb 需要注意的是查看 spring-mongo.xml中配置,mongodb 有没有用户名密码是不同的配置 * @author qjx
* @createdate: 2020-05-22 14:34
*/
@RequestMapping("/saveDemo")
@ResponseBodypublic OutputBean saveDemo(HttpServletRequest request){
OutputBean outputBean = new OutputBean();
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);
outputBean.setMsg(CodeConstants.Basic.SUCCESS);
try{
List<MongoDemoDTO> mongoDemoDTOList = new LinkedList<>();
for(int i = 0;i<100;i++){
MongoDemoDTO mongoDemoDTO = new MongoDemoDTO(); mongoDemoDTO.setId(IdUtil.getSnowflake(0,1).nextIdStr()); mongoDemoDTO.setUserName(RandomUtil.randomString(10)); mongoDemoDTO.setAge(i);
mongoDemoDTO.setCity("上海"+i*i);
mongoDemoDTO.setCreateDate(new Date());
List<String> orderIdList =
Arrays.asList(IdUtil.objectId(),IdUtil.simpleUUID()); mongoDemoDTO.setOrderIdList(orderIdList); mongoDemoDTO.setSalary(RandomUtil.randomDouble()); mongoDemoDTOList.add(mongoDemoDTO);
}
mongoTemplate.insertAll(mongoDemoDTOList);
}catch (Exception e){
e.printStackTrace();
}
return outputBean;}
- 查询list
查询的话需要封装自定义查询条件,下面代码中简单示例基本查询以及排序和分页
/**
* @description: 查询
* @author qjx
* @createdate: 2020-05-22 14:35
*/
@RequestMapping("/queryDemoList")
@ResponseBody
public OutputBean queryDemo(HttpServletRequest request){
OutputBean outputBean = new OutputBean();
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);
outputBean.setMsg(CodeConstants.Basic.SUCCESS);
try{
Criteria criteria = new Criteria();
// 进行查询的字段类型必须和实体类中一样,建议使用dto实体类方式传值
// 普通查询//
criteria.and("age").gt(4).and("salary").gt(0.5);
Query query = new Query(criteria);
// 排序
Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC,"id"));
query.with(sort);
// 分页 从1 开始,查询10条
query.skip(1).limit(10);
List<MongoDemoDTO> mongoDemoDTOList = mongoTemplate.find(query,
MongoDemoDTO.class);
outputBean.setData(mongoDemoDTOList);
}catch (Exception e){
e.printStackTrace();
}
return outputBean;
}
- 查询单个
查询单个的话其实一般都是使用主键id或能够确定唯一的条件进行查询,具体如下代码:
/**
* @description: 查询单个
* @author qjx
* @createdate: 2020-05-22 14:35
*/
@RequestMapping("/queryDemoDetail")
@ResponseBodypublic OutputBean queryDemoDetail(HttpServletRequest request){
OutputBean outputBean = new OutputBean();
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);
outputBean.setMsg(CodeConstants.Basic.SUCCESS);
try{
Criteria criteria = new Criteria();
criteria.and("id").is("1263724724903608320");
Query query = new Query(criteria);
MongoDemoDTO mongoDemoDTO = mongoTemplate.findOne(query,
MongoDemoDTO.class);
outputBean.setDataObject(mongoDemoDTO);
}catch (Exception e){
e.printStackTrace();
}
return outputBean;
}
- 更新
mongo中的更新和sql中一般更新区别在于mongo中一般是查询出并更新,并且查询和更新是两个不同的拼接语句,具体如下:
/**
* @description: 更新
* @author qjx
* @createdate: 2020-05-22 14:35
*/
@RequestMapping("/updateDemo")
@ResponseBody
public OutputBean updateDemo(HttpServletRequest request){
OutputBean outputBean = new OutputBean();
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);
outputBean.setMsg(CodeConstants.Basic.SUCCESS);
try{
Criteria criteria = new Criteria();
criteria.and("id").is("1263724724903608320");
Query query = new Query(criteria);
Update update = new Update();
update.set("city","上海helloworld");
MongoDemoDTO mongoDemoDTO = mongoTemplate.findAndModify(query,
update,MongoDemoDTO.class);
outputBean.setDataObject(mongoDemoDTO);
}catch (Exception e){
e.printStackTrace();
}
return outputBean;
}
- 删除
mongodb删除和更新有一点相同的地方就是查询出后删除,具体如下代码:
/**
* @description: 更新
* @author qjx
* @createdate: 2020-05-22 14:35
*/
@RequestMapping("/deleteDemo")
@ResponseBody
public OutputBean deleteDemo(HttpServletRequest request){
OutputBean outputBean = new OutputBean();
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);
outputBean.setMsg(CodeConstants.Basic.SUCCESS);
try{
Criteria criteria = new Criteria();
criteria.and("id").is("1263724724903608320");
Query query = new Query(criteria);
MongoDemoDTO mongoDemoDTO =
mongoTemplate.findAndRemove(query,MongoDemoDTO.class); outputBean.setDataObject(mongoDemoDTO);
}catch (Exception e){
e.printStackTrace();
}
return outputBean;
}