SpringBoot2.0整合Sharding-Jdbc
maven:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0-beta</version> </dependency> <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>2.0.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
yml:
mybatis-plus: # mapper-locations: classpath*:/mapper/*.xml global-config: db-config: column-underline: true #shardingjdbc配置 sharding: jdbc: data-sources: ###配置第一个从数据库 名称随便起 ds_slave_0: password: root jdbc-url: jdbc:mysql://192.168.91.9:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true driver-class-name: com.mysql.jdbc.Driver username: root ###主数据库配置 名称随便起 ds_master: password: root jdbc-url: jdbc:mysql://192.168.91.8:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true driver-class-name: com.mysql.jdbc.Driver username: root ###配置读写分离 master-slave-rule: ###配置从库选择策略,提供轮询与随机,这里选择用轮询 如果从做了集群 查询时候做轮训查询 load-balance-algorithm-type: round_robin ####指定从数据库 如果多个从 用逗号隔开 slave-data-source-names: ds_slave_0 name: ds_ms ####指定主数据库 master-data-source-name: ds_master
config配置:
import java.sql.SQLException; import java.util.Map; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.google.common.collect.Maps; import io.shardingjdbc.core.api.MasterSlaveDataSourceFactory; import lombok.extern.log4j.Log4j2; @Configuration @EnableConfigurationProperties(ShardingMasterSlaveConfig.class) @Log4j2 // 读取ds_master主数据源和读写分离配置 @ConditionalOnProperty({ "sharding.jdbc.data-sources.ds_master.jdbc-url", "sharding.jdbc.master-slave-rule.master-data-source-name" }) public class ShardingDataSourceConfig { @Autowired private ShardingMasterSlaveConfig shardingMasterSlaveConfig; @Bean public DataSource masterSlaveDataSource() throws SQLException { final Map<String, DataSource> dataSourceMap = Maps.newHashMap(); dataSourceMap.putAll(shardingMasterSlaveConfig.getDataSources()); final Map<String, Object> newHashMap = Maps.newHashMap(); // 创建 MasterSlave数据源 DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(dataSourceMap, shardingMasterSlaveConfig.getMasterSlaveRule(), newHashMap); log.info("masterSlaveDataSource config complete"); return dataSource; } }
import java.util.HashMap; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; import com.zaxxer.hikari.HikariDataSource; import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import lombok.Data; @Data //表示读取本底配置文件 前缀sharding.jdbc @ConfigurationProperties(prefix = "sharding.jdbc") public class ShardingMasterSlaveConfig { // 存放本地多个数据源 最终放在map集合中 key为yml配置的 ds_slave_0 private Map<String, HikariDataSource> dataSources = new HashMap<>(); private MasterSlaveRuleConfiguration masterSlaveRule; }
上面为核心代码
下面是辅助的:
Controller:
import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.mayikt.entity.UserEntity; import com.mayikt.service.UserService; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/findUser") public List<UserEntity> findUser() { return userService.findUser(); } @RequestMapping("/insertUser") public String insertUser(String userName) { return userService.insertUser(userName) > 0 ? "success" : "fail"; } }
entity:
public class UserEntity { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
service:
import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.mayikt.entity.UserEntity; import com.mayikt.mapper.UserMapper; @Service public class UserService { @Autowired private UserMapper userMapper; // 使用读的数据源 public List<UserEntity> findUser() { return userMapper.findUser(); } // 使用写的数据源 public int insertUser(String userName) { return userMapper.insertUser(userName); } }
mapper:
import java.util.List; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import com.mayikt.entity.UserEntity; public interface UserMapper { @Select("SELECT * FROM user_info ") public List<UserEntity> findUser(); @Insert("insert into user_info values (#{userName}); ") public int insertUser(@Param("userName") String userName); }
启动类:
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.toov5.mapper") public class AppMbatis { public static void main(String[] args) { SpringApplication.run(AppMbatis.class, args); } }