Spring Bootプロジェクトのデータベースクエリー

16153 ワード

  • 概要Spring Bootプロジェクトは「構成よりも習慣が優れている」と尊崇しています.「という考えで、過去のspringフレームワークプロジェクトの各種プロファイルをデフォルトに設定しました.このプロジェクトは何年も出てきて、ほとんどのチームが使っていると信じています.正直に言うと、このプロジェクトはspringプロジェクトの太ももを抱擁するjava開発者にとって本当に便利です.私たちはspring bootプロジェクトである技術を使う必要があります.つまりspringと統合する必要があります.だから準確かにこの文章はSpringのデータベースクエリーについて話すべきです.
  • クエリー方式ここ数年、確かに様々な奇抜なデータベースクエリー方式が使われていますが、一番腐っているのはコードに文字列式のSQL文を直接つなぐことだと思います.その中にはMyBatis、Spring Jpa、Querydslというよく使われる方法があります...
  • ライブラリ間クエリーは、同じプロジェクトのライブラリ間クエリーでは存在しないはずです.存在する場合は、テーブル設計に問題があるに違いありません.データベースはアプリケーション別に分かれており、異なるアプリケーション間で呼び出すにはRPCを使用する必要があります.ライブラリ間クエリーを実現するには、実際には複数のデータソース列の構成クラスUicDatasourceConfig.javaを構成します.たとえば、私のところにもう一つのユーザーセンター(uic)があります.ライブラリ:
  • @Configuration
    @PropertySource("classpath:database.properties")
    @EnableJpaRepositories(
            basePackages = "com.medxi.uic.repository.uic",
            entityManagerFactoryRef = "uicEntityManager",
            transactionManagerRef = "uicTransactionManager"
    )
    public class UicDatasourceConfig {
    
        /**
         * @return    
         */
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource.uic")
        public DataSource uicDataSource(){
            return DataSourceBuilder.create().build();
        }
    
        /**
         * @return entityManager
         */
        @Bean
        @Primary
        public LocalContainerEntityManagerFactoryBean uicEntityManager(){
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            vendorAdapter.setGenerateDdl(true);
            LocalContainerEntityManagerFactoryBean uicEntityManager = new LocalContainerEntityManagerFactoryBean();
            uicEntityManager.setDataSource(uicDataSource());
            uicEntityManager.setPackagesToScan("com.medxi.uic.entity.uic");
            uicEntityManager.setJpaVendorAdapter(vendorAdapter);
            return uicEntityManager;
        }
    
        /**
         * @return TransactionManager
         */
        @Bean
        @Primary
        public PlatformTransactionManager uicTransactionManager(){
            return new JpaTransactionManager(uicEntityManager().getObject());
        }
       /**
       * @return uicEntityManager
       */
        @Bean
        public EntityManager uicEntityManager(){
             return uicEntityManagerFactory().getObject().createEntityManager();
        }
    
    }
    

    データベース・ソースのエンティティ・クラスとrepository(dao)レイヤは独立したpakageで、構成時に指定する必要があります.ここでは、repositoryパッケージ:com.medxi.uic.repository.uic entityパッケージ:com.medxi.uic.entity.uicと同様に別のデータソースを構成します.2つのデータソースに関連するbeanは同じタイプであるため、1つの注釈@Primaryが必要です.異なるライブラリのデータベース情報構成はResources目に構成できます.録画したリソースファイルdatabase.propertiesで、自分の具体的な構成に基づいて接頭辞を選択します.ここでuic:
    datasource.uic.url=jdbc:mysql://127.0.0.1/um_uic
    datasource.uic.username=medxi
    .
    .
    .

    自分でデータソースを作成したのでspringで自動的に構成しなくてもいいので、起動クラスから除外する必要があります
    @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

    注意データ・ソース・インジェクションを使用する場合は、次のように指定する必要があります.
    @Autowired() @Qualifier("uicEntityManager")  
      
    @Resource(name="uicEntityManager")  

    次に、自分のニーズに合わせて4.Spring jpaというspringを自分の家で使うことができます.最も便利で、構成はほとんど必要ありません.spring bootプロジェクトを使う学生はすべて知っているはずです.基本的なBaseRepositoryを定義することにほかならありません.
    @NoRepositoryBean
    public interface BaseRepository<T> extends JpaRepository<T, String>,JpaSpecificationExecutor<T> {
    
    }

    継承するものは必要に応じて調整することができます5.MyBatisは自分でsqlをたくさん書くのはコードの中で確かに嫌いですが、ライブラリをまたぐ必要がある(同じデータソース)場合や、ページの大半がクエリーの場合はどうしますか?だからMyBatisはまだ必要です.ここではMyBatisの構成を紹介します.まず依存を導入します.
       <dependency>
                <groupId>org.mybatis.spring.bootgroupId>
                <artifactId>mybatis-spring-boot-starterartifactId>
                <version>1.2.0version>
            dependency>

    注釈の方式とmapper.xmlの方式があり、上述した使用ニーズから言えば、インタフェースにクエリー文字列(spring jpaのrepositoryに@Queryを注釈するような)を大量に注釈する.ああ、見苦しいので言わないでください.mapper.xmlを使うのは普通のspringプロジェクトと比べると、依存するクラスでいろいろなことをしてくれたので、簡単になりました.Resourcesディレクトリの下で自分のmybatis-configファイル、例えばmybatis-config.xmlを構成します.
    
    
    <configuration>
        <mappers>
            <mapper resource="mapper/IUICQueryMapper.xml"/>
        mappers>
    configuration>

    システムプロファイルで指定mybatis-configファイルを構成する
    mybatis.config-location=classpath:mybatis-config.xml
    logging.level.com.medxi.uic.dao=debug #      sql

    IUIQuickQueryMapper.xmlというファイルはあまり言われませんが、springで使用するのと同じcom.medxi.uic.daoパッケージの下にIUIckQueryMapper.javaを作成し、クラスコメント@Mapper、残りは以前と同じように構成されていますがかなり少なくなっています.6.Querydsl Querydslの使用、spring bootの公式ガイドブックで取り上げられています.前に見てspring jpaと思って検索しましたが、これは考えていませんでした.最近多くの複雑なクエリーに遭遇したとき、javaコードで優雅に表現したいと思っていたとき、やっと彼女のことを発見しました.第一歩は、依存を追加し、spring bootはすでに依存バージョンを管理しているので、バージョンを列挙する必要はありません.
    <dependency>
         <groupId>com.querydslgroupId>
         <artifactId>querydsl-aptartifactId>
     dependency>
     <dependency>
         <groupId>com.querydslgroupId>
         <artifactId>querydsl-jpaartifactId>
     dependency>

    第2歩、MavenはAPTプラグインに参加します
     <plugin>
                    <groupId>com.mysema.mavengroupId>
                    <artifactId>apt-maven-pluginartifactId>
                    <version>1.1.3version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>processgoal>
                            goals>
                            <configuration>
                                <outputDirectory>target/generated-sourcesoutputDirectory>
                                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessorprocessor>
                            configuration>
                        execution>
                    executions>
                plugin>

    注意entityを追加または変更するたびにmavenのコンパイルを実行する必要があります.オブジェクトのエンティティークラスディレクトリの下にクエリー・オブジェクトが作成されます.名前はエンティティークラス名の前の複数のQです.これにより使用できます.3つ目のステップでは、BaseQuerydslRepository.javaを作成して、単一のエンティティー・クエリーで使用できます.
    @NoRepositoryBean
    public interface BaseQuerydslRepository<T, Q extends EntityPath>> extends CrudRepository<T, String>, QueryDslPredicateExecutor<T>, QuerydslBinderCustomizer<Q> {
        default void customize(QuerydslBindings bindings, Q root) {
            bindings.bind(String.class).first(StringExpression::containsIgnoreCase);
        }
    }

    簡単なクエリでメソッドを呼び出すことができます.
    Iterable<T> findAll(Predicate var1);

    Predicateは、エンティティークラスに対応するクエリー・オブジェクトによって生成されます.たとえば、ユーザー名に基づいて次のように、UserRepositoryで継承できます.
    QUser user = QUser.user;
    userRepository.findAll(user.userName.eq("  "));

    複雑なマルチテーブルクエリの場合は、JPAQueryオブジェクトを使用して実際の例を示します.
    public List countCitysPiggery(String provinceName,Long dealerId) {
            JPAQuery> query = new JPAQuery(entityManager);
            QUnitsprofile unitsprofile = QUnitsprofile.unitsprofile;
            QCity city = QCity.city;
            QProvince province = QProvince.province;
            List tupleList = query.from(unitsprofile)
                    .select(unitsprofile.cityId.count(),
                            city.cityName,
                            unitsprofile.latitude,
                            unitsprofile.longitude)
                    .leftJoin(unitsprofile.stateId,province)
                    .leftJoin(unitsprofile.cityId,city)
                    .where(unitsprofile.unitType.id.eq(Constant.UNIT_TYPE_PIGGERY),
                            province.provinceName.eq(provinceName),
                            unitsprofile.id.notIn(getConcernUnitIds(dealerId))
                    ).groupBy(unitsprofile.cityId).fetch();
           return tupleList.stream().map(FindPiggeryAmountPm::analyticCitysPiggery).collect(Collectors.toList());
        }
    

    SQLのようにjavaコードを書くと、見た目はずっと楽になります.注意:クエリーのたびに独立したクエリー・オブジェクトJPAQueryであるべきなので、Spring Beanに構成しないでください.entityManagerは直接注入すればいいです.
    @PersistenceContext
    private EntityManager entityManager;