springcloud micro service implementation CRUD

With the advent of micro-services, we have developed more efficient than before but also a lot faster than traditional development model, more convenient micro services provided, so that our developers speed has been greatly improved, and I compared before writing combined springcloud binding mybati implement CRUD. This time, write a comment pure way to achieve a simple CRUD.

Create a parent project, you can not create my major was written and there are other functions, it is not just a simple CRUD, so they need a parent to manage the project

pom.xml father works as follows:

<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.tensquare</groupId>
  <artifactId>tensquare_parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
   <name>springCloud</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.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>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>SpringSnapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>SpringMilestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>SpringSnapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>SpringMilestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    <modules>
    	<module>springCloud_base</module>
    </modules>
</project>

The parent works in the following to create a web project. pom.xml as follows:

<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>
	<parent>
		<groupId>com.tensquare</groupId>
		<artifactId>springCloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>springCloud_base</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>
	</dependencies>
</project>

Built table script:

DROP DATABASE IF EXISTS "user" ;
CREATE TABLE `user` (
  `id` INT(11) DEFAULT NULL,
  `name` VARCHAR(255) DEFAULT NULL,
  `age` INT(11) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '张三', '22'), ('2', '李四', '23'),('3', '王五', '22'), ('4', '赵六', '23');
 

User objects

package com.csq.study;
 

@Entity
@Table(name="user")
public class User {
 
	
	@Id
	int id;
	String name;
	int age;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
 
}
 

Result returns the result object

public class Result {
	private boolean flag;//是否成功
	private Integer code;// 返回码
	private String message;//返回信息
	private Object data;// 返回数据
set/get ... 构造方法  略 
}

 

StatusCode Status Response

public class StatusCode {
	public static final int OK=20000;//成功
	public static final int ERROR =20001;//失败
	public static final int LOGINERROR =20002;//用户名或密码错误
	public static final int ACCESSERROR =20003;//权限不足
	public static final int REMOTEERROR =20004;//远程调用失败
	public static final int REPERROR =20005;//重复操作
}

utils id generator in tools:

 

package util;

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;

/**
 * <p>名称:IdWorker.java</p>
 * <p>描述:分布式自增长ID</p>
 * <pre>
 *     Twitter的 Snowflake JAVA实现方案
 * </pre>
 * 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
 * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
 * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
 * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
 * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
 * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
 * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
 * <p>
 * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
 *
 * @author Polim
 */
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;
    }


}

 Dao

dao
/**
 * JpaRepository提供了基本的增删改查
   JpaSpecificationExecutor用于做复杂的条件查询
 * @author HUNI
 */
public interface UserDao extends JpaRepository<User, String>,
    JpaSpecificationExecutor<User>{
}

service layer


@Service
public class UserService {
	@Autowired
	 UserDao userDao;
	@Autowired
	IdWorker idWorker;
	/**
	* 查询全部
	* @return
	*/
	public List<User> findAll(){	
	  return userDao.findAll();
	}
  /**
    * 根据Id查询
    * @param id
    * @return
    */
	public User findById(String id){	
		return userDao.findById(id).get();
	}
	/**
	 * 增加标签
	 * @param user
	 */
	public void add(User user){
		user.setId(idWorker.nextId()+"");
		userDao.save(user);
	}
	/**
	 * 更新标签
	 * @param user
	 */
	public void update(User user){
		
		userDao.save(user);
	}
	/**
	 * 删除标签
	 * @param id
	 */
	public void deteleById(String id){	
		userDao.deleteById(id);		
	}
}

controller


@RestController
@RequestMapping("/user")
public class UserController {
	@Autowired
	private UserService userService;
	@RequestMapping(method=RequestMethod.GET)
	public Result findAll(){
		Result result = new Result(true,StatusCode.OK,"查询成功",userService.findAll());
		return result;
	}
	@RequestMapping(value="/{id}", method=RequestMethod.GET)
	public Result findById(@PathVariable String id){
		Result result = new Result(true,StatusCode.OK,"查询成功",userService.findById(id));
		return result;
	}
	@RequestMapping(method=RequestMethod.POST)
	public Result add(@RequestBody User user){
		userService.add(user);
		 Result result = new Result(true,StatusCode.OK,"添加成功");
		 return result;
	}
	@RequestMapping(value="/{id}",method=RequestMethod.PUT)
	public Result update(@RequestBody  User user,@PathVariable String id){
		user.setId(id);
		userService.update(user);
		 Result result = new Result(true,StatusCode.OK,"修改成功");
		 return result;
	}
	@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
	public Result deleteById(@PathVariable String id){
		userService.deteleById(id);
		Result result = new Result(true,StatusCode.OK,"删除成功");
		 return result;
	}
}

Quick Start class

 

@SpringBootApplication
public class BaseApplication {
	public static void main(String[] args) {
		SpringApplication.run(BaseApplication.class, args);
	}

	@Bean
	public IdWorker idworker(){
	  return new IdWorker(1,1);
	
	}
}

Profile application.yml

 

server:
 port: 9001  #服务端口
spring:
 application:
   name: springCloud-base   #服务名称
 datasource:
   driverClassName: com.mysql.jdbc.Driver
   url: jdbc:mysql://localhost:3306/user  #连接额数据库 
   username: root   #数据库用户
   password: root  #数据库密码
 jpa:
   database: mysql 
   show‐sql: true
   generate‐ddl: true

Use postman test results to see whether the correct 

Not posted here for the test results, we own test to see whether you write can run through.

Guess you like

Origin blog.csdn.net/FindHuni/article/details/85049506