文件路径
添加依赖
4.0.0 wonder skyRainbow 1.0-SNAPSHOT war UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 1.1.1 mysql mysql-connector-java org.apache.tomcat.embed tomcat-embed-jasper javax.servlet jstl io.springfox springfox-swagger2 2.2.2 io.springfox springfox-swagger-ui 2.2.2 c3p0 c3p0 0.9.1.2 org.springframework.boot spring-boot-starter-redis 1.4.7.RELEASE src/main/java **/*.xml **/*.properties org.springframework.boot spring-boot-maven-plugin
添加c3p0数据源文件和swagger的启动文件
package lf.config;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configurationpublic class DatasourceConfiguration { @Bean(name = "dataSource") @Qualifier(value = "dataSource") @Primary @ConfigurationProperties(prefix = "c3p0") public DataSource dataSource() { return DataSourceBuilder.create().type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build(); }}
package lf.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.request.async.DeferredResult;import springfox.documentation.service.ApiInfo;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;import static com.google.common.base.Predicates.or;import static springfox.documentation.builders.PathSelectors.regex;@Configuration@EnableSwagger2public class SwaggerConfig { @Bean public Docket api_lf(){ return new Docket(DocumentationType.SWAGGER_2) .groupName("api_lf") .genericModelSubstitutes(DeferredResult.class) .useDefaultResponseMessages(false) .forCodeGeneration(false) .pathMapping("/") .select() .paths(or(regex("/lf/.*"))) .build() .apiInfo(apiInfo()); } /** * 构建api文档详细信息 */ private ApiInfo apiInfo() { ApiInfo apiInfo = new ApiInfo( "甘雨路 API",// 标题 "API 描述说明",//描述 "1.0",//版本 "NO terms of service", "lf@qq.com",// 创建人 "The Apache License, Version 2.0", "http://www.apache.org/licenses/LICENSE-2.0.html" ); return apiInfo; }}
添加控制层
package lf.controller;import io.swagger.annotations.Api;import io.swagger.annotations.ApiParam;import lf.entity.BsdUser;import lf.service.BsdUserSerive;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import javax.annotation.Resource;import java.util.Date;@Controller@RequestMapping(value="${modulePath}/page")@Api(description = "页面跳转控制器")public class PageController { @Resource private BsdUserSerive userSerive; /** * 进入公司主页 */ @RequestMapping(value = "/company",method = RequestMethod.GET) public String gotoCompanyPage(Model model,@RequestParam @ApiParam("用户id") Long id){ BsdUser user = userSerive.getUserById(id); model.addAttribute("time",new Date()); model.addAttribute("loginName",user.getName()); return "main"; }}
package lf.controller;import io.swagger.annotations.*;import lf.entity.BsdUser;import lf.service.BsdUserSerive;import lf.utils.CommonDTO;import lf.utils.CommonUtil;import lf.utils.redis.RedisUtil;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;@Api(description = "用户控制器")//swagger注解用于类@Controller // 控制器注解@RequestMapping(value="${modulePath}/user")public class UserController { @Resource private RedisUtil redisUtil; @Resource private BsdUserSerive userSerive; @ResponseBody @RequestMapping(value = "/info",method = RequestMethod.GET) public CommonDTOgetUserbyId(@RequestParam @ApiParam("用户id") Long id){ CommonDTO detailDTO = new CommonDTO<>(0,1); try { BsdUser user = null; // 从缓存中获取数据 user = (BsdUser)redisUtil.get(CommonUtil.USER_INFO_KEY + id); if (user == null){ user = userSerive.getUserById(id); // 将数据存入缓存 redisUtil.set(CommonUtil.USER_INFO_KEY + id,user); System.out.println("从数据库获取的数据"); }else { System.out.println("从缓存中获取数据"); } //BsdUser user = userSerive.getUserById(id); detailDTO.setData(user); } catch (Exception e) { e.printStackTrace(); detailDTO.setStatus(1); detailDTO.setCode(400); detailDTO.setMsg("获取用户信息异常:"+e.getMessage()); } return detailDTO; }}
添加实体类
package lf.entity;import com.fasterxml.jackson.annotation.JsonFormat;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import java.io.Serializable;import java.math.BigDecimal;import java.util.Date;@ApiModel(description = "用户实体")public class BsdUser implements Serializable { @ApiModelProperty("主键") private Long id; @ApiModelProperty("组织id") private Long orgId; @ApiModelProperty("用户类型(0,品牌商1,服务商2,零售商,3客服)") private Integer userType; @ApiModelProperty("登录名") private String loginName; @ApiModelProperty("电话") private String phone; @ApiModelProperty("姓名") private String name; @ApiModelProperty("简称") private String shortName; @ApiModelProperty("密码") private String password; @ApiModelProperty("联系人") private String contactUserName; @ApiModelProperty("地址") private String address; @ApiModelProperty("经度") private BigDecimal longitude; @ApiModelProperty("纬度") private BigDecimal latitude; @ApiModelProperty("级别(0,普通会员,1,一级会员,2,二级会员,3三级会员,4,四级会员,5,五级会员)") private Integer level; @ApiModelProperty("状态(0,无效,1有效,2未审核,3审核未通过)") private Integer state; @ApiModelProperty("银行卡") private String bankCard; @ApiModelProperty("总积分") private Long totalPoints; @ApiModelProperty("上级组织id") private Long superiorId; @ApiModelProperty("创建人id") private Long createdBy; @ApiModelProperty("最后更新人") private Long lastUpdatedBy; @ApiModelProperty("创建日期") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date createdDate; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @ApiModelProperty("最后更新日期") private Date lastUpdatedDate; @ApiModelProperty("软删除标志") private Integer removeFlag; @ApiModelProperty("图片地址") private String imgUrl; @ApiModelProperty("消费总金额") private BigDecimal totalPaymentAmount; @ApiModelProperty("佣金") private BigDecimal commission; @ApiModelProperty("运费") private BigDecimal freight; @ApiModelProperty("编号") private String code; @ApiModelProperty("已经支付定金") private Long depositPaid; @ApiModelProperty("注册信息附件信息传") private String registerAttachmentUrl; @ApiModelProperty("支付密码") private String payPassWord; @ApiModelProperty("钱包余额") private BigDecimal balance; @ApiModelProperty("现金卷余额") private BigDecimal cashRoll; private static final long serialVersionUID = 1L; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getOrgId() { return orgId; } public void setOrgId(Long orgId) { this.orgId = orgId; } public Integer getUserType() { return userType; } public void setUserType(Integer userType) { this.userType = userType; } public String getCode() { return code; } public void setCode(String code) { this.code = code == null ? null : code.trim(); } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName == null ? null : loginName.trim(); } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone == null ? null : phone.trim(); } public String getShortName() { return shortName; } public void setShortName(String shortName) { this.shortName = shortName == null ? null : shortName.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getPassword() { return password; } public void setPassword(String password) { this.password = password == null ? null : password.trim(); } public String getContactUserName() { return contactUserName; } public void setContactUserName(String contactUserName) { this.contactUserName = contactUserName == null ? null : contactUserName.trim(); } public String getAddress() { return address; } public void setAddress(String address) { this.address = address == null ? null : address.trim(); } public BigDecimal getLongitude() { return longitude; } public void setLongitude(BigDecimal longitude) { this.longitude = longitude; } public String getRegisterAttachmentUrl() { return registerAttachmentUrl; } public void setRegisterAttachmentUrl(String registerAttachmentUrl) { this.registerAttachmentUrl = registerAttachmentUrl == null ? null : registerAttachmentUrl.trim(); } public BigDecimal getLatitude() { return latitude; } public void setLatitude(BigDecimal latitude) { this.latitude = latitude; } public Integer getLevel() { return level; } public void setLevel(Integer level) { this.level = level; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl == null ? null : imgUrl.trim(); } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public String getBankCard() { return bankCard; } public void setBankCard(String bankCard) { this.bankCard = bankCard == null ? null : bankCard.trim(); } public BigDecimal getTotalPaymentAmount() { return totalPaymentAmount; } public void setTotalPaymentAmount(BigDecimal totalPaymentAmount) { this.totalPaymentAmount = totalPaymentAmount; } public Long getTotalPoints() { return totalPoints; } public void setTotalPoints(Long totalPoints) { this.totalPoints = totalPoints; } public Long getSuperiorId() { return superiorId; } public void setSuperiorId(Long superiorId) { this.superiorId = superiorId; } public BigDecimal getCommission() { return commission; } public void setCommission(BigDecimal commission) { this.commission = commission; } public BigDecimal getFreight() { return freight; } public void setFreight(BigDecimal freight) { this.freight = freight; } public Long getDepositPaid() { return depositPaid; } public void setDepositPaid(Long depositPaid) { this.depositPaid = depositPaid; } public String getPayPassWord() { return payPassWord; } public void setPayPassWord(String payPassWord) { this.payPassWord = payPassWord == null ? null : payPassWord.trim(); } public BigDecimal getBalance() { return balance; } public void setBalance(BigDecimal balance) { this.balance = balance; } public BigDecimal getCashRoll() { return cashRoll; } public void setCashRoll(BigDecimal cashRoll) { this.cashRoll = cashRoll; } public Long getCreatedBy() { return createdBy; } public void setCreatedBy(Long createdBy) { this.createdBy = createdBy; } public Date getCreatedDate() { return createdDate; } public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; } public Long getLastUpdatedBy() { return lastUpdatedBy; } public void setLastUpdatedBy(Long lastUpdatedBy) { this.lastUpdatedBy = lastUpdatedBy; } public Date getLastUpdatedDate() { return lastUpdatedDate; } public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; } public Integer getRemoveFlag() { return removeFlag; } public void setRemoveFlag(Integer removeFlag) { this.removeFlag = removeFlag; }}
添加mapper层
package lf.mapper;import lf.entity.BsdUser;import org.mapstruct.Mapper;import java.math.BigDecimal;import java.util.List;import java.util.Map;public interface BsdUserMapper{ /** * 根据用户id获取用户信息 * @param id * @return */ public BsdUser getUserById(Long id);}
添加mapper的xml文件
id, org_id, user_type, code, login_name, phone, name,short_name,register_attachment_url,password, contact_user_name, address, longitude, latitude, level, img_url, state, bank_card, total_payment_amount,commission,freight, total_points, superior_id, created_by, created_date, last_updated_by, last_updated_date, remove_flag, deposit_paid, pay_pass_word, balance, cash_roll
添加service层和实现类
package lf.service;import lf.entity.BsdUser;public interface BsdUserSerive { /** * 根据用户id获取用户 * @param id * @return */ public BsdUser getUserById(Long id);}
package lf.service.impl;import lf.entity.BsdUser;import lf.mapper.BsdUserMapper;import lf.service.BsdUserSerive;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Servicepublic class BsdUserSeriveImpl implements BsdUserSerive{ @Autowired private BsdUserMapper userMapper; /** * 根据用户id获取用户信息 * @param id * @return */ @Override public BsdUser getUserById(Long id) { return userMapper.getUserById(id); }}
添加工具类
package lf.utils.redis;import org.apache.log4j.Logger;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.*;import java.io.Serializable;import java.util.Set;import java.util.concurrent.TimeUnit;/** * redis cache 工具类 * */public final class RedisUtil { private Logger logger = Logger.getLogger(RedisUtil.class); private RedisTemplateredisTemplate; private String redisIp; /** * 批量删除对应的value * * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量删除key * * @param pattern */ public void removePattern(final String pattern) { Set keys = redisTemplate.keys(pattern); if (keys.size() > 0) redisTemplate.delete(keys); } /** * 删除对应的value * * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 读取缓存 * * @param key * @return */ public Object get(final String key) {// LogUtil.error("-----------------------------redisIp"+redisIp);// System.err.println("-----------------------------redisIp"+redisIp); Object result = null; ValueOperations operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) {// LogUtil.error("-----------------------------redisIp"+redisIp);// System.err.println("-----------------------------redisIp" + redisIp); boolean result = false; try { ValueOperations operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime) {// LogUtil.error("-----------------------------redisIp"+redisIp);// System.err.println("-----------------------------redisIp"+redisIp); boolean result = false; try { ValueOperations operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public void setRedisTemplate(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } public String getRedisIp() { return redisIp; } public void setRedisIp(String redisIp) { this.redisIp = redisIp; } /** * 设置新值,同时返回旧值 * @param lockKey * @param stringOfLockExpireTime * @return */ public String getSet(final String lockKey, final String stringOfLockExpireTime) { String result = redisTemplate.execute(new RedisCallback () { @Override public String doInRedis(RedisConnection redisConnection) throws DataAccessException { byte[] bytes = redisConnection.getSet(lockKey.getBytes(), stringOfLockExpireTime.getBytes()); if(bytes != null) { return new String(bytes); } return null; } }); return result; } /** * 如果不存在key则插入 * @param lockKey * @param stringOfLockExpireTime * @return true 插入成功, false 插入失败 */ public boolean setnx(final String lockKey, final String stringOfLockExpireTime) { return redisTemplate.execute(new RedisCallback () { @Override public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException { return redisConnection.setNX(lockKey.getBytes(), stringOfLockExpireTime.getBytes()); } }); } /** * setnx 和 getSet方式插入的数据,调用此方法获取 * @param key * @return */ public String getInExecute(final String key) { String result = redisTemplate.execute(new RedisCallback () { @Override public String doInRedis(RedisConnection redisConnection) throws DataAccessException { byte[] bytes = redisConnection.get(key.getBytes()); if (bytes == null) { return null; } else { return new String(bytes); } } }); return result; } /** * 将缓存保存在map集合中 * @param redisKey * @param mapKey * @param mapValue * @return */ public boolean putInMap(final String redisKey, String mapKey, Object mapValue) { boolean result = false; try { HashOperations operations = redisTemplate.opsForHash(); operations.put(redisKey, mapKey, mapValue); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public Object getOneFromMap(final String redisKey, String mapKey) { HashOperations operations = redisTemplate.opsForHash(); return operations.get(redisKey, mapKey); } public Object getAllFromMap(final String redisKey) { HashOperations operations = redisTemplate.opsForHash(); return operations.values(redisKey); } public void removeFromMap(final String redisKey, Object obj) { HashOperations operations = redisTemplate.opsForHash(); operations.delete(redisKey, obj); } public boolean setList(final String key, Object value) { boolean result = false; try { ListOperations listOperations = redisTemplate.opsForList(); listOperations.leftPush(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public Object getList(final String key) { ListOperations listOperations = redisTemplate.opsForList(); return listOperations.range(key,0,listOperations.size(key)); }}
package lf.utils;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import java.util.Map;/** * 详情Dto * @param*/@ApiModel(description = "详情DTO")public class CommonDTO { @ApiModelProperty(value = "提示信息") private String msg; @ApiModelProperty(value = "0 代表无错误 1代表有错误") private Integer status; @ApiModelProperty(value = "总记录") private Integer total; @ApiModelProperty(value = "业务数据") private T data; @ApiModelProperty(value = "200 代表无错误 400代表有错误--->加入这个字段是原生需求") private Integer code; @ApiModelProperty(value = "当前页码") private Integer pageNo = 1; @ApiModelProperty(value = "当前页码,默认:10") private Integer pageSize = Integer.valueOf(10); // 页面大小,设置为“-1”表示不进行分页(分页无效) @ApiModelProperty(value = "总记录数") private long totalSize;// 总记录数,设置为“-1”表示不查询总数 private Map DataMap; public CommonDTO(Integer status) { if (status == 0){ this.status = status; this.code = 200; this.msg = "操作成功"; } this.data = null; } public CommonDTO(Integer status, Integer total) { if (status == 0){ this.status = status; this.code = 200; this.msg = "操作成功"; } this.data = null; this.total = total; } public Map getDataMap() { return DataMap; } public void setDataMap(Map dataMap) { DataMap = dataMap; } public Integer getCode() { return code;} public void setCode(Integer code) { this.code = code;} public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } public T getData() { return data; } public void setData(T data) { this.data = data; } public Integer getPageNo() { return (pageNo!=null&&pageNo>0)?pageNo:-1; } public void setPageNo(Integer pageNo) { this.pageNo = pageNo; } public Integer getPageSize() { return (pageSize!=null&&pageSize>0)?pageSize:10; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } /** * 获取设置总数 * @return */ public long getTotalSize() { return totalSize; } /** * 设置数据总数 * @param count */ public void setTotalSize(long totalSize) { this.totalSize = totalSize; if (pageSize >= totalSize){ pageNo = 1; } } @Override public String toString() { return "CommonDTO{" + "msg='" + msg + '\'' + ", status=" + status + ", total=" + total + ", data=" + data + '}'; }}
package lf.utils;import io.swagger.annotations.Api;@Api(value = "常量类")public class CommonUtil { public static final String USER_INFO_KEY = "USER_INFO_KEY";}
添加是springboot启动文件
package lf;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ImportResource;import org.springframework.context.annotation.PropertySource;@SpringBootApplication@MapperScan("lf.mapper") // mapper层的路径@PropertySource({"classpath:mybatis.properties", "classpath:c3p0.properties", "classpath:redis.properties"})// 读取.properties 文件路径@ImportResource({"classpath:config/applicationContext-jedis.xml"})// 读取文件路径public class SkyRainbowApplication { public static void main(String[] args) { /** * Spring boot 程序入口 */ SpringApplication.run(SkyRainbowApplication.class,args); }}
添加jsp 文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>主页 欢迎登陆甘雨路主页
登陆时间:${time}登陆人:${loginName}
添加redis配置文件和mybatis配置文件
添加application.properties 文件
# 页面默认前缀目录spring.mvc.view.prefix=/WEB-INF/jsp/# 响应页面默认后缀spring.mvc.view.suffix=.jsp#swaggermodulePath=/lf
添加c3p0.properties文件
# c3p0 配置c3p0.jdbcUrl=jdbc:mysql://localhost:3306/bsdmxm?useUnicode=true&characterEncoding=utf8c3p0.user=lfc3p0.password=lfc3p0.driverClass=com.mysql.jdbc.Driverc3p0.minPoolSize=2c3p0.maxPoolSize=10c3p0.maxIdleTime=1800000c3p0.acquireIncrement=3c3p0.maxStatements=1000c3p0.initialPoolSize=3c3p0.idleConnectionTestPeriod=60c3p0.acquireRetryAttempts=30c3p0.acquireRetryDelay=1000c3p0.breakAfterAcquireFailure=falsec3p0.testConnectionOnCheckout=false
添加mybatis.properties文件
#mybatis 配置# mybatis xml配置文件的路径mybatis.config-locations=classpath:config/mybatis-config.xml# mybatis xml文件的路径mybatis.mapper-locations=classpath:lf/mapper/xml/*.xml# 实体类的路径mybatis.type-aliases-package=lf.entity
添加redis.properties文件
#Redis 配置#最大连接数redis.pool.maxTotal=1024#最大空闲连接数redis.pool.maxIdle=100#最小空闲连接数, 默认0redis.pool.minIdle=10#获取连接时的最大等待毫秒数redis.pool.maxWaitMillis=3000#在获取连接的时候检查有效性, 默认falseredis.pool.testOnBorrow=true#在return给pool时,是否提前进行validate操作redis.pool.testOnReturn=true#在空闲时检查有效性, 默认falseredis.pool.testWhileIdle=true#IPredis.ip=localhost#Portredis.port=6379#密码(默认为空)redis.pass=
启动程序,在浏览器上输入 http://localhost:8080/lf/user/info?id=51,控制台打印如下
再次刷新页面,数据直接从缓存中获取,控制台打印如下