1. 介绍
掠过
2. 用法
为了访问entity,需要完善的repository支持,只需创建一个接口即可。
假设一个模型:
public class Person {
@Id
private String id;
private String firstname;
private String lastname;
private Address address;
// 其它getter,setter
}
基本接口如下:
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
// 额外的定制方法
}
MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
在Documents和领域模型之间的映射是由MongoConverter的实现类完成的。spring提供了这样的实现类:
MappingMongoConverter,但是也可以定义自己的。
MongoTemplate类实现了接口MongoOperations,
1. 初始化MontoTemplate
@Configuration
public class AppConfig {
public @Bean MongoClient mongoClient() {
return new MongoClient("localhost");
}
public @Bean MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoClient(), "mydatabase");
}
}
WriteResultChecking策略
当往数据库写入发生错误时,设置策略属性返回异常,否则即使写错了,也不返回异常。
2. Saving,Updating,Removing Documents
MongoOperations mongoOps = new MongoTemplate(new SimpleMongoDbFactory(new MongoClient(), "database"));
附录:
创建一个最简单的spring boot, rest ful api, mongotemplate的项目。
$set操作符有一下特性:
1. 如果field已经存在,则更新,
2. 如果field不存在,则添加
多个fields的查询组合,比如
mongofull项目里面参考http://www.baeldung.com/spring-data-mongodb-tutorial的例子,有github。
spring data mongodb文档:
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/
spring data jpa文档:
https://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/
spring data common文档:
https://docs.spring.io/spring-data/commons/docs/current/reference/html/
spring data repository:
1. 查询生成 Query Creation
自动化的查找策略分为三种,CREATE, USE_DECLARED_QUERY, CREATE_IF_NOT_FOUND(by default)
首先去掉前缀find...By, read...By, query...By, count...By, get...By,省略号的地方可以引入Distinct关键字,第一个By标志开始,可以设置条件如And和Or。
2. 属性表达式 Property expressions
可以支持嵌套的属性,比如一个Person有个个Address,Address有个ZipCode
List<Person> findByAddressZipCode(ZipCode zipCode);
上述会创建一个查询x.address.zipcode,下面是一个更加没有歧义的做法,使用下划线_
List<Person> findByAddress_ZipCode(ZipCode zipCode);
3. 特殊参数处理,spring data repository infrustructure认识一些特殊类型,比如Pageable和Sort。
4. 限制查询结果的数量,比如first或者top,这两个词是可以互换的,top或者first后面可以跟数字限制个数,默认是1
User findFirstByOrderByLastnameAsc();
可以和Sort关键字合用表示最小或者最大的几个。
5. Stream,利用java8的语言特性
6. 异步查询结果 Async query results
用@Async修饰方法
7. 自定义实现repository, 如果查询方法不能满足需要,可以定制查询方法
首先定义一个片段接口(fragment interface)
interface CustomizedUserRepository {
void someCustomMethod(User user);
}
再定义一个类实现该接口,关键是该类的Impl后缀:
class CustomizedUserRepositoryImpl implements CustomizedUserRepository {
public void someCustomMethod(User user) {
// Your custom implementation
}
}
8. Querydsl扩展, 构建静态类型的SQL查询
通过QueryDslPredicateExecutor谓词执行器,提供集成
要求repository接口extends QueryDslPredicateExecutor
主要任务落在如何定义谓词上,如:
Predicate predicate = user.firstname.equalsIgnoreCase("dave")
.and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
sql:
1. left join, 返回左表的所有记录,以及右表中匹配的记录,如果右边没有匹配的返回NULL。注意,返回左表的所有记录。
inner join就是join
jpa的@Query annotation里面支持JPQL和原生sql。
2. JPQL的JOIN FETCH的例子:
对于OneToMany关系来说,如果一个城市对应多个学校,如果想用一个查询就获取某个城市下面的所有学校,考虑用
JOIN FETCH:
SELECT c FROM City c JOIN FETCH c.school
JOIN FETCH的唯一目标就是一个查询就把数据库中相关对象都取出来,即,不需要多个查询来获取每个学校的信息。
注意,如果只需要获取他们各自的名称,下面查询会更有效率:
SELECT c.name, c.school.name FROM City c
mongodb遇到错误
mongodb, not authorized on test to execute command { createIndexes: .....}
经检查,是没有连接上数据库,jhipster developer不支持直接连接外部数据库,需要更改application-dev.yml文件:
注释掉原来的uri和database,换成下面:
host: localhost
port: 27017
database: test
username: james
password: Ha.....
mysql从5.7.8开始也有原生的json column支持了,内部作为特殊的二进制格式存储,这种格式是有结构的,在查询时不必读取整个的json字符串进行解析。
从facts表的sentence列(json类型)中查询key是mascot的value:
select sentence->"$.mascot" from facts;
查询到的结果包含最外层的双引号以及escape的反斜杠,如果不想包含,用内联路径操作符(相对于列路径操作符)inline path operator ->>
select sentence->>"$.mascot" from facts;
1. 插入一个有效的json字符串:
insert into facts values('{"name": "james","age":25}');
2. 用JSON path,JSON路径在一个json文档中选择一个值value:
select JSON_EXTRACT(sentence, '$.name') from facts;
3. 用JSON_SET更新对象的值value:
select JSON_SET(sentence, '$.name', 'xiaoming') from facts;
4. 用JSON_SET更新一个对象的多个域(已有的key更新,没有的key添加):
select JSON_SET(sentence, '$.name', 'xiaoming', '$.age', 20) from facts;
5. 替换整个column:
select JSON_SET(sentence, '$', '{"name": "james"}) from facts;
==================================================
通过config文件启动mongodb
mongod.exe --config d:\mongodb\conf\mongod.cfg
mongo shell连接到远程机器:
mongo 38.105.xx.xx:27017/shortvideo -u root -p Haxxxxxx --authenticationDatabase "admin"
又是会碰到lock文件在,需要清除:
sudo docker run -it -v data:/data/db/ image --repair