SpringBoot整合MongoDB Posted 2023-03-30 落魄实习生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合MongoDB相关的知识,希望对你有一定的参考价值。
SpringBoot整合MongoDB
一、创建项目,选择依赖
仅选择Spring Web、Spring Data MongoDB即可
二、引入相关依赖
< ! -- 引入mongodb-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- data- mongodb< / artifactId>
< / dependency>
< ! -- 引入lombok -- >
< dependency>
< groupId> org. projectlombok< / groupId>
< artifactId> lombok< / artifactId>
< / dependency>
三、如果是第一次使用MongoDB,首先先创建用户
> use admin
switched to db admin
> db. createUser ( user: "zlfeng" , pwd: "123456" , roles: [ role: "readWriteAnyDatabase" , db: "admin" ] ) ;
Successfully added user:
"user" : "zlfeng" ,
"roles" : [
"role" : "readWriteAnyDatabase" ,
"db" : "admin"
]
MongoDB权限介绍
权限 说明 read 允许用户读取指定数据库 readWrite 允许用户读写指定数据库 dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除、查看统计或访问system.profile userAdmin 允许用户向system.users集合写入,可以在指定数据库中创建、删除和管理用户 clusterAdmin 必须在admin数据库中定义,赋予用户所有分片和复制集相关函数的管理权限 readAnyDatabase 必须在admin数据库中定义,赋予用户所有数据库的读权限 readWriteAnyDatabase 必须在admin数据库中定义,赋予用户所有数据库的读写权限 userAdminAnyDatabase 必须在admin数据库中定义,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase 必须在admin数据库中定义,赋予用户所有数据库的dbAdmin权限 root 必须在admin数据库中定义,超级账号,超级权限
定义核心配置文件
# 登录用户所在的数据库
spring. data. mongodb. authentication- database= admin
# 数据库的ip地址
spring. data. mongodb. host= 192.168 .133 .142
# MongoDB 端口号
spring. data. mongodb. port= 27017
# 用户账号
spring. data. mongodb. username= zlfeng
# 用户密码
spring. data. mongodb. password= 123456
# 指定使用的数据库
# 不必预先创建,不存在该数据库会自动创建
spring. data. mongodb. database= db_student
五、创建实体类
package cn. byuan. entity ;
import lombok. AllArgsConstructor ;
import lombok. Data ;
import lombok. NoArgsConstructor ;
import lombok. experimental. Accessors ;
import org. springframework. data. annotation. Id ;
import java. io. Serializable ;
import java. util. Date ;
@NoArgsConstructor
@AllArgsConstructor
@Accessors ( chain = true )
@Data
public class Student implements Serializable
@Id
private String studentId;
private String studentName;
private Integer studentAge;
private Double studentScore;
private Date studentBirthday;
创建dao层,这里的dao层有两种写法
(一)dao层写法一
编码部分
package cn. byuan. dao ;
import cn. byuan. entity. Student ;
import org. springframework. data. mongodb. repository. MongoRepository ;
public interface StudentDaoTypeOne extends MongoRepository < Student , String >
Student getAllByStudentName ( String studentName) ;
2.测试部分 在进行测试之前,我们先查询一下数据库,此时不存在db_student的库 开始测试
package cn. byuan ;
import cn. byuan. dao. StudentDaoTypeOne ;
import cn. byuan. entity. Student ;
import org. junit. jupiter. api. Test ;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. boot. test. context. SpringBootTest ;
import java. util. Date ;
import java. util. List ;
@SpringBootTest
class StudentDaoTypeOneTests
@Autowired
private StudentDaoTypeOne studentDaoTypeOne;
@Test
void addOneStudent ( )
for ( Integer count = 0 ; count < 10 ; count++ )
Student student = new Student ( )
. setStudentId ( "student_" + count)
. setStudentName ( "Godfery" + count)
. setStudentAge ( count)
. setStudentScore ( 98.5 - count)
. setStudentBirthday ( new Date ( ) ) ;
studentDaoTypeOne. save ( student) ;
@Test
void deleteOneStudentByStudentId ( )
studentDaoTypeOne. deleteById ( "student_0" ) ;
@Test
void updateOneStudent ( )
Student student = studentDaoTypeOne. getAllByStudentName ( "Godfery1" ) ;
student. setStudentAge ( 22 ) ;
studentDaoTypeOne. save ( student) ;
@Test
void getOneStudentByStudentId ( )
System . out. println ( studentDaoTypeOne. findById ( "student_1" ) ) ;
@Test
void getAllStudent ( )
List < Student > studentList = studentDaoTypeOne. findAll ( ) ;
studentList. forEach ( System . out:: println ) ;
(二)dao层写法二 1.编码部分 接口部分
package cn. byuan. dao ;
import cn. byuan. entity. Student ;
import java. util. List ;
public interface StudentDaoTypeTwo
void addOneStudent ( Student student) ;
void deleteOneStudentByStudentId ( String studentId) ;
void updateOneStudent ( Student student) ;
Student getOneStudentByStudentId ( String studentId) ;
List < Student > getAllStudent ( ) ;
实现类
package cn. byuan. dao. imp ;
import cn. byuan. dao. StudentDaoTypeTwo ;
import cn. byuan. entity. Student ;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. data. mongodb. core. MongoTemplate ;
import org. springframework. stereotype. Repository ;
import java. util. List ;
@Repository
public class StudentDaoTypeTwoImp implements StudentDaoTypeTwo
@Autowired
private MongoTemplate mongoTemplate;
public void addOneStudent ( Student student)
mongoTemplate. save ( student) ;
public void deleteOneStudentByStudentId ( String studentId)
Student student = mongoTemplate. findById ( studentId, Student . class ) ;
if ( student != null )
mongoTemplate. remove ( student) ;
public void updateOneStudent ( Student student)
mongoTemplate. save ( student) ;
public Student getOneStudentByStudentId ( String studentId)
return mongoTemplate. findById ( studentId, Student . class ) ;
public List < Student > getAllStudent ( )
return mongoTemplate. findAll ( Student . class ) ;
2.测试部分
package cn. byuan ;
import cn. byuan. dao. StudentDaoTypeOne ;
import cn. byuan. dao. StudentDaoTypeTwo ;
import cn. byuan. entity. Student ;
import org. junit. jupiter. api. Test ;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. boot. test. context. SpringBootTest ;
import java. util. Date ;
import java. util. List ;
@SpringBootTest
class StudentDaoTypeTwoTests
@Autowired
private StudentDaoTypeTwo studentDaoTypeTwo;
@Test
void addOneStudent ( )
for ( Integer count = 0 ; count < 10 ; count++ )
Student student = new Student ( )
. setStudentId ( "study_" + count)
. setStudentName ( "Echo" + count)
. setStudentAge ( count)
. setStudentScore ( 98.5 - count)
. setStudentBirthday ( new Date ( ) ) ;
studentDaoTypeTwo. addOneStudent ( student) ;
@Test
void deleteOneStudentByStudentId ( )
studentDaoTypeTwo. deleteOneStudentByStudentId ( "study_0" ) ;
@Test
void updateOneStudent ( )
Student student = studentDaoTypeTwo. getOneStudentByStudentId ( "study_1" ) ;
student. setStudentAge ( 21 ) ;
studentDaoTypeTwo. updateOneStudent ( student) ;
@Test
void getOneStudentByStudentId ( )
System . out. println ( studentDaoTypeTwo. getOneStudentByStudentId ( "study_1" ) ) ;
@Test
void getAllStudent ( )
List < Student > studentList = studentDaoTypeTwo. getAllStudent ( ) ;
studentList. forEach ( System . out:: println ) ;
进入数据库查看一下数据 原文地址:https://www.cnblogs.com/byuan/p/14992548.html
MongoTemplate基本使用
一、普通查询操作
1.is查询
Query query = new Query( ) ;
// where.. .is.. . 相当于 where ? = ?
query.addCriteria( Criteria.where( "数据库字段名" ) .is( "你的参数" )) ;
// findOne 返回的是一个对象 Class代表你的表对应的映射类
mongoTemplate.findOne( query, Class.class) ;
// find 返回的是数组
mongoTemplate.find( query, Class.class) ;
2.in查询
ArrayList< String> list = new ArrayList<> ( ) ;
// list代表你的数据
Query query = Query.query( Criteria.where( "数据库字段" ) .in( list)) ;
mongoTemplate.find( query, Class.class) ;
// 如果想要查询指定的数据是否在数据库的数组中,可以用以下方法
Query query = Query.query( Criteria.where( "数据库字段(数组)" ) .is( "你的数组" )) ;
3.字符模糊查询
Query query = Query.query( Criteria.where( "name" ) .regex( "小" )) ;
4.指定字段不返回
query.fields( ) .exclude( "field" ) ;
5.数组中添加或删除一条数据
Query query = Query.query( Criteria.where( "_id" ) .is( "id" )) ;
Update update = new Update( ) ;
// push方法可以在数组中添加一条数据
// pull方法可以在数组中删除一条数据
// update.pull( )
update.push( "字段名称" , "data" ) ;
mongoTemplate.updateFirst( query, update, Class.class) ;
6.批量添加
ArrayList< Class> list = new ArrayList<> ( ) ;
mongoTemplate.insert( list, Class.class) ;
7.数组查询
数组格式:
name:"小明" ,
age:13,
friends:[
name:"小王" ,
age:12
,
name:"小李" ,
age:18
]
当要查询朋友中姓名为小王时
Query query = new Query( ) ;
query.addCriteria( Criteria.where( "friends.$.name" ) .is( "小王" )) ;
mongoTemplate.find( query, User.class) ;
同样更新时也是一样,但是注意,更新时查询条件需要添加
query.addCriteria( Criteria.where( "friends" ) .elemMatch( Criteria.where( "name" ) .is( "小王" )) ;
Update update = Update.update( "friends.$.friends" , "小赵" ) ;
8.数字字符串排序操作
对数据库中数字字符串排序:
加上这一行就行了 亲身体验
query.collation( Collation.of( "zh" ) .numericOrdering( true)) ;
还有根据字符串排序时又是顺序并不是我们所想的字典序,加上下面这个也ok
query.collation( Collation.of( "zh" )) ;
9.分页
//分页
query.limit( 10 ) ;
//排序
Sort sort = Sort.by( Sort.Direction.DESC,"timestamp" ) ;
query.with( sort) ;
Criteria浅解
关键字 解释 eq 等于,第一个参数是对象属性,第二个参数是值 allEq 参数为一个Map对象,相当于多个eq的叠加 gt 大于 ge 大于等于 lt 小于 le 小于等于 between 在两个值之间Expression.between(“age”,new Integer(10),new Integer(20)); like like查询 in in查询
Springboot整合MongoDB的Docker开发,其它应用也类似
1 前言
Docker
是容器开发的事实标准,而Springboot
是Java
微服务常用框架,二者必然是会走到一起的。本文将讲解如何开发Springboot
项目,把它做成Docker
镜像,并运行起来。
2 把Springboot打包成Docker镜像
Springboot
的Web
开发非常简单,本次使用之前讲解过的Springboot
整合MongoDB
的项目,请参考
实例讲解Springboot整合MongoDB进行CRUD操作的两种方式 ,文章中有源码;MongoDB
的安装请参考:用Docker安装一个MongoDB最新版玩玩 。
2.1 修改配置文件,让容器内部连接宿主机服务
修改Springboot
的配置文件,主要是MongoDB
的连接信息:
server.port=8080
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=testdb
spring.data.mongodb.username=user
spring.data.mongodb.password=123456
spring.data.mongodb.host=host.docker.internal
spring.data.mongodb.port=27017
MongoDB
的host
需要修改为host.docker.internal
,而不能是localhost
或者127.0.0.1
。因为Springboot
是运行在Docker
容器里面的,有网络隔离。查看Docker
的network
,有以下三个,默认使用bridge
,这时就无法通过localhost
访问。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
8560aacda859 bridge bridge local
2a276c0230a3 host host local
0eeb101bcf52 none null local
对于Linux
,network
可以切换成host
模式,这可以直接使用localhost
,但不建议这样做,这相当于容器与宿主机共享网络,会有风险。
对于Mac
和Windows
,如果Docker
版本在v18.03
或以上,就可以使用host.docker.internal
。建议使用新版本,就不用考虑更早版本的方案了,哈哈。
2.2 通过Dockerfile生成镜像
通过Dockerfile
来生成镜像是很常用的方式,必须要掌握的,文件具体内容如下:
FROM adoptopenjdk/openjdk8-openj9
VOLUME /tmp
ARG JAR_FILE=target/springboot-mongo-0.0.1-SNAPSHOT.jar
ARG PORT=8080
ARG TIME_ZONE=Asia/Shanghai
ENV TZ=${TIME_ZONE}
ENV JAVA_OPTS="-Xms64m -Xmx256m"
COPY ${JAR_FILE} pkslow.jar
EXPOSE ${PORT}
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -server -jar pkslow.jar
FROM
:指明我们基于某个镜像来打包,因为需要启动Java
应用,所以我们找了一个带JDK
环境的镜像。这就非常灵活了,有非常多带Java
环境的镜像,即使没有合适的,也可以自己做一个;
ARG
:Dockerfile
构建时的参数;
ENV
:环境变量;
COPY
:把文件复制到新的镜像内;
EXPOSE
:暴露端口,这样外部才能访问;
ENTRYPOINT
:启动命令。
准备好了Dockerfile
后,就可以开始打包了:
$ mvn clean package
$ docker build -t pkslow/springboot-mongo:0.0.3 .
Sending build context to Docker daemon 23.43MB
Step 1/10 : FROM adoptopenjdk/openjdk8-openj9
......
Step 10/10 : ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -server -jar pkslow.jar
---> Running in a1274810851f
Removing intermediate container a1274810851f
---> 4a56d8e1a93e
Successfully built 4a56d8e1a93e
Successfully tagged pkslow/springboot-mongo:0.0.3
先用maven
将Springboot
打成jar
包,然后把jar
包放到镜像里,打成新的镜像。
成功后查看镜像列表:
$ docker image ls pkslow/springboot-mongo
REPOSITORY TAG IMAGE ID CREATED SIZE
pkslow/springboot-mongo 0.0.3 4a56d8e1a93e 46 minutes ago 346MB
pkslow/springboot-mongo 0.0.2 3699f9106567 3 hours ago 346MB
pkslow/springboot-mongo 0.0.1 37a35d2af376 3 hours ago 346MB
3 启动应用
应用Springboot
前请先确保已经成功启动了MongoDB
并创建好了相关用户。
启动应用如下:
$ docker run -d --name pkslow-springboot -p 8080:8080 pkslow/springboot-mongo:0.0.3
ee479efc132b7839cf4973c5b78164554485f733489835f8888dcc726d2e1c3f
会返回一个容器ID,可以查看其信息。
查看Docker
容器运行状态,说明它正常运行:
$ docker ps -f name=pkslow*
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee479efc132b pkslow/springboot-mongo:0.0.3 "/bin/sh -c \'java ${…" 51 minutes ago Up 51 minutes 0.0.0.0:8080->8080/tcp pkslow-springboot
查看容器日志命令为:docker logs 容器ID
,如下:
说明Springboot
应用已经正常启动,并成功连接MongoDB
。
用Postman
做一个简单的测试,成功插入一条数据:
4 总结
虽然案例讲的是Springboot
的Docker
开发,但其它应用也是类似的。
这是微软关于Docker
微服务的开发流程图,大体就是应用代码
——Dockerfile
——生成镜像
——容器编排服务
——运行
——测试
——提交
,前面几步都一样的,后面的我们将会采用Kubernetes
,后续再讲解。
欢迎访问南瓜慢说 www.pkslow.com 获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说 >,将持续为你更新...
多读书,多分享;多写作,多整理。
以上是关于SpringBoot整合MongoDB的主要内容,如果未能解决你的问题,请参考以下文章
[SpringBoot系列]SpringBoot如何整合SSMP
springboot怎么整合activiti
SpringBoot完成SSM整合之SpringBoot整合junit
springboot整合jedis
SpringBoot 整合其他框架 -- SpringBoot整合Mybatis
SpringBoot 整合其他框架 -- SpringBoot整合Junit