Skip to content

Commit aea1415

Browse files
committed
1.spring boot 整合jpa和sharding-jdbc分库分表
1 parent b9b6b2f commit aea1415

28 files changed

+1261
-0
lines changed

spring-boot-jpa-sharding-jdbc/pom.xml

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.1.1.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>com.zzy</groupId>
12+
<artifactId>spring-boot-jpa-sharding-jdbc</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>spring-boot-jpa-sharding-jdbc</name>
15+
<description>Demo project for Spring Boot</description>
16+
17+
<properties>
18+
<java.version>1.8</java.version>
19+
<sharding-sphere.version>3.1.0.M1</sharding-sphere.version>
20+
<sharding-jdbc-core.version>2.0.3</sharding-jdbc-core.version>
21+
</properties>
22+
23+
<dependencies>
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-data-jpa</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>org.springframework.boot</groupId>
30+
<artifactId>spring-boot-starter-thymeleaf</artifactId>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-starter-web</artifactId>
35+
</dependency>
36+
37+
<dependency>
38+
<groupId>mysql</groupId>
39+
<artifactId>mysql-connector-java</artifactId>
40+
<scope>runtime</scope>
41+
</dependency>
42+
<dependency>
43+
<groupId>org.projectlombok</groupId>
44+
<artifactId>lombok</artifactId>
45+
<optional>true</optional>
46+
</dependency>
47+
<dependency>
48+
<groupId>org.springframework.boot</groupId>
49+
<artifactId>spring-boot-starter-test</artifactId>
50+
<scope>test</scope>
51+
</dependency>
52+
<!--<dependency>-->
53+
<!--<groupId>io.shardingsphere</groupId>-->
54+
<!--<artifactId>sharding-jdbc-core</artifactId>-->
55+
<!--<version>${sharding-sphere.version}</version>-->
56+
<!--</dependency>-->
57+
<!--<dependency>-->
58+
<!--<groupId>io.shardingsphere</groupId>-->
59+
<!--<artifactId>sharding-jdbc-spring-boot-starter</artifactId>-->
60+
<!--<version>${sharding-sphere.version}</version>-->
61+
<!--</dependency>-->
62+
<dependency>
63+
<groupId>io.shardingjdbc</groupId>
64+
<artifactId>sharding-jdbc-core</artifactId>
65+
<version>${sharding-jdbc-core.version}</version>
66+
</dependency>
67+
<dependency>
68+
<groupId>org.apache.commons</groupId>
69+
<artifactId>commons-pool2</artifactId>
70+
<version>2.4.3</version>
71+
</dependency>
72+
<dependency>
73+
<groupId>io.lettuce</groupId>
74+
<artifactId>lettuce-core</artifactId>
75+
<version>5.1.3.RELEASE</version>
76+
<optional>true</optional>
77+
</dependency>
78+
<dependency>
79+
<groupId>com.alibaba</groupId>
80+
<artifactId>fastjson</artifactId>
81+
<version>1.2.49</version>
82+
</dependency>
83+
</dependencies>
84+
85+
<build>
86+
<plugins>
87+
<plugin>
88+
<groupId>org.springframework.boot</groupId>
89+
<artifactId>spring-boot-maven-plugin</artifactId>
90+
</plugin>
91+
</plugins>
92+
</build>
93+
94+
</project>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.zzy;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class Application {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(Application.class, args);
11+
}
12+
13+
}
14+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.zzy.config;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
5+
import org.springframework.data.repository.CrudRepository;
6+
7+
import java.io.Serializable;
8+
9+
/**
10+
* <p></p>
11+
* Created by zhezhiyong@163.com on 2017/12/25.
12+
*/
13+
public interface BaseJPA<T> extends CrudRepository<T, Long>, JpaRepository<T, Long>, JpaSpecificationExecutor<T>, Serializable {
14+
15+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.zzy.config;
2+
3+
import com.zzy.module.sharding.*;
4+
import com.zzy.util.DataSourceUtil;
5+
import io.shardingjdbc.core.api.ShardingDataSourceFactory;
6+
import io.shardingjdbc.core.api.config.ShardingRuleConfiguration;
7+
import io.shardingjdbc.core.api.config.TableRuleConfiguration;
8+
import io.shardingjdbc.core.api.config.strategy.ComplexShardingStrategyConfiguration;
9+
import io.shardingjdbc.core.api.config.strategy.StandardShardingStrategyConfiguration;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.context.annotation.Configuration;
12+
13+
import javax.sql.DataSource;
14+
import java.sql.SQLException;
15+
import java.util.HashMap;
16+
import java.util.Map;
17+
import java.util.Properties;
18+
19+
/**
20+
* <p></p>
21+
* Created by @author zhezhiyong@163.com on 2018/12/25.
22+
*/
23+
@Configuration
24+
public class DataSourceConfig {
25+
26+
/**
27+
* 分表
28+
*
29+
* @return 数据源
30+
* @throws SQLException 数据库异常
31+
*/
32+
@Bean
33+
public DataSource userShardingDataSource() throws SQLException {
34+
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
35+
36+
// 单库分表
37+
TableRuleConfiguration fileRule = new TableRuleConfiguration();
38+
fileRule.setLogicTable("t_file");
39+
fileRule.setActualDataNodes("ds0.t_file${0..1}");
40+
fileRule.setKeyGeneratorColumnName("file_id");
41+
fileRule.setKeyGeneratorClass(MySqlKeyGenerator.class.getName());
42+
fileRule.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("file_id",
43+
ModuloShardingDatabaseAlgorithm.class.getName()));
44+
fileRule.setTableShardingStrategyConfig(new ComplexShardingStrategyConfiguration("file_id,md5",
45+
FileComplexKeysShardingAlgorithm.class.getName()));
46+
47+
// 单库分表
48+
TableRuleConfiguration result = new TableRuleConfiguration();
49+
result.setLogicTable("t_user");
50+
result.setActualDataNodes("ds0.t_user${0..2}");
51+
result.setKeyGeneratorColumnName("user_id");
52+
result.setKeyGeneratorClass(MySqlKeyGenerator.class.getName());
53+
result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id",
54+
ModuloShardingDatabaseAlgorithm.class.getName(),
55+
ModuloShardingDatabaseAlgorithm.class.getName()));
56+
result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id",
57+
ModuloShardingTableAlgorithm.class.getName(),
58+
ModuloShardingTableAlgorithm.class.getName()));
59+
60+
61+
TableRuleConfiguration result2 = new TableRuleConfiguration();
62+
result2.setLogicTable("t_order");
63+
result2.setActualDataNodes("ds${0..1}.t_order${[0,1]}");
64+
result2.setKeyGeneratorColumnName("order_id");
65+
result2.setKeyGeneratorClass(RedisKeyGenerator.class.getName());
66+
result2.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id",
67+
ModuloShardingDatabaseAlgorithm.class.getName(),
68+
ModuloShardingDatabaseAlgorithm.class.getName()));
69+
result2.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id",
70+
ModuloShardingTableAlgorithm.class.getName(),
71+
ModuloShardingTableAlgorithm.class.getName()));
72+
73+
TableRuleConfiguration result3 = new TableRuleConfiguration();
74+
result3.setLogicTable("t_order_item");
75+
result3.setActualDataNodes("ds${0..1}.t_order_item${[0,1]}");
76+
result3.setKeyGeneratorColumnName("order_item_id");
77+
result3.setKeyGeneratorClass(RedisKeyGenerator.class.getName());
78+
result3.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id",
79+
ModuloShardingDatabaseAlgorithm.class.getName(),
80+
ModuloShardingDatabaseAlgorithm.class.getName()));
81+
result3.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id",
82+
ModuloShardingTableAlgorithm.class.getName(),
83+
ModuloShardingTableAlgorithm.class.getName()));
84+
85+
shardingRuleConfig.getTableRuleConfigs().add(result);
86+
shardingRuleConfig.getTableRuleConfigs().add(result2);
87+
shardingRuleConfig.getTableRuleConfigs().add(result3);
88+
shardingRuleConfig.getTableRuleConfigs().add(fileRule);
89+
90+
// 配置表关联
91+
shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");
92+
93+
Map<String, DataSource> dbMap = new HashMap<>(2);
94+
dbMap.put("ds0", DataSourceUtil.dataSource("ds0"));
95+
dbMap.put("ds1", DataSourceUtil.dataSource("ds1"));
96+
97+
Properties properties = new Properties();
98+
properties.put("sql.show", true);
99+
100+
return ShardingDataSourceFactory.createDataSource(dbMap, shardingRuleConfig, new HashMap<>(1), properties);
101+
}
102+
103+
104+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.zzy.config;
2+
3+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
4+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
5+
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
6+
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
10+
import org.springframework.orm.jpa.JpaTransactionManager;
11+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
12+
import org.springframework.transaction.PlatformTransactionManager;
13+
import org.springframework.transaction.annotation.EnableTransactionManagement;
14+
15+
import javax.annotation.Resource;
16+
import javax.persistence.EntityManager;
17+
import javax.sql.DataSource;
18+
import java.util.Map;
19+
20+
import static com.zzy.config.UserDataSourceConfig.BASE_PACKAGES;
21+
22+
/**
23+
* <p></p>
24+
* Created by @author zhezhiyong@163.com on 2018/12/25.
25+
*/
26+
@Configuration
27+
@EnableTransactionManagement
28+
@EnableJpaRepositories(
29+
//实体管理引用
30+
entityManagerFactoryRef = "entityManagerFactoryUser",
31+
//事务管理引用
32+
transactionManagerRef = "transactionManagerUser",
33+
//设置用户数据源所应用到的包
34+
basePackages = {BASE_PACKAGES})
35+
public class UserDataSourceConfig {
36+
37+
public static final String BASE_PACKAGES = "com.zzy.db";
38+
39+
/**
40+
* 注入用户数据源
41+
*/
42+
@Resource
43+
private DataSource userShardingDataSource;
44+
45+
/**
46+
* 配置EntityManager实体
47+
*/
48+
@Bean(name = "entityManagerUser")
49+
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
50+
return entityManagerFactoryUser(builder).getObject().createEntityManager();
51+
}
52+
53+
/**
54+
* 配置EntityManager工厂实体
55+
*/
56+
@Bean(name = "entityManagerFactoryUser")
57+
public LocalContainerEntityManagerFactoryBean entityManagerFactoryUser(EntityManagerFactoryBuilder builder) {
58+
return builder
59+
.dataSource(userShardingDataSource)
60+
.properties(getVendorProperties())
61+
//设置应用creditDataSource的基础包名
62+
.packages(BASE_PACKAGES)
63+
.persistenceUnit("userShardingPersistenceUnit")
64+
.build();
65+
}
66+
67+
/**
68+
* 注入jpa配置实体
69+
*/
70+
@Resource
71+
private JpaProperties jpaProperties;
72+
73+
@Resource
74+
private HibernateProperties hibernateProperties;
75+
76+
/**
77+
* 获取jpa配置信息
78+
*/
79+
private Map<String, Object> getVendorProperties() {
80+
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
81+
}
82+
83+
/**
84+
* 配置事务
85+
*/
86+
@Bean(name = "transactionManagerUser")
87+
public PlatformTransactionManager transactionManagerUser(EntityManagerFactoryBuilder builder) {
88+
return new JpaTransactionManager(entityManagerFactoryUser(builder).getObject());
89+
}
90+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.zzy.controller;
2+
3+
import com.google.common.collect.ImmutableBiMap;
4+
import com.zzy.db.entity.File;
5+
import com.zzy.db.repository.FileRepository;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.springframework.web.bind.annotation.*;
9+
10+
import javax.annotation.Resource;
11+
import java.util.Map;
12+
13+
/**
14+
* <p></p>
15+
* Created by @author zhezhiyong@163.com on 2018/12/25.
16+
*/
17+
@RestController
18+
@RequestMapping("file")
19+
@Slf4j
20+
public class FileController {
21+
@Resource
22+
private FileRepository fileRepository;
23+
24+
@RequestMapping("addFile")
25+
@ResponseBody
26+
public Map<String, Object> addFile(@RequestBody File file) {
27+
log.info("file:{}", file.toString());
28+
file = fileRepository.save(file);
29+
log.info("fileId:{}", file.getFileId());
30+
return ImmutableBiMap.of("code", 0, "data", file);
31+
}
32+
33+
@RequestMapping("getFile")
34+
@ResponseBody
35+
public Map<String, Object> getFile(@RequestParam(required = false, defaultValue = "-1") long fileId, @RequestParam(required = false,defaultValue = "") String md5) {
36+
File file = null;
37+
if (fileId>0){
38+
file = fileRepository.getOne(fileId);
39+
}
40+
if (StringUtils.isNotEmpty(md5)){
41+
file = fileRepository.findFirstByMd5(md5);
42+
}
43+
return ImmutableBiMap.of("code", 0, "data", file);
44+
}
45+
46+
47+
}

0 commit comments

Comments
 (0)