Spring Bootプロジェクトのデータベースクエリー
16153 ワード
@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;