Skip to content

Commit

Permalink
feat: add shardingsphere example
Browse files Browse the repository at this point in the history
  • Loading branch information
Jack.zhang authored and zhangzhenhuajack committed Jun 20, 2021
1 parent d78f9d3 commit b41a9b5
Show file tree
Hide file tree
Showing 24 changed files with 573 additions and 39 deletions.
2 changes: 1 addition & 1 deletion 2.3/jpa-demo/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ dependencies {
implementation 'org.apache.commons:commons-lang3:3.8.1'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly('mysql:mysql-connector-java')
implementation('mysql:mysql-connector-java')
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.jpa.demo.config;

import org.hibernate.EmptyInterceptor;
import org.springframework.stereotype.Component;

@Component
public class SlicedTableInterceptor extends EmptyInterceptor {
@Override
public String onPrepareStatement(String sql) {
System.out.println("================="+sql);
return super.onPrepareStatement(sql);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.example.jpa.demo.config;

import com.mysql.cj.MysqlConnection;
import com.mysql.cj.Query;
import com.mysql.cj.interceptors.QueryInterceptor;
import com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor;
import com.mysql.cj.log.Log;
import com.mysql.cj.protocol.Resultset;
import com.mysql.cj.protocol.ServerSession;

import java.util.Properties;
import java.util.function.Supplier;

public class SlicedTableQueryInterceptor implements QueryInterceptor {
@Override
public QueryInterceptor init(MysqlConnection conn, Properties props, Log log) {
System.out.println(conn);
System.out.println(props);
return this;
}

@Override
public <T extends Resultset> T preProcess(Supplier<String> sql, Query interceptedQuery) {
return null;
}

@Override
public boolean executeTopLevelOnly() {
return false;
}

@Override
public void destroy() {

}

@Override
public <T extends Resultset> T postProcess(Supplier<String> sql, Query interceptedQuery, T originalResultSet, ServerSession serverSession) {
return null;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.jpa.demo.config;

import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.springframework.stereotype.Component;

@Component
public class SlicedTableStatementInspector implements StatementInspector {
/**
* Inspect the given SQL, possibly returning a different SQL to be used instead. Note that returning {@code null}
* is interpreted as returning the same SQL as was passed.
*
* @param sql The SQL to inspect
* @return The SQL to use; may be {@code null}
*/
@Override
public String inspect(String sql) {
System.out.println("sql::::::::"+sql);
return sql;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public interface AddressRepository extends JpaRepository<Address, Long>{
//通过@Query注解自定的JPQL或是Navicat SQL
// @Query(value = "FROM Address where deleted=false ")
Page<Address> findAll(Pageable pageable);
//自定义query method defined
Page<Address> findByAddress(@Param("address") String address, Pageable pageable);
// Page<Address> findAll(Pageable pageable);
// @Query(value = "From Address where address= :address")
// Page<Address> findByAddress(@Param("address") String address, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class TimeTest {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String name;
private Instant dateType;
private Instant dateTimeType;
private Instant timeStampType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.example.jpa.demo.db;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface TimeTestRepository extends CrudRepository<TimeTest,Long> {
@Query(value = "select * from time_test where name = :#{#name}",nativeQuery = true)
List<TimeTest> findByNameAbc(@Param(value = "name") String name);
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
package com.example.jpa.demo.web;

import com.example.jpa.demo.db.Address;
import com.example.jpa.demo.db.AddressRepository;
import com.example.jpa.demo.db.UserInfo;
import com.example.jpa.demo.db.UserInfoRepository;
import com.example.jpa.demo.service.UserInfoService;
import com.example.jpa.demo.service.dto.UserInfoDto;
import com.google.common.collect.Lists;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

import javax.transaction.Transactional;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;


@RestController()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,21 @@
import org.junit.jupiter.api.TestInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;

import javax.transaction.Transactional;
import java.util.List;
import java.util.stream.Collectors;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@DataJpaTest
@ActiveProfiles("test")
public class AddressRepositoryTest {
@Autowired
private AddressRepository addressRepository;
Expand All @@ -33,9 +40,22 @@ public void init() {
//测试没有包含删除的记录
@Test
public void testFindAllNoDeleted() {
List<Address> address1 = addressRepository.findAll();
int deleteSize = address1.stream().filter(d->d.equals("shanghaiDeleted")).collect(Collectors.toList()).size();
Assertions.assertTrue(deleteSize==0); //测试一下不包含删除的条数
//ExpressionParser是操作SpEL的总入口,创建一个接口ExpressionParser对应的实例SpelExpressionParser
ExpressionParser parser = new SpelExpressionParser();
//通过上面我们讲的parser.parseExpression方法获得一个Expression的实例,里面实现的就是new一个SpelExpression对象;而parseExpression的参数就是SpEL的使用重点,各种表达式的字符串
//1.简单的string类型用'' 引用
// Expression exp = parser.parseExpression("'Hello World'");
//2.SpEL支持很多功能特性,如调用方法、访问属性、调用构造函数,我们可以直接调用String对象里面的concat方法进行字符串拼接
Expression exp = parser.parseExpression("'Hello World'.concat('!')");

//通过getValue方法可以得到经过Expresion计算parseExpression方法的字符串参数(符合SpEL语法的表达式)的结果
String message = (String) exp.getValue();
System.out.println(message);

// addressRepository.findByAddress("shanghai", PageRequest.of(1,5));
// List<Address> address1 = addressRepository.findAll();
// int deleteSize = address1.stream().filter(d->d.equals("shanghaiDeleted")).collect(Collectors.toList()).size();
// Assertions.assertTrue(deleteSize==0); //测试一下不包含删除的条数
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;

import java.beans.Transient;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.Clock;
Expand All @@ -28,12 +29,16 @@ public class TimeTestRepositoryTest {

@Test
@Rollback(value = false)
@Transient
public void testSaveTime() {
timeTestRepository.findByNameAbc("abc");
timeTestRepository.findByNameAbc("def");
timeTestRepository.findByNameAbc("123");
// timeTestRepository.save(TimeTest.builder().dateType(Instant.now()).dateTimeType(Instant.now()).timeStampType(Instant.now()).timeType(Instant.now()).build());
Iterable<TimeTest> r = timeTestRepository.findAll();
r.forEach(timeTest -> {
System.out.println(timeTest);
});
// Iterable<TimeTest> r = timeTestRepository.findAll();
// r.forEach(timeTest -> {
// System.out.println(timeTest);
// });
}

public static void main(String[] args) {
Expand All @@ -45,19 +50,20 @@ public static void main(String[] args) {
Instant now = Clock.system(TimeZone.getTimeZone("Asia/Shanghai").toZoneId()).instant();
System.out.println(now);
now.atZone(TimeZone.getTimeZone("Asia/Shanghai").toZoneId());
Timestamp stamp = new Timestamp(now.getEpochSecond() * MILLIS_PER_SECOND);
// stamp.nanos = instant.getNano();
System.out.println(stamp);


Instant now2 = Clock.system(TimeZone.getTimeZone("UTC").toZoneId()).instant();
System.out.println(now2);
now2.atZone(TimeZone.getTimeZone("UTC").toZoneId());
Timestamp stamp2 = new Timestamp(now2.getEpochSecond() * MILLIS_PER_SECOND);
// stamp.nanos = instant.getNano();
System.out.println(stamp2);

System.currentTimeMillis();
System.out.println(now.getEpochSecond());
// Timestamp stamp = new Timestamp(now.getEpochSecond() * MILLIS_PER_SECOND);
//// stamp.nanos = instant.getNano();
// System.out.println(stamp);
//
//
// Instant now2 = Clock.system(TimeZone.getTimeZone("UTC").toZoneId()).instant();
// System.out.println(now2);
// now2.atZone(TimeZone.getTimeZone("UTC").toZoneId());
// Timestamp stamp2 = new Timestamp(now2.getEpochSecond() * MILLIS_PER_SECOND);
//// stamp.nanos = instant.getNano();
// System.out.println(stamp2);
//
// System.currentTimeMillis();

}
}
10 changes: 7 additions & 3 deletions 2.3/jpa-demo/src/test/resources/application-test.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
###########

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.url=jdbc:mysql://localhost:3306/test?queryInterceptors=com.example.jpa.demo.config.SlicedTableQueryInterceptor&logger=Slf4JLogger&profileSQL=true&useUsageAdvisor=true&logSlowQueries=true&explainSlowQueries=true
#?logger=Slf4JLogger&profileSQL=true&queryInterceptors=com.example.jpa.demo.config.SlicedTableQueryInterceptor
#logger=Slf4JLogger&profileSQL=true&profileSQL=true&gatherPerfMetrics=true&useUsageAdvisor=true&logSlowQueries=true&explainSlowQueries=true&
spring.datasource.username=root
spring.datasource.password=root
Expand All @@ -9,9 +10,12 @@ spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=none
spring.datasource.hikari.pool-name=jack-test-db-pool

#spring.jpa.properties.hibernate.generate_statistics=true

spring.jpa.properties.hibernate.session_factory.interceptor=com.example.jpa.demo.config.SlicedTableInterceptor
spring.jpa.properties.hibernate.session_factory.statement_inspector=com.example.jpa.demo.config.SlicedTableStatementInspector
spring.jpa.properties.hibernate.use_sql_comments=true
# hibernate所有的操作都是PreparedStatement,把sql的执行参数显示出来
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate=TRACE
logging.level.org.springframework.data=TRACE
spring.jpa.show-sql=true

37 changes: 37 additions & 0 deletions 2.3/shardingsphere-jpa/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/
37 changes: 37 additions & 0 deletions 2.3/shardingsphere-jpa/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}

group = 'com.example.jpa.sharding'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.apache.shardingsphere:shardingsphere-jdbc-core:4.1.1'
implementation 'org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.1.1'
implementation 'org.apache.shardingsphere:sharding-jdbc-spring-namespace:4.1.1'
implementation 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
useJUnitPlatform()
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#Mon Feb 08 11:23:32 CST 2021
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
Loading

0 comments on commit b41a9b5

Please sign in to comment.