深浅boot2.0第八章mongoDB

mongoDB介绍

  • redis 每秒10万次的以上的操作

  • 10万数量List,先取出然后在筛选。可以通过Lua脚本完善。

  • 经常需要统计,分析和查询的数据。对于 Redis就不便捷了。

  • 用MongoDB,对于统计,按条件查询,和 分析数据。

  • MongoDB 一个最接近关系数据库的NoSQL

  • c++语言编写,

  • 基于分布式 文件存储的 开源数据库 系统。负载高,可添加更多的节点

  • 为 Web应用 提供 可扩展的 高性能数据 存储解决方案

  • 将数据存储 为 一个文档,数据结构 由 键值 对组成

  • 类似于JSON数据集

  • 文档,数组,文档数组

    {
        "id":1,
        "user_name":"张三",
        "roles":[
            {
                "id":1,
                "role_name":"高级工程师"
            },
            {
                
            }
        ]
    }
    

引入POM

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>

配置MongoDB

#服务器地址
spring.data.mongodb.host=192.168.11.131
#用户名
spring.data.mongodb.username=spring
#密码
spring.data.mongodb.password=123456
#端口
spring.data.mongodb.port=27017
#数据库名称
spring.data.mongodb.database=springboot

#无需关注的配置 
#签名 策略 网格 jpa 默认uri

#用于签名的MongoDB数据库
spring.data.mongodb.authentication-database=
#使用字段名策略
spring.data.mongodb.field-naming-strategy=
#网格文件 数据库名称
spring.data.mongodb.grid-fs-database=
#是否启用 MongoDB关于JPA规范的编程
spring.data.mongodb.repositories.type=auto
#默认URI
spring.data.mongodb.uri=mongodb://localhost/test
spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      uri: mongodb://localhost/test
      database: test
      authentication-database: test
      grid-fs-database: test
      username: abc
      password: abc
      repositories:
        enabled: true
      field-naming-strategy: abc

spring boot 自动配置类

Bean类型描述
MongoClientmongodb客户端
MongoProperties自动配置属性
MongoDataAutoConfiguration自动配置类
SimpleMongoDbFactory简单工厂,生成会话。spring.data.mongodb.grid-fs-database=配置为GridFsMongoDbFactory
MongoTemplate模板
MappingMongoConverter类型转换器
MongoMappingContextJava实体的映射内容配置
CustomConversions自定义类型转换器
MongoRepositoriesAutoConfiguration仓库的自动配置
GeoJsonConfiguration关于地理位置Json配置

使用 MongoTemplate

pojo

// 标识为MongoDB文档
@Document
public class User implements Serializable {
	private static final long serialVersionUID = -7895435231819517614L;

	// MongoDB文档编号,主键
	@Id
	private Long id;

	// 在MongoDB中使用user_name保存属性
	@Field("user_name") //mongodb数据规范 下划线分隔
	private String userName = null;

	private String note = null;

	// 角色列表
	private List<Role> roles = null;
	//如果只想 其引用 @DBRef标注,而不是具体的角色信息
}

@Document
public class Role implements Serializable {
	private static final long serialVersionUID = -6843667995895038741L;
	private Long id;
	@Field("role_name")
	private String roleName = null;
	private String note = null;
}
//把角色 当做 一个 文档。
//如果你只是在User中使用,那么你可以不使用@Document

action

@Controller
@RequestMapping("/user")
public class UserController {
	
	// 后面会给出其操作的方法
	@Autowired
	private UserService userService = null;

	// 跳转到测试页面
	@RequestMapping("/page")
	public String page() {
		return "user";
	}
	
	/**
	 * 保存(新增或者更新)用户
	 * @param user -- 用户
	 * @return 用户信息
	 */
	@RequestMapping("/save")
	@ResponseBody
	public User saveUser(@RequestBody User user) {
		userService.saveUser(user);
		return user;
	}
	
	/***
	 * 获取用户
	 * @param id -- 用户主键
	 * @return 用户信息
	 */
	@RequestMapping("/get")
	@ResponseBody
	public User getUser(Long id) {
		User user = userService.getUser(id);
		return user;
	}
	
	
	/**
	 * 查询用户
	 * @param userName --用户名称
	 * @param note -- 备注
	 * @param skip -- 跳过用户个数
	 * @param limit -- 限制返回用户个数
	 * @return
	 */
	@RequestMapping("/find")
	@ResponseBody
	public List<User> addUser(String userName, String note, Integer skip, Integer limit) {
		List<User> userList = userService.findUser(userName, note, skip, limit);
		return userList;
	}
	
	/**
	 * 更新用户部分属性
	 * @param id —— 用户编号
	 * @param userName —— 用户名称
	 * @param note —— 备注
	 * @return 更新结果
	 */
	@RequestMapping("/update")
	@ResponseBody
	public UpdateResult updateUser(Long id, String userName, String note) {
		return userService.updateUser(id, userName, note);
	}
	
	/**
	 * 删除用户
	 * @param id -- 用户主键
	 * @return 删除结果
	 */
	@RequestMapping("/delete")
	@ResponseBody
	public DeleteResult deleteUser(Long id) {
		return userService.deleteUser(id);
	}
	
	
	// 注入接口
    @Autowired
    private UserRepository userRepository = null;
    
    // 执行查询
    @RequestMapping("/byName")
    @ResponseBody
    public List<User> findByUserName(String userName) {
        return userRepository.findByUserNameLike(userName);
    }
    
    // 执行查询
    @RequestMapping("/findOr")
    @ResponseBody
    public User findUserByIdOrUserName(Long id, String userName) {
    	return userRepository.findUserByIdOrUserName(id, userName);
    }
}

service

public interface UserService {
	public void saveUser(User user);

	public DeleteResult deleteUser(Long id);

	public List<User> findUser(String userName, String note, int skip, int limit);

	public UpdateResult updateUser(Long id, String userName, String note);

	public User getUser(Long id);
}



@Service
public class UserServiceImpl implements UserService {

	// 注入MongoTemplate对象
	@Autowired
	private MongoTemplate mongoTmpl = null;

	@Override
	public User getUser(Long id) {
		return mongoTmpl.findById(id, User.class);
		// 如果只需要获取第一个也可以采用如下查询方法
		// Criteria criteriaId = Criteria.where("id").is(id);
		// Query queryId = Query.query(criteriaId);
		// return mongoTmpl.findOne(queryId, User.class);
	}

	@Override //regex 模糊查询,limit 最多返回多少条。 skip代表跳过多少条记录。
	public List<User> findUser(String userName, String note, int skip, int limit) {
		// 将用户名称和备注设置为模糊查询准则
		Criteria criteria = Criteria.where("user_name").regex(userName).and("note").regex(note);
		// 构建查询条件,并设置分页跳过前skip个,至多返回limit个
		Query query = Query.query(criteria).limit(limit).skip(skip);
		// 执行
		List<User> userList = mongoTmpl.find(query, User.class);
		return userList;
	}

	@Override //如果Id已经存在,就是更新对象
	public void saveUser(User user) {
		// 使用名称为user文档保存用户信息
		mongoTmpl.save(user, "user");
		// 如果文档采用类名首字符小写,则可以这样保存
		// mongoTmpl.save(user);
	}

	@Override
	public DeleteResult deleteUser(Long id) {
		// 构建id相等的条件
		Criteria criteriaId = Criteria.where("id").is(id);
		// 查询对象
		Query queryId = Query.query(criteriaId);
		// 删除用户
		DeleteResult result = mongoTmpl.remove(queryId, User.class);
        //DeleteResult有 deletedCount 删除条数
		return result;
	}

	@Override
	public UpdateResult updateUser(Long id, String userName, String note) {
		// 确定要更新的对象
		Criteria criteriaId = Criteria.where("id").is(id);
		Query query = Query.query(criteriaId);
		// 定义更新对象,后续可变化的字符串代表排除在外的属性
		Update update = Update.update("user_name", userName);
		update.set("note", note);
		// 更新单个对象
		UpdateResult result = mongoTmpl.updateFirst(query, update, User.class);
		// 更新多个对象
		// UpdateResult result2 = mongoTmpl.updateMulti(query, update, User.class);
        //matchedCount modifiedCount upsertedId如果存在因为更新而插入文档的情况,会插入文档的信息
		return result;
	}

}
  • Criteria 构建准则

测试

http://localhost:8080/user/save
{
	"userName":"张三2",
	"note":"我的日记2",
	"id":101
}

http://localhost:8080/user/save
http://localhost:8080/user/find?userName=&note=&skip=0&limit=10 
跳过0个,最多返回10[
    {
        "id": 100,
        "userName": "张三",
        "note": "我的日记",
        "roles": null
    },
    {
        "id": 101,
        "userName": "张三2",
        "note": "我的日记2",
        "roles": null
    }
]

http://localhost:8080/user/update?id=100&note=李四的日记&userName=李四
{
    "matchedCount": 1,
    "modifiedCount": 1,
    "upsertedId": null
}
id不存在的时候:
{
    "matchedCount": 0,
    "modifiedCount": 0,
    "upsertedId": null
}


http://localhost:8080/user/delete?id=100
{
    "deletedCount": 0
}

jpa

  • MongoRepository

dao

@Repository
// 扩展MongoRepository接口
public interface UserRepository extends MongoRepository<User, Long> {	
	/**
	 * 符合JPA规范命名方法,则不需要再实现该方法也可用,
	 * 意在对满足条件的文档按照用户名称进行模糊查询
	 * @param userName -- 用户名称
	 * @return 满足条件的用户信息
	 */
	List<User> findByUserNameLike(String userName);
	
	
	/**
	 * 根据编号或者用户名查找用户
	 * @param id -- 编号
	 * @param userName -- 用户名
	 * @return 用户信息
	 */
	User findUserByIdOrUserName(Long id, String userName);
}

指定扫描包

@SpringBootApplication(scanBasePackages = "com.springboot.chapter8")
//指定扫描的包,用于扫描继承了MongoRepository的接口
@EnableMongoRepositories(basePackages="com.springboot.chapter8.repository", repositoryImplementationPostfix ="Stuff")
public class Chapter8Application {

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

action

	// 注入接口
    @Autowired
    private UserRepository userRepository = null;
    
    // 执行查询
    @RequestMapping("/byName")
    @ResponseBody
    public List<User> findByUserName(String userName) {
        return userRepository.findByUserNameLike(userName);
    }
    
    // 执行查询
    @RequestMapping("/findOr")
    @ResponseBody
    public User findUserByIdOrUserName(Long id, String userName) {
    	return userRepository.findUserByIdOrUserName(id, userName);
    }
1.了解Spring 2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。Spring Data MongoDB 1.7中有什么新功能 6.依赖 6.1。Spring Boot的依赖管理 6.2。Spring框架 7.使用Spring Data Repositories 7.1。核心概念 7.2。查询方法 7.3。定义存储库接口 7.3.1。微调储存库定义 7.3.2。空处理存储库方法 7.3.3。将存储库与多个Spring Data模块一起使用 7.4。定义查询方法 7.4.1。查询查询策略 7.4.2。查询创建 7.4.3。属性表达式 7.4.4。特殊参数处理 7.4.5。限制查询结果 7.4.6。流式查询结果 7.4.7。异步查询结果 7.5。创建存储库实例 7.5.1。XML配置 7.5.2。JavaConfig 7.5.3。独立使用 7.6。Spring Data存储库的自定义实现 7.6.1。定制个人存储库 7.6.2。自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例存储库 9.3。用Spring连接到MongoDB 9.3.1。使用基于Java的元数据注册Mongo实例 9.3.2。使用基于XML的元数据注册Mongo实例 9.3.3。MongoDbFactory接口 9.3.4。使用基于Java的元数据注册MongoDbFactory实例 9.3.5。使用基于XML的元数据注册MongoDbFactory实例 9.4。MongoTemplate简介 9.4.1。实例化MongoTemplate 9.4.2。WriteResultChecking策略 9.4.3。WriteConcern 9.4.4。WriteConcernResolver 9.5。保存,更新和删除文档 9.5.1。如何_id在映射图层中处理该字段 9.5.2。类型映射 9.5.3。保存和插入文件的方法 9.5.4。更新集合中的文档 9.5.5。在集合中插入文档 9.5.6。在集合中查找和插入文档 9.5.7。删除文件的方法 9.5.8。乐观锁定 9.6。查询文件 9.6.1。查询集合中的文档 9.6.2。查询文件的方法 9.6.3。查询不同的值 9.6.4。地理空间查询 9.6.5。GeoJSON支持 9.6.6。全文查询 9.6.7。排序规则 9.6.8。JSON模式 9.6.9。流利的模板API 9.7。按实例查询 9.7.1。介绍 9.7.2。用法 9.7.3。示例匹配器 9.7.4。执行一个例子 9.7.5。无类型示例 9.8。减少地图操作 9.8.1。使用示例 9.9。脚本操作 9.9.1。使用示例 9.10。集团运营 9.10.1。使用示例 9.11。聚合框架支持 9.11.1。基本概念 9.11.2。支持的聚合操作 9.11.3。投影表达式 9.11.4。分面分类 9.12。用自定义转换器覆盖默认映射 9.12.1。使用已注册的Spring Converter进行保存 9.12.2。使用Spring转换器读取 9.12.3。使用MongoConverter注册Spring转换器 9.12.4。转换器消除歧义 9.13。索引和集合管理 9.13.1。创建索引的方法 9.13.2。访问索引信息 9.13.3。使用集合的方法 9.14。执行命令 9.14.1。执行命令的方法 9.15。生命周期事件 9.16。例外翻译 9.17。执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于Java的元数据注册MongoClient实例 10.2.2。ReactiveMongoDatabaseFactory接口 10.2.3。使用基于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值