张三大学毕业设计题目是《XXX博客论坛》,他在存储用户评论的时候遇到了一个问题:这些评论数据量很是大,可是价值不是很大,若是存储在 MySQL 数据库中就会浪费性能。java
李四在工做过程当中遇到一个需求:在审批模块中,每个公司均可以自定义请假类型,例如调休、出差等。至关于给每一个公司维护一个本身的数据字典。mysql
张三的痛点是存储的博客评论数据量大可是价值不大,不适合使用Mysql存储。李四的痛点是须要维护一个数据字典,不适合用关系型数据局。为了解决张三和李四的痛点,这个时候非关系型文档型数据库 MongoDB 闪亮登场。spring
MongoDB是一个跨平台的,面向文档的数据库,是当前NoSQL数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。sql
MongoDB 最大的特色是他支持的查询语言很是强大,其语法有点相似于面向对象的查询语言,几乎能够实现相似关系数据库单表查询的绝大部分功能,并且还支持对数据创建索引。它是一个面向集合的,模式自由的文档型数据库。具体特色总结以下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持彻底索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)支持 Python,Java,C,Javascript,Perl及 C++ 语言的驱动程序
(9)文件存储格式为 BSON(一种 JSON 的扩展)mongodb
MongoDB 的逻辑结构是一种层次结构。主要由:文档 (document)、集合(collection)、数据库 (database) 这三部分组成的。
(1)MongoDB 的文档,至关于关系数据库中的一行记录。
(2)多个文档组成一个集合,集合至关于关系数据库的表。
(3)多个集合逻辑上组织在一块儿,就是数据库。docker
MongoDB | MySQl |
---|---|
数据库(database) | 数据库(database) |
集合(Collection | 表(table) |
文档(document) | 行(row) |
主键,MongoDB默认将_id设为主键 | 主键 |
索引 | 索引 |
启动MongoDB服务数据库
docker run -itd --name mongo -p 27017:27017 mongo --auth
注:1. 若是是购买的服务器,请将安全组的27017端口打开。 2. -p 27017:27017 :容器服务的 27017 端口映射到服务器的27017端口。外部能够直接经过服务器 ip:27017 访问到 mongodb 的服务。
--auth:须要密码才能访问。编程
##进入到容器内部 docker exec -it mongo mongo admin ##建立系统管理员 db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); ##验证帐户密码 db.auth('admin', '123456') ##建立其余数据库 use ems ##在该数据库下建立其余帐户 db.createUser({ user: 'root', pwd: 'abc123456', roles: [ { role: "readWrite", db:"ems" } ] }); ##验证帐户密码 db.auth('root', 'abc123456')
建立数据库安全
<!-- MongoDB--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
spring: data: mongodb: uri: mongodb://root:123456@localhost:27017/test
帐户:root
密码:123456
数据库:testspringboot
import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; /** * 经常使用收款人 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @Document(collection = "common_account") public class CommonAccount { @Id private String id; //公司id private Integer companyId; //付款人 private String payer; //银行 private String bank; //分支行 private String bankBranch; //帐号 private String bankNum; }
关键注解:1. @Document(collection = "common_account")
@Document表示这是一个集合,当你保存数据的时候若是你没有建立集合,他会自动给你建立一个名为 common_account 的集合。2. @Id:随机生成id
@Repository public interface CommonAccountRepository extends MongoRepository<CommonAccount, String> { //获取该公司的全部经常使用收款人帐户 List<CommonAccount> getByCompanyId(Integer companyId); }
extends MongoRepository:经过继承 MongoRepository 能够使用它不少经常使用的方法。
public interface CommonAccountService { //获取该公司的收款帐户 List<CommonAccount> getCommonAccount(Integer companyId); //添加收款帐户 void addCommonAccount(CommonAccount commonAccount); //更新收款帐户 void updateCommonAccount(CommonAccount commonAccount); //删除收款帐户 void deleteCommonAccount(String id); }
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; import java.util.List; @Service public class CommonAccountServiceImpl implements CommonAccountService { @Autowired private CommonAccountRepository commonAccountRepository; @Autowired private MongoTemplate mongoTemplate; @Override public List<CommonAccount> getCommonAccount(Integer companyId) { List<CommonAccount> accountList = commonAccountRepository.getByCompanyId(companyId); return accountList; } @Override public void addCommonAccount(CommonAccount commonAccount) { commonAccountRepository.save(commonAccount); } @Override public void updateCommonAccount(CommonAccount commonAccount) { Query query = Query.query(Criteria.where("id").is(commonAccount.getId())); Update update = new Update(); update.set("companyId", commonAccount.getCompanyId()); update.set("payer", commonAccount.getPayer()); update.set("bank", commonAccount.getBank()); update.set("bankBranch", commonAccount.getBankBranch()); update.set("bankNum", commonAccount.getBankNum()); mongoTemplate.updateFirst(query, update, CommonAccount.class); } @Override public void deleteCommonAccount(String id) { commonAccountRepository.deleteById(id); } }
mongoDB 保存数据的时候默认会新增一个 _class 列,以下图:
添加以下配置,去除_class 列
@Configuration public class MongoConfig { /** * 去掉_class * @param factory * @param context * @param beanFactory * @return */ @Bean public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); try { mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class)); } catch (NoSuchBeanDefinitionException ignore) { } mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)); return mappingConverter; } }
@Test void mongoTest() { CommonAccount commonAccount = new CommonAccount(); commonAccount.setPayer("张三").setBank("交通银行").setBankBranch("北京路分行") .setBankNum("61262663265362").setCompanyId(100); commonAccountService.addCommonAccount(commonAccount); }
微信公众号:eclipse编程。专一于编程技术分享,坚持终身学习。