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类型 | 描述 |
---|---|
MongoClient | mongodb客户端 |
MongoProperties | 自动配置属性 |
MongoDataAutoConfiguration | 自动配置类 |
SimpleMongoDbFactory | 简单工厂,生成会话。spring.data.mongodb.grid-fs-database=配置为GridFsMongoDbFactory |
MongoTemplate | 模板 |
MappingMongoConverter | 类型转换器 |
MongoMappingContext | Java实体的映射内容配置 |
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=张¬e=我&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¬e=李四的日记&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);
}