springboot入门项目-新增收货地址

0. 新建数据库表t_address和实体类

CREATE TABLE t_address(
	aid INT AUTO_INCREMENT COMMENT '收获地址id',
	uid INT COMMENT '归属的用户id',
	name VARCHAR(20) COMMENT '收货人姓名',
	province_name VARCHAR(15) COMMENT '省-名称',
	province_code CHAR(6) COMMENT '省-行政代号',
	city_name VARCHAR(15) COMMENT '市-名称',
	city_code CHAR(6) COMMENT '市-行政代号',
	area_name VARCHAR(15) COMMENT '区-名称',
	area_code VARCHAR(6) COMMENT '区-行政代号',
	zip CHAR(6) COMMENT '邮政编码',
	address VARCHAR(50) COMMENT '详细地址',
	phone VARCHAR(20) COMMENT '手机号码',
	tel VARCHAR(20) COMMENT '固话',
	tag VARCHAR(6) COMMENT '标签',
	is_default INT COMMENT '是否默认,0-不默认,1-默认',
	create_by VARCHAR(20) COMMENT '创建人',
	create_time DATETIME COMMENT '创建时间',
	modify_by VARCHAR(20) COMMENT '修改者',
	modify_time DATETIME COMMENT '修改时间',
	PRIMARY KEY (aid)

)ENGINE=INNODB DEFAULT CHARSET=utf8;

实体类

1. 持久层

1. 规划需要执行的sql语句
  1. 插入数据:insert into t_address(…) values(…)
  2. 一个用户的收获地址最多有20个,在插入之前先做查询:
    select count(*) t_address where uid=?
2. 接口与抽象方法
package com.cy.store.mapper;

import com.cy.store.entity.Address;

public interface AddressMapper {


    /**
     * 插入用户的收获地址数据
     * @param address
     * @return
     */
    Integer insert(Address address);

    /**
     * 根据uid统计用户的收货地址数量
     * @param uid
     * @return
     */
    Integer countByUid(Integer uid);
}
3. sql映射文件

DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.store.mapper.AddressMapper">
  <resultMap id="BaseResultMap" type="com.cy.store.entity.Address">
    <id column="aid" jdbcType="INTEGER" property="aid" />
    <result column="uid" jdbcType="INTEGER" property="uid" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="province_name" jdbcType="VARCHAR" property="provinceName" />
    <result column="province_code" jdbcType="CHAR" property="provinceCode" />
    <result column="city_name" jdbcType="VARCHAR" property="cityName" />
    <result column="city_code" jdbcType="CHAR" property="cityCode" />
    <result column="area_name" jdbcType="VARCHAR" property="areaName" />
    <result column="area_code" jdbcType="VARCHAR" property="areaCode" />
    <result column="zip" jdbcType="CHAR" property="zip" />
    <result column="address" jdbcType="VARCHAR" property="address" />
    <result column="phone" jdbcType="VARCHAR" property="phone" />
    <result column="tel" jdbcType="VARCHAR" property="tel" />
    <result column="tag" jdbcType="VARCHAR" property="tag" />
    <result column="is_default" jdbcType="INTEGER" property="isDefault" />
    <result column="create_by" jdbcType="VARCHAR" property="createBy" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="modify_by" jdbcType="VARCHAR" property="modifyBy" />
    <result column="modify_time" jdbcType="TIMESTAMP" property="modifyTime" />
  resultMap>

  <insert id="insert" useGeneratedKeys="true" keyProperty="aid" parameterType="com.cy.store.entity.Address">
    insert into t_address (aid, uid, name, 
      province_name, province_code, city_name, 
      city_code, area_name, area_code, 
      zip, address, phone, tel, 
      tag, is_default, create_by, 
      create_time, modify_by, modify_time
      )
    values (#{aid,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
      #{provinceName,jdbcType=VARCHAR}, #{provinceCode,jdbcType=CHAR}, #{cityName,jdbcType=VARCHAR}, 
      #{cityCode,jdbcType=CHAR}, #{areaName,jdbcType=VARCHAR}, #{areaCode,jdbcType=VARCHAR}, 
      #{zip,jdbcType=CHAR}, #{address,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{tel,jdbcType=VARCHAR}, 
      #{tag,jdbcType=VARCHAR}, #{isDefault,jdbcType=INTEGER}, #{createBy,jdbcType=VARCHAR}, 
      #{createTime,jdbcType=TIMESTAMP}, #{modifyBy,jdbcType=VARCHAR}, #{modifyTime,jdbcType=TIMESTAMP}
      )
  insert>
  <select id="countByUid" resultType="java.lang.Integer">
    select count(*) from t_address where uid=#{uid}
  select>
mapper>
4. 测试

(暂略)

2. 业务层

1. 规划异常
  1. 收货地址数量超出:AddressCountLimitException
  2. 插入收货地址数据时出现未知异常:InsertException
2. service接口
package com.cy.store.service;

import com.cy.store.entity.Address;

public interface IAddressService {
    /**
     * 新增收获地址
     * @param uid
     * @param username
     * @param address
     */
    void addNewAddress(Integer uid,String username, Address address);
}
3. service实现类
package com.cy.store.service.impl;

import com.cy.store.entity.Address;
import com.cy.store.ex.AddressServiceEx.AddressCountLimitException;
import com.cy.store.ex.UserServiceEx.InsertException;
import com.cy.store.mapper.AddressMapper;
import com.cy.store.service.IAddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class AddressServiceImpl implements IAddressService {

    @Value("${user.address.max-count}")
    private Integer maxCount;

    @Autowired
    private AddressMapper addressMapper;

    @Override
    public void addNewAddress(Integer uid, String username, Address address) {
        Integer count = addressMapper.countByUid(uid);
        if(count >= maxCount) {
            throw new AddressCountLimitException("收货地址数量超出限制");
        }

        address.setUid(uid);
        Integer isDefault = count == 0 ? 1 : 0;
        address.setIsDefault(isDefault);

        address.setCreateBy(username);
        address.setCreateTime(new Date());
        address.setModifyBy(username);
        address.setModifyTime(new Date());

        Integer rows = addressMapper.insert(address);
        if(rows != 1) {
            throw new InsertException("新增收货地址时出现了未知异常");
        }

    }
}
4. 测试

(暂略)

3. 控制层

1. 异常处理

在统一异常处理类中添加以下:

else if(e instanceof AddressCountLimitException) {
            e.getMessage();
        }
2. 请求设计
  • 请求路径:/address/add_new_address
  • 请求方式:POST
  • 请求参数:HttpSession session, Address address
  • 返回结果:JsonResult< Void >
3. 请求处理
package com.cy.store.controller;

import com.cy.store.entity.Address;
import com.cy.store.service.IAddressService;
import com.cy.store.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;

@RequestMapping("/address")
@RestController()
public class AddressController extends BaseController{

    @Autowired
    private IAddressService addressService;
    @RequestMapping("/add_new_address")
    public JsonResult<Void> addNewAddress(HttpSession session, Address address) {

        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        addressService.addNewAddress(uid, username, address);

        return new JsonResult<>(OK);
    }

}
4. 测试

先登录再输入以下地址回车:
springboot入门项目-新增收货地址_第1张图片

你可能感兴趣的:(java,springboot)