SpringBootでMongoDB

SpringBootでMongoDB使えるように設定しちゃいます

スキーマレスで超簡単にDBクライアントが作れます。
@ResponseBodyアノテーションと組み合わせると
ものの数時間でDB操作系のIFが作成できます。

**設定**
[サンプルソース](https://github.com/MariMurotani/SpringDemo/blob/4_develop/src/main/java/demo/mongo/config/SpringMongoConfig.java
)
1.AbstractMongoConfigurationのクラスを継承したクラスを用意します。
2.@Configurationアノテーションをつけておきます。
これをやっておくと起動時に勝手によみこんで接続する準備をしてくれます。
3.今回は、@Valueアノテーションを使ってpropertyファイルから設定を取得してます。
`@Value("${spring.profiles.active}")`

**操作**
[操作クラス](https://github.com/MariMurotani/SpringDemo/blob/4_develop/src/main/java/demo/mongo/service/UserService.java)
Mongorepositoryとかあるんですが、使いやすいのでMongoOperationを使います
[DAO](https://github.com/MariMurotani/SpringDemo/blob/4_develop/src/main/java/demo/mongo/model/User.java)
1.保存はDAOのクラスを生成してMondoOperationに渡してsaveするだけ
```User user = new User(username,passwd);
this.mongoOperation.save(user);
```

2.検索はクエリ作って投げるだけ
`Query searchUserQuery = new Query().skip(pos).limit(limit);`
`System.out.println(searchUserQuery.toString());`
`List<User> users = mongoOperation.find(searchUserQuery,User.class);
		return users;`

3.@Serviceアノテーション
ビジネスロジックとして利用するクラスなのでコントローラーから呼び出しします。
@Serviceを付けないと@Controllerをつけたクラスからの呼び出しができないのでそこは要注意！


1.SpringMongoConfig

```java:SpringMongoConfig.java

@Configuration
@EnableMongoRepositories("demo.mongo.model")
public class SpringMongoConfig extends AbstractMongoConfiguration {
	@Value("${spring.profiles.active}")
	private String profileActive;

	@Value("${spring.application.name}")
	private String proAppName;

	@Value("${spring.data.mongodb.host}")
	private String mongoHost;
	
	@Value("${spring.data.mongodb.port}")
	private String mongoPort;
	
	@Value("${spring.data.mongodb.database}")
	private String mongoDB;
	
	@Override
	public MongoMappingContext mongoMappingContext()
			throws ClassNotFoundException {
		// TODO Auto-generated method stub
		return super.mongoMappingContext();
	}

	@Override
	@Bean
	public Mongo mongo() throws Exception {
		System.out.println("start " + profileActive + "environment, " + proAppName + "started");
		System.out.println("mongo host: "+ mongoHost);
		System.out.println("mongo db: "+ mongoDB);
		return new MongoClient(mongoHost + ":" + mongoPort);
	}

	@Override
	protected String getDatabaseName() {
		// TODO Auto-generated method stub
		return mongoDB;
	}
}
```
	
2.User DAO

```java:User.java
@Getter
@Setter
@Document(collection = "users")
public class User {

	@Id
	private String id;

	String username;

	String password;

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	
    @Override
    public String toString() {
        return String.format(
                "User[id=%s, username='%s', password='%s']",
                id, username, password);
    }
    }
```

3.Service DAO

```java:UserService.java

@Service
public class UserService extends ServiceBase{


	public UserService() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public String AddNewUser(String username,String passwd) throws Exception {
		Query searchUserQuery = new Query(Criteria.where("username").is(username));
		Long lres = this.mongoOperation.count(searchUserQuery,User.class);
		if(lres > 0){
			throw new Exception("This user already exists");
		}

		User user = new User(username,passwd);
		this.mongoOperation.save(user);
		return user.getId();
	}
	
	public boolean IsExists(String username,String passwd){
		Query searchUserQuery = this.GetSaerchQuery(username, passwd);
		Long lres = this.mongoOperation.count(searchUserQuery,User.class);
		if(lres > 0){
			return true;
		}
    	return false;
    }
    
    public User GetUserInfo(String username,String passwd){
		Query searchUserQuery = this.GetSaerchQuery(username, passwd);
		User savedUser = mongoOperation.findOne(searchUserQuery, User.class);
		return savedUser;
    }
    
    private Query GetSaerchQuery(String username,String passwd){
		Query searchUserQuery = new Query(Criteria.where("username").is(username).andOperator(Criteria.where("password").is(passwd)));
		System.out.println(searchUserQuery.toString());;
		return searchUserQuery;
    	
    }
    
    public List<User> FindAll(int pos,int limit){
		Query searchUserQuery = new Query().skip(pos).limit(limit);
		System.out.println(searchUserQuery.toString());
		
    	List<User> users = mongoOperation.find(searchUserQuery,User.class);
		return users;
    	
    }
}