- 开发环境
- JDK1.8
- 数据库mysql 5.7
- 开发工具 idea 2018.1
- maven版本3.5.2
- 搭建一个父工程,两个子模块.
- 新建项目
- 点击file-->new-->project-->maven-->next
- 然后修改项目文件路径,生成项目.
- 修改项目的maven配置
- 因为是父工程并不会有具体的代码,所以可以吧src文件夹删掉.
- pom.xml文件
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ihrm</groupId> <artifactId>ihrm_parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>ihrm_parent</name> <description>IHRM-父工程</description> <parent> <!--springboot的maven配置--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent> <properties> <!--项目工程的基本配置--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <fastjson.version>1.2.47</fastjson.version> </properties> <dependencies> <dependency> <!--web环境--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <!--阿里提供的json转化--> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <!--lombok插件--> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.16</version> </dependency> </dependencies> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <build> <plugins> <!--编译插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <!--单元测试插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project>
-
构建公共的子模块
-
就是公用交互的实体类,或者dto,公共的Utils工具类 等等.
-
点击hrm项目,选择new-->module-->maven-->填写文件名:ihrm_common
-
-
写ResultCode公共的返回对象,
-
package com.ihrm.common.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; /** * 分页对象 * @param <T> */ @Data @AllArgsConstructor @NoArgsConstructorpackage com.ihrm.common.entity; /** * 公共的返回代码 */ public enum ResultCode { SUCCESS(true,200,"操作成功!"), //---系统错误返回码----- FAIL(false,999,"操作失败"), //操作是否成功 boolean success; //操作代码 int code; //提示信息 String message; ResultCode(boolean success,int code, String message){ this.success = success; this.code = code; this.message = message; } public boolean success() { return success; } public int code() { return code; } public String message() { return message; } } public class PageResult<T> { private Long total; private List<T> rows; }
-
Result返回的结果集
-
package com.ihrm.common.entity; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 封装的数据相应对象 */ @Data @NoArgsConstructor public class Result { private boolean success;//是否成功 private Integer code;// 返回码 private String message;//返回信息 private Object data;// 返回数据 public Result(ResultCode code) { this.success = code.success; this.code = code.code; this.message = code.message; } public Result(ResultCode code,Object data) { this.success = code.success; this.code = code.code; this.message = code.message; this.data = data; } public Result(Integer code,String message,boolean success) { this.code = code; this.message = message; this.success = success; } public static Result SUCCESS(){ return new Result(ResultCode.SUCCESS); } public static Result ERROR(){ return new Result(ResultCode.SERVER_ERROR); } public static Result FAIL(){ return new Result(ResultCode.FAIL); } }
-
-
PageResult分页返回的结果集
-
package com.ihrm.common.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; /** * 分页对象 * @param <T> */ @Data @AllArgsConstructor @NoArgsConstructor public class PageResult<T> { private Long total; private List<T> rows; }
-
-
微服务架构id的生成
- 常用的主键生成方式
-
主键自增-->多家公司共用一张表.
-
uuid-->太长了.数据量大
-
借助全局的redis. 每次都访问同一个redis. 但是对于网络的开销太大了.
-
-
微服务的主键生成方式: 雪花算法:
-
目前微服务架构盛行,在分布式系统中的操作中都会有一些全局性ID的需求,所以我们不能使用数据库本身的自增功能来产生主键值,只能由程序来生成唯一的主键值。我们采用的是开源的twitter( 非官方中文惯称:推特.是国外的一个网站,是一个社交网络及微博客服务) 的snowflake (雪花)算法。
-
-
第一位不用,后面是时间戳的毫秒数加上工作机器的id加上系列号最大支持4096个id
-
如果你在同一毫秒同一个机器上,瞬间进入10000个,多余的它就会等到下一毫秒在进行处理.
-
-
-
网上找到的生成的工具类
-
package com.ihrm.common.utils; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; //雪花算法代码实现 public class IdWorker { // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) private final static long twepoch = 1288834974657L; // 机器标识位数 private final static long workerIdBits = 5L; // 数据中心标识位数 private final static long datacenterIdBits = 5L; // 机器ID最大值 private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); // 数据中心ID最大值 private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); // 毫秒内自增位 private final static long sequenceBits = 12L; // 机器ID偏左移12位 private final static long workerIdShift = sequenceBits; // 数据中心ID左移17位 private final static long datacenterIdShift = sequenceBits + workerIdBits; // 时间毫秒左移22位 private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; private final static long sequenceMask = -1L ^ (-1L << sequenceBits); /* 上次生产id时间戳 */ private static long lastTimestamp = -1L; // 0,并发控制 private long sequence = 0L; private final long workerId; // 数据标识id部分 private final long datacenterId; public IdWorker(){ this.datacenterId = getDatacenterId(maxDatacenterId); this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); } /** * @param workerId * 工作机器ID * @param datacenterId * 序列号 */ public IdWorker(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } /** * 获取下一个ID * * @return */ public synchronized long nextId() { long timestamp = timeGen(); if (timestamp < lastTimestamp) { throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); } if (lastTimestamp == timestamp) { // 当前毫秒内,则+1 sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { // 当前毫秒内计数满了,则等待下一秒 timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; // ID偏移组合生成最终的ID,并返回ID long nextId = ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; return nextId; } private long tilNextMillis(final long lastTimestamp) { long timestamp = this.timeGen(); while (timestamp <= lastTimestamp) { timestamp = this.timeGen(); } return timestamp; } private long timeGen() { return System.currentTimeMillis(); } /** * <p> * 获取 maxWorkerId * </p> */ protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { StringBuffer mpid = new StringBuffer(); mpid.append(datacenterId); String name = ManagementFactory.getRuntimeMXBean().getName(); if (!name.isEmpty()) { /* * GET jvmPid */ mpid.append(name.split("@")[0]); } /* * MAC + PID 的 hashcode 获取16个低位 */ return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); } /** * <p> * 数据标识id部分 * </p> */ protected static long getDatacenterId(long maxDatacenterId) { long id = 0L; try { InetAddress ip = InetAddress.getLocalHost(); NetworkInterface network = NetworkInterface.getByInetAddress(ip); if (network == null) { id = 1L; } else { byte[] mac = network.getHardwareAddress(); id = ((0x000000FF & (long) mac[mac.length - 1]) | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; id = id % (maxDatacenterId + 1); } } catch (Exception e) { System.out.println(" getDatacenterId: " + e.getMessage()); } return id; } }
-
如果maven加载完报错,就把报错的maven注释掉,重新加载就可以了.或者
-
-
- 常用的主键生成方式
-
把dao需要的实体类都放到一个项目中,这样方便管理.
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>ihrm_parent</artifactId> <groupId>com.ihrm</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ihrm_commom_model</artifactId> <dependencies> <!--springData_jpa的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--commom项目的依赖--> <dependency> <groupId>com.ihrm</groupId> <artifactId>ihrm_common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
-
然后model项目下的java包和resource包设置为sources root 和 resource root
-
-
新建一个ihrm_company项目引入对common和model项目的以来,然后增加springboot的启动类和jpa的依赖
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>ihrm_parent</artifactId> <groupId>com.ihrm</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ihrm_company</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.ihrm</groupId> <artifactId>ihrm_common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.ihrm</groupId> <artifactId>ihrm_commom_model</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
-
在添加好后刷新maven,然后在resource目录下,新建springboot的启动配置文件application.yml
-
直接new file就可以了.
-
配置启动文件
-
springboot的配置文件在 服务器上不支持tab键.所以就手敲空格吧.
-
#服务配置 server: port: 9001 #spring配置 spring: application: name: ihrm-company #数据库连接 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/ihrm?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456 #jap的配置 jpa: database: MySQL show-sql: true open-in-view: true
-
-
-
创建当前项目的启动类
-
/** * 启动类 */ //配置springboot的包扫描 @SpringBootApplication(scanBasePackages = "com.ihrm.**") //配置jsp注解的扫描 就是扫描model项目的 @EntityScan(value = "com.ihrm.domain.**") @Slf4j @RestController public class CompanyApplication { /** * 启动方法 * * @param args */ public static void main(String[] args) throws UnknownHostException { ConfigurableApplicationContext application = SpringApplication.run(CompanyApplication.class, args); Environment env = application.getEnvironment(); log.info("\n--------------------------------------------------------------------------------------------------------------------\n\t" + "CompanyApplication '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:{}/\n\t" + "External: \thttp://{}:{}/\n\t" + "docs: \thttp://{}:{}/docs.html" + "\n--------------------------------------------------------------------------------------------------------------------", "CompanyApplication Server Application v1.0", env.getProperty("server.port"), InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port")); } @GetMapping("/") public String index() { return "CompanyApplication Server is running"; } @RequestMapping("/hello") @ResponseBody String home() { return "Hello ,spring boot!"; }
-
-
mysql安装:
-
创建数据库表
-
CREATE TABLE `co_company` ( `id` varchar(40) NOT NULL COMMENT 'ID', `name` varchar(255) NOT NULL COMMENT '公司名称', `manager_id` varchar(255) NOT NULL COMMENT '企业登录账号ID', `version` varchar(255) DEFAULT NULL COMMENT '当前版本', `renewal_date` datetime DEFAULT NULL COMMENT '续期时间', `expiration_date` datetime DEFAULT NULL COMMENT '到期时间', `company_area` varchar(255) DEFAULT NULL COMMENT '公司地区', `company_address` text COMMENT '公司地址', `business_license_id` varchar(255) DEFAULT NULL COMMENT '营业执照-图片ID', `legal_representative` varchar(255) DEFAULT NULL COMMENT '法人代表', `company_phone` varchar(255) DEFAULT NULL COMMENT '公司电话', `mailbox` varchar(255) DEFAULT NULL COMMENT '邮箱', `company_size` varchar(255) DEFAULT NULL COMMENT '公司规模', `industry` varchar(255) DEFAULT NULL COMMENT '所属行业', `remarks` text COMMENT '备注', `audit_state` varchar(255) DEFAULT NULL COMMENT '审核状态', `state` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态', `balance` double NOT NULL COMMENT '当前余额', `create_time` datetime NOT NULL COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
生成实体类.
-
因为使用jpa操作数据,使用jpa注解
-
实体类和表的映射关系
-
字段和属性的映射关系
-
-
用@Entity表示实体类.@Table(name = "co_company")写对应的映射表名.
-
@id或者@Column(name= "数据对应的字段")
-
-
数据库连接的版本和本地数据库的版本 不匹配.
-
要不然就改数据库,要不然就该驱动..建议还是降低数据库吧.然后一系列的maven配置都要改.
-
-
然后写一个test类.这样数据库就连接成功了.
-
-
-
-
我用的软件百度网盘下载地址:
-
链接:https://pan.baidu.com/s/1Q4guTqX21zRf2rWyscg6xw 提取码:gyod
-
-
-
-
IHRM项目一章_搭建项目
最新推荐文章于 2025-07-07 15:47:30 发布