diff --git a/3分钟搞定读写分离/springboot-duxiefenli/pom.xml b/3分钟搞定读写分离/springboot-duxiefenli/pom.xml new file mode 100644 index 0000000..1b938a0 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + + com.woniu + springboot-multisource + 1.0.0-SNAPSHOT + jar + + springboot-multisource + SpringBoot配置多数据源 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + 1.1.2 + 8.0.26 + 2.1.8 + 1.0.5 + + + + + org.springframework.boot + spring-boot-starter-aop + + + mysql + mysql-connector-java + ${mysql-connector.version} + runtime + + + com.alibaba + druid + ${druid.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + com.baomidou + mybatisplus-spring-boot-starter + ${mybatisplus-spring-boot-starter.version} + + + + io.shardingjdbc + sharding-jdbc-core + 2.0.3 + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.hamcrest + hamcrest-all + 1.3 + test + + + org.projectlombok + lombok + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + \ No newline at end of file diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/Application.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/Application.java new file mode 100644 index 0000000..323fbc8 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/Application.java @@ -0,0 +1,12 @@ +package com.woniu.pos; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/common/dao/entity/User.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/common/dao/entity/User.java new file mode 100644 index 0000000..0ca1c67 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/common/dao/entity/User.java @@ -0,0 +1,32 @@ +package com.woniu.pos.common.dao.entity; + + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author 蜗牛 + */ +@TableName(value = "t_user") +@Data +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 名字 + */ + private String name; + + +} diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/common/dao/repository/UserMapper.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/common/dao/repository/UserMapper.java new file mode 100644 index 0000000..6e04cbe --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/common/dao/repository/UserMapper.java @@ -0,0 +1,13 @@ +package com.woniu.pos.common.dao.repository; + +import com.woniu.pos.common.dao.entity.User; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author 蜗牛 + */ +@Mapper +public interface UserMapper extends BaseMapper { + +} diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/config/ShardingDataSourceConfig.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/config/ShardingDataSourceConfig.java new file mode 100644 index 0000000..3988fc1 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/config/ShardingDataSourceConfig.java @@ -0,0 +1,46 @@ +package com.woniu.pos.config; + + +import com.google.common.collect.Maps; +import io.shardingjdbc.core.api.MasterSlaveDataSourceFactory; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; +import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; +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 javax.sql.DataSource; +import java.sql.SQLException; +import java.util.Map; + +@Configuration +@EnableConfigurationProperties(ShardingMasterSlaveConfig.class) +@Slf4j +// 读取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 dataSourceMap = Maps.newHashMap(); + dataSourceMap.putAll(shardingMasterSlaveConfig.getDataSources()); + // 拿到主从配置 + MasterSlaveRuleConfiguration masterSlaveRule = shardingMasterSlaveConfig.getMasterSlaveRule(); + final Map newHashMap = Maps.newHashMap(); + // 创建 MasterSlave数据源 + DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(dataSourceMap, + masterSlaveRule, newHashMap); + log.info("masterSlaveDataSource config complete"); + return dataSource; + } + +} \ No newline at end of file diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/config/ShardingMasterSlaveConfig.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/config/ShardingMasterSlaveConfig.java new file mode 100644 index 0000000..d9c28a6 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/config/ShardingMasterSlaveConfig.java @@ -0,0 +1,21 @@ +package com.woniu.pos.config; + +import com.zaxxer.hikari.HikariDataSource; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.HashMap; +import java.util.Map; + + +@Data +@ConfigurationProperties(prefix = "sharding.jdbc") +public class ShardingMasterSlaveConfig { + + // 存放本地多个数据源 + private Map dataSources = new HashMap<>(); + + private MasterSlaveRuleConfiguration masterSlaveRule; + +} diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/controller/TbUserController.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/controller/TbUserController.java new file mode 100644 index 0000000..4c995f3 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/controller/TbUserController.java @@ -0,0 +1,30 @@ +package com.woniu.pos.controller; + +import com.woniu.pos.common.dao.entity.User; +import com.woniu.pos.common.dao.repository.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 3分钟搞定读写分离 + */ +@RestController +@RequestMapping("/user") +public class TbUserController { + + @Autowired + private UserMapper userMapper; + + @GetMapping("/userList") + public List selectUsers() { + return userMapper.selectList(null); + } + + @PostMapping("/insertUser") + public void insertUser(@RequestBody User user) { + userMapper.insert(user); + } + +} \ No newline at end of file diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/service/UserService.java b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/service/UserService.java new file mode 100644 index 0000000..abc9ec7 --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/java/com/woniu/pos/service/UserService.java @@ -0,0 +1,63 @@ +package com.woniu.pos.service; + +import com.woniu.pos.common.dao.entity.User; +import com.woniu.pos.common.dao.repository.UserMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +/** + * 后台用户管理 + */ + +@Service +@Transactional +public class UserService { + + @Resource + private UserMapper userMapper; + + /** + * 通过ID查找用户 + * @param id + * @return + */ + public User findById(Integer id) { + return userMapper.selectById(id); + } + + /** + * 通过ID查找用户 + * @param id + * @return + */ + public User findById1(Integer id) { + return userMapper.selectById(id); + } + + /** + * 新增用户 + * @param user + */ + public void insertUser(User user) { + userMapper.insert(user); + } + + /** + * 修改用户 + * @param user + */ + public void updateUser(User user) { + userMapper.updateById(user); + } + + /** + * 删除用户 + * @param id + */ + public void deleteUser(Integer id) { + userMapper.deleteById(id); + } + +} diff --git a/3分钟搞定读写分离/springboot-duxiefenli/src/main/resources/application.yml b/3分钟搞定读写分离/springboot-duxiefenli/src/main/resources/application.yml new file mode 100644 index 0000000..2df54da --- /dev/null +++ b/3分钟搞定读写分离/springboot-duxiefenli/src/main/resources/application.yml @@ -0,0 +1,31 @@ +server: + port: 8080 +mybatis-plus: + mapper-locations: classpath*:/mapper/*.xml + +#shardingjdbc配置 +sharding: + jdbc: + data-sources: + ###配置第一个从数据库 + ds_slave_0: + password: 123456 + jdbc-url: jdbc:mysql://127.0.0.1:3306/ds2database?useUnicode=true&characterEncoding=utf-8&useSSL=false + driver-class-name: com.mysql.jdbc.Driver + username: root + ###主数据库配置 + ds_master: + password: 123456 + jdbc-url: jdbc:mysql://127.0.0.1:3306/ds1database?useUnicode=true&characterEncoding=utf-8&useSSL=false + driver-class-name: com.mysql.jdbc.Driver + username: root + ###配置读写分离 + master-slave-rule: + ###配置从库选择策略,提供轮询与随机,这里选择用轮询 + load-balance-algorithm-type: round_robin + ####指定主数据库 + master-data-source-name: ds_master + ####指定从数据库 + slave-data-source-names: ds_slave_0 + ####读写分离名称,随便起。 + name: ds_ms