# 领域模型数仓 **Repository Path**: weizuxiao911/domain-repository ## Basic Information - **Project Name**: 领域模型数仓 - **Description**: 基于领域驱动设计架构思想下,结合Spring框架进行增强,实现Repository组件化,支持自动装配,注解声明式应用。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-09-06 - **Last Updated**: 2023-12-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: Framework ## README # 特征 - 自动装配,按需加载 - 支持MySQL、MongoDB - 支持MySQL事务管理 - 支持MySQL读写分离 # 应用 ## 引入依赖 ```xml org.springframework.boot spring-boot-starter-jdbc 2.1.14.RELEASE org.springframework.boot spring-boot-starter-data-mongodb 2.1.14.RELEASE w.z.x.framework repository 1.0.0-SNAPSHOT ``` ## MYSQL应用 ### 读写分离 ```yaml spring: datasource: # 写库 master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true username: root password: P@ssw0rd # 读库 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true username: root password: P@ssw0rd ``` ### 数据结构 ```java /** * MYSQL 测试类 * * @author 魏祖潇 */ @Slf4j @Data /* getter / setter */ @Mapper("t_user") /* reflect to table */ public class User extends MysqlFactory implements Serializable { /** * 自增ID */ @GenKey private Long id; /** * 创建时间,新增时自动填充 */ private Date createTime; /** * 修改时间,新增或修改时自动填充 */ private Date modifyTime; /** * 逻辑删,新增时自动填充,查询时自动拼接到where条件 */ @LogicDelete private Boolean deleted; /** * 乐观锁,新增时自动填充,更新时自增且拼接到where条件 */ @Version private Long version; /** * 用户名 */ @ID private String username; /** * 性别 */ private Gender gender; /** * html */ private String html; /** * 不持久化属性 */ @Transient private Integer ignore; /** * 其他行为方法 */ } ``` ### 单元测试 ```java /** * 单元测试 * * @author 魏祖潇 */ @Slf4j @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @EnableTransactionManagement public class MysqlTest { /** * save */ @Test public void save() { User it = MysqlFactory.build(User.class) .of(User::getUsername, "1") .of(User::getGender, Gender.NONE) .of(User::getHtml,""); it.save(); } /** * batch save */ @Test public void save2() { List list = Arrays.asList( MysqlFactory.build(User.class) .of(User::getUsername, "1") .of(User::getGender, Gender.NONE) .of(User::getHtml,""), MysqlFactory.build(User.class) .of(User::getUsername, "2") .of(User::getGender, Gender.NONE) .of(User::getHtml,""), MysqlFactory.build(User.class) .of(User::getUsername, "3") .of(User::getGender, Gender.NONE) .of(User::getHtml,"") ); MysqlFactory.save(list); } /** * update */ @Test public void update() { User it = MysqlFactory.get(User.class, "1"); if (Objects.nonNull(it)) { it.update(); } } /** * batch update */ @Test public void update2() { List list = MysqlFactory.get(User.class, "1", "2"); MysqlFactory.update(list); } /** * update with wrapper */ @Test public void update3() { LambdaUpdateWrapper wrapper = Wrapper.lambdaUpdateWrapper(); wrapper.set(User::getGender, Gender.MALE.getCode()) .eq(User::getUsername, "1"); MysqlFactory.update(User.class, wrapper); } /** * update by sql */ @Test public void update4() { String sql = "update t_user set version = version + 1 where username = ?"; MysqlFactory.update(sql, "1"); } /** * saveOrUpdate */ @Test public void saveOrUpdate() { User it = MysqlFactory.build(User.class) .of(User::getUsername, "1"); it.setHtml(""); it.saveOrUpdate(); } /** * delete */ @Test public void delete() { User it = MysqlFactory.get(User.class, "1"); if (Objects.nonNull(it)) { it.delete(); } } /** * delete with wrapper */ @Test public void delete2() { LambdaDeleteWrapper wrapper = Wrapper.lambdaDeleteWrapper(); wrapper.limit(1); MysqlFactory.delete(User.class, wrapper); } /** * get */ @Test public void get() { log.info("{}", MysqlFactory.get(User.class, "2")); } /** * get in ids */ @Test public void get2() { log.info("{}", MysqlFactory.get(User.class, "1", "11")); } /** * get with wrapper */ @Test public void get3() { LambdaQueryWrapper wrapper = Wrapper.lambdaQueryWrapper(); wrapper.eq(User::getUsername, "1"); log.info("{}", MysqlFactory.get(User.class, wrapper)); } /** * find by sql */ @Test public void find() { log.info("{}", MysqlFactory.find("select * from t_domain")); } /** * find and convert */ @Test public void find2() { log.info("{}", MysqlFactory.find(User.class, "select * from t_domain")); } /** * find with wrapper */ @Test public void find3() { LambdaQueryWrapper wrapper = Wrapper.lambdaQueryWrapper(); wrapper.limit(1); log.info("{}", MysqlFactory.find(User.class, wrapper)); } /** * count by sql */ @Test public void count() { log.info("{}", MysqlFactory.count("select count(1) from t_user")); } /** * count domain */ @Test public void count2() { log.info("{}", MysqlFactory.count(User.class)); } /** * count with wrapper */ @Test public void count3() { LambdaQueryWrapper wrapper = Wrapper.lambdaQueryWrapper(); wrapper.like(User::getUsername, "1"); log.info("{}", MysqlFactory.count(User.class, wrapper)); } /** * page and convert */ @Test public void page() { log.info("{}", MysqlFactory.page(User.class, 1, 10, "select * from t_user")); } /** * page with wrapper */ @Test public void page2() { LambdaQueryWrapper wrapper = Wrapper.lambdaQueryWrapper(); wrapper.like(User::getUsername, "1"); log.info("{}", MysqlFactory.page(User.class, wrapper, 1, 10)); } } ``` ## MongoDB应用 ### 数据结构 ```java /** * 测试类 * @author 魏祖潇 */ @Data public class Role extends MongodbFactory { @Id private String id; private String userId; private String roleId; /** * 其他行为实现 */ } ``` ### 单元测试 ```java /** * 单元测试 * * @author 魏祖潇 */ @Slf4j @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @EnableTransactionManagement public class MongodbTest { @Test public void save() { Role role = new Role(); role.setRoleId("3"); role.setUserId("3"); role.save(); log.info("entity => {}", role); } @Test public void get() { Role role = MongodbFactory.get(Role.class, Query.query(Criteria.where("userId").is("3"))); log.info("{}", role); } @Test public void update() { Role role = MongodbFactory.get(Role.class, Query.query(Criteria.where("userId").is("3"))); if (Objects.nonNull(role)) { role.setRoleId("4"); role.update(); } } @Test public void count() { log.info("count => {}", MongodbFactory.count(Role.class)); } @Test public void page() { log.info("page => {}", MongodbFactory.page(Role.class, new Query(), 2, 1)); } } ```