mongoRepository,MongoTemplate

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

novodexx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值