読者です 読者をやめる 読者になる 読者になる

@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

今更Spring Data - MongoDBを使ってみたよ

database mongodb

先日はMongoDBのドライバを使ってJavaからアクセスしてみました。
正直使いにくい!と思ってましたが、QConTokyo2012でAWSとMongoDBの話を聞いて、その中でSpring Data - MongoDBの事を聞いたので、試してみました。
Spring Data MongoDBMavenの設定が書いてあるので、そのとおりにしてみます。あと、cglibも入れておきます。

  <repositories>
    <repository>
      <id>spring-release</id>
      <name>Spring Maven Release Repository</name>
      <url>http://repo.springsource.org/libs-release</url>
    </repository>
  </repositories>
  <dependencies>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.2.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>1.0.1.RELEASE</version>
    </dependency>
  </dependencies>

プロジェクトが出来たら、設定を書いて行きましょう。
AppConfig.java

@Configuration
public class AppConfig {
    @Bean
    public MongoOperations mongoTemplate(Mongo mongo) {
        MongoTemplate mongoTemplate = new MongoTemplate(mongo, "test");
        return mongoTemplate;
    }
    @Bean
    public  MongoFactoryBean mongo() {
        MongoFactoryBean mongo = new MongoFactoryBean();
        mongo.setHost("localhost");
        mongo.setPort(27017);
        return mongo;
    }
    @Bean
    public  PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
        return new PersistenceExceptionTranslationPostProcessor();
    }
}

アプリケーションでは、Documentクラスが必要です。@DocumentアノテーションがついたPOJOを用意しましょう。
Things.java

@Document
public class Things {
    @Id
    private String id;
    private String name;
    private Integer age;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return new StringBuilder()
                .append("{name=").append(name)
                .append(",age=").append(age)
                .append("}").toString();
    }
}

次に、Thingsにアクセスするためのクラスです。すでにコレクションはある前提です。アプリで無かったら作ることも可能です。
ThingsRepository.java

@Repository
public class ThingsRepository {
    @Autowired
    MongoOperations mongoOperations;
    public void save(Things things) {
        mongoOperations.insert(things);
    }
    public List<Things> findAll() {
        return mongoOperations.findAll(Things.class);
    }
    public void update(Things things) {
        Query query = new Query().addCriteria(new Criteria("name").is(things.getName()));
        Update update = new Update().set("age", things.getAge());
        mongoOperations.updateFirst(query, update, Things.class);
    }
    public void remove(Things things) {
        mongoOperations.remove(things);
    }
}

では、検索して、挿入して、更新して、削除するロジックを書いていきます。
Main.java

public class Main {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/bootstrap.xml");
        ThingsRepository rep = context.getBean(ThingsRepository.class);

        System.out.println(rep.findAll());
        Things things1 = new Things();
        things1.setName("thorikiri");
        things1.setAge(32);
        rep.save(things1);
        Things things2 = new Things();
        things2.setName("thorikiri2");
        things2.setAge(30);
        rep.save(things2);
        System.out.println(rep.findAll());

        things1.setAge(33);
        rep.update(things1);
        System.out.println(rep.findAll());

        rep.remove(things2);
        System.out.println(rep.findAll());
        rep.remove(things1);
        System.out.println(rep.findAll());
    }
}

ね、簡単でしょう?