Spring boot 、mybatis、swagger、c3p0、redis 和mongodb 整合
2018-04-03 13:23 甘雨路 阅读(767) 评论(0) 编辑 收藏 举报文件路径:
添加依赖:
<?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>lf.wonder</groupId> <artifactId>xweb</artifactId> <version>1.0.0</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--spring boot 的依赖 START--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 移除嵌入式tomcat插件 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!--spring boot 的依赖 END--> <!--mybatis 的依赖 START--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!--mybatis 的依赖 END--> <!--mysql 的依赖 START--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mysql 的依赖 END--> <!--jsp 的依赖 START--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--jsp 的依赖 END--> <!--swagger 的依赖 START--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.2.2</version> </dependency> <!--swagger 的依赖 END--> <!--c3p0 的依赖 START--> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!--c3p0 的依赖 END--> <!--redis 的依赖 START--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--redis sessions 共享 的依赖--> <!-- <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>2.0.2.RELEASE</version> </dependency>--> <!--redis 的依赖 END--> <!--mongodb 的依赖 START--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>1.1.0.RELEASE</version> </dependency> <!--mongodb 的依赖 END--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>fly</finalName> <!--配置文件读取路径--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
添加application.properties文件
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
#swagger
modulePath=/lf
添加c3p0.properties文件
# c3p0 配置 c3p0.jdbcUrl=jdbc:mysql://localhost:3306/bsdmxm?useUnicode=true&characterEncoding=utf8 c3p0.user=root c3p0.password=mysql c3p0.driverClass=com.mysql.jdbc.Driver c3p0.minPoolSize=2 c3p0.maxPoolSize=10 c3p0.maxIdleTime=1800000 c3p0.acquireIncrement=3 c3p0.maxStatements=1000 c3p0.initialPoolSize=3 c3p0.idleConnectionTestPeriod=60 c3p0.acquireRetryAttempts=30 c3p0.acquireRetryDelay=1000 c3p0.breakAfterAcquireFailure=false c3p0.testConnectionOnCheckout=false
添加mongoDB.properties文件
#mongodb://用户名:密码@ip:端口/数据库
spring.data.mongodb.uri=mongodb://lf:123456@127.0.0.1:27017/wonder
添加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
#最小空闲连接数, 默认0
redis.pool.minIdle=10
#获取连接时的最大等待毫秒数
redis.pool.maxWaitMillis=300000
#在获取连接的时候检查有效性, 默认false
redis.pool.testOnBorrow=true
#在return给pool时,是否提前进行validate操作
redis.pool.testOnReturn=true
#在空闲时检查有效性, 默认false
redis.pool.testWhileIdle=true
#IP
redis.ip=localhost
#Port
redis.port=6379
#密码(默认为空)
redis.pass=
添加mybatis-donfig.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="Integer" type="java.lang.Integer" /> <typeAlias alias="Long" type="java.lang.Long" /> <typeAlias alias="HashMap" type="java.util.HashMap" /> <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" /> <typeAlias alias="ArrayList" type="java.util.ArrayList" /> <typeAlias alias="LinkedList" type="java.util.LinkedList" /> </typeAliases> </configuration>
添加applicationContext-jedis.xml配置文件(redis配置)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"> <!-- redis配置开始 --> <!-- 配置 JedisPoolConfig 实例 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.pool.maxTotal}" /> <property name="maxIdle" value="${redis.pool.maxIdle}" /> <property name="minIdle" value="${redis.pool.minIdle}" /> <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}" /> <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" /> <property name="testOnReturn" value="${redis.pool.testOnReturn}" /> <property name="testWhileIdle" value="${redis.pool.testWhileIdle}" /> </bean> <!-- 配置JedisConnectionFactory --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" > <property name="poolConfig" ref="poolConfig" /> <property name="port" value="${redis.port}" /> <property name="hostName" value="${redis.ip}" /> <property name="password" value="${redis.pass}" /> <property name="timeout" value="5000" ></property> </bean > <!-- 配置RedisTemplate --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" > <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer" > <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer" > <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> </bean > <!-- 配置RedisUtil bean --> <bean id="redisUtil" class="lf.utils.redis.RedisUtil" > <property name="redisTemplate"><ref bean= "redisTemplate"/></property> <property name="redisIp" value="${redis.ip}" /> </bean> </beans>
添加jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>主页</title> </head> <body> <h1>欢迎登陆甘雨路主页</h1> <div>登陆时间:${time}</div> <div>登陆人:${loginName}</div> </body> </html>
添加实体类
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; } }
package lf.entity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel(description = "用户实体(mongodb)") public class MDBUser { @ApiModelProperty("主键") private String id; @ApiModelProperty("用户名") private String username; @ApiModelProperty("密码") private String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
添加mapper的xml层
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="lf.mapper.BsdUserMapper"> <resultMap id="BsdUserResultMap" type="lf.entity.BsdUser"> <id column="id" jdbcType="BIGINT" property="id" /> <result column="org_id" jdbcType="BIGINT" property="orgId" /> <result column="user_type" jdbcType="INTEGER" property="userType" /> <result column="code" jdbcType="VARCHAR" property="code" /> <result column="login_name" jdbcType="VARCHAR" property="loginName" /> <result column="phone" jdbcType="VARCHAR" property="phone" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="short_name" property="shortName" jdbcType="VARCHAR" /> <result column="register_attachment_url" property="registerAttachmentUrl" jdbcType="VARCHAR" /> <result column="password" jdbcType="VARCHAR" property="password" /> <result column="contact_user_name" jdbcType="VARCHAR" property="contactUserName" /> <result column="address" jdbcType="VARCHAR" property="address" /> <result column="longitude" jdbcType="DECIMAL" property="longitude" /> <result column="latitude" jdbcType="DECIMAL" property="latitude" /> <result column="level" jdbcType="INTEGER" property="level" /> <result column="img_url" jdbcType="VARCHAR" property="imgUrl" /> <result column="state" jdbcType="INTEGER" property="state" /> <result column="bank_card" jdbcType="VARCHAR" property="bankCard" /> <result column="total_payment_amount" jdbcType="DECIMAL" property="totalPaymentAmount" /> <result column="commission" jdbcType="DECIMAL" property="commission" /> <result column="freight" jdbcType="DECIMAL" property="freight" /> <result column="total_points" jdbcType="BIGINT" property="totalPoints" /> <result column="superior_id" jdbcType="BIGINT" property="superiorId" /> <result column="created_by" jdbcType="BIGINT" property="createdBy" /> <result column="created_date" jdbcType="TIMESTAMP" property="createdDate" /> <result column="last_updated_by" jdbcType="BIGINT" property="lastUpdatedBy" /> <result column="last_updated_date" jdbcType="TIMESTAMP" property="lastUpdatedDate" /> <result column="remove_flag" jdbcType="INTEGER" property="removeFlag" /> <result column="deposit_paid" jdbcType="DECIMAL" property="depositPaid" /> <result column="pay_pass_word" jdbcType="VARCHAR" property="payPassWord" /> <result column="balance" jdbcType="DECIMAL" property="balance" /> <result column="cash_roll" jdbcType="DECIMAL" property="cashRoll" /> </resultMap> <sql id="BsdUser_Column_List"> 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 </sql> <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BsdUserResultMap"> select <include refid="BsdUser_Column_List" /> from bsd_user where id = #{id} </select> <select id="getUserById" parameterType="java.lang.Long" resultMap="BsdUserResultMap"> select <include refid="BsdUser_Column_List" /> from bsd_user where id = #{id} </select> </mapper>
添加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); }
添加service服务层接口
package lf.service; import lf.entity.BsdUser; public interface BsdUserSerive { /** * 根据用户id获取用户 * @param id * @return */ public BsdUser getUserById(Long id); }
package lf.service; import io.swagger.annotations.ApiModel; import lf.entity.BsdUser; import lf.entity.MDBUser; @ApiModel("操作MongoDB(User)的接口类") public interface MDBUserService { public void saveUser(MDBUser user); public MDBUser findUserByUserName(String userName); public int updateUser(MDBUser user); public void deleteUserById(Long id); }
天机service服务层的实现类
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; @Service public class BsdUserSeriveImpl implements BsdUserSerive{ @Autowired private BsdUserMapper userMapper; /** * 根据用户id获取用户信息 * @param id * @return */ @Override public BsdUser getUserById(Long id) { return userMapper.getUserById(id); } }
package lf.service.impl; import com.mongodb.WriteResult; import io.swagger.annotations.ApiModel; import lf.entity.BsdUser; import lf.entity.MDBUser; import lf.service.MDBUserService; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import javax.annotation.Resource; @ApiModel("操作MongoDB(User)的实现类") @Component public class MDBUserServiceImpl implements MDBUserService{ @Resource private MongoTemplate template; /** * 创建对象 * @param user */ @Override public void saveUser(MDBUser user) { template.save(user); } /** * 根据用户名查询对象 * @param userName * @return */ @Override public MDBUser findUserByUserName(String userName) { Query query=new Query(Criteria.where("username").is(userName)); MDBUser user = template.findOne(query , MDBUser.class); return user; } /** * 更新对象 * @param user */ @Override public int updateUser(MDBUser user) { Query query=new Query(Criteria.where("id").is(user.getId())); Update update= new Update().set("userName", user.getUsername()).set("passWord", user.getPassword()); //更新查询返回结果集的第一条 WriteResult result =template.updateFirst(query,update,MDBUser.class); //更新查询返回结果集的所有 // mongoTemplate.updateMulti(query,update,UserEntity.class); if(result!=null) return result.getN(); else return 0; } /** * 删除对象 * @param id */ @Override public void deleteUserById(Long id) { Query query=new Query(Criteria.where("id").is(id)); template.remove(query,BsdUser.class); } }
添加controller控制层
package lf.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiParam; import lf.entity.BsdUser; import lf.entity.MDBUser; import lf.service.MDBUserService; import lf.utils.CommonDTO; import lf.utils.CommonUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @Api(description = "用户控制器(mongodb)")//swagger注解用于类 @Controller // 控制器注解 @RequestMapping(value="${modulePath}/mongo/user") public class MDBUserController { @Resource private MDBUserService userService; @ResponseBody @RequestMapping(value = "/save",method = RequestMethod.POST) public CommonDTO<MDBUser> saveUser(@RequestBody @ApiParam("用户") MDBUser user){ CommonDTO<MDBUser> detailDTO = new CommonDTO<>(0,1); try { userService.saveUser(user); detailDTO.setData(user); } catch (Exception e) { e.printStackTrace(); detailDTO.setStatus(1); detailDTO.setCode(400); detailDTO.setMsg("获取用户信息异常:"+e.getMessage()); } return detailDTO; } @ResponseBody @RequestMapping(value = "/find",method = RequestMethod.GET) public CommonDTO<MDBUser> getUser(@RequestParam @ApiParam("用户名") String userName){ CommonDTO<MDBUser> detailDTO = new CommonDTO<>(0,1); try { MDBUser user = userService.findUserByUserName(userName); detailDTO.setData(user); } catch (Exception e) { e.printStackTrace(); detailDTO.setStatus(1); detailDTO.setCode(400); detailDTO.setMsg("获取用户信息异常:"+e.getMessage()); } return detailDTO; } }
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","甘雨路"); //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 CommonDTO<BsdUser> getUserbyId(@RequestParam @ApiParam("用户id") Long id){ CommonDTO<BsdUser> 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.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 RedisTemplate<Serializable, Object> redisTemplate; 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<Serializable> 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<Serializable, Object> 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<Serializable, Object> 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<Serializable, Object> 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<Serializable, Object> 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<String>() { @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<Boolean>() { @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<String>() { @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<Serializable, Object, Object> 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<Serializable, Object, Object> operations = redisTemplate.opsForHash(); return operations.get(redisKey, mapKey); } public Object getAllFromMap(final String redisKey) { HashOperations<Serializable, Object, Object> operations = redisTemplate.opsForHash(); return operations.values(redisKey); } public void removeFromMap(final String redisKey, Object obj) { HashOperations<Serializable, Object, Object> operations = redisTemplate.opsForHash(); operations.delete(redisKey, obj); } public boolean setList(final String key, Object value) { boolean result = false; try { ListOperations<Serializable, Object> listOperations = redisTemplate.opsForList(); listOperations.leftPush(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public Object getList(final String key) { ListOperations<Serializable, Object> 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 <T> */ @ApiModel(description = "详情DTO") public class CommonDTO<T>{ @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<String,Object> 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<String, Object> getDataMap() { return DataMap; } public void setDataMap(Map<String, Object> 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"; }
添加相关框架配置启动类
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; @Configuration public 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 @EnableSwagger2 public 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; } }
添加SpringBoot启动类
package lf; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.PropertySource; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; @SpringBootApplication @EnableAutoConfiguration @MapperScan("lf.mapper") // mapper层的路径 @PropertySource({"classpath:mongoDB.properties", "classpath:c3p0.properties", "classpath:mybatis.properties", "classpath:redis.properties"})// 读取.properties 文件路径 @ImportResource({"classpath:config/applicationContext-jedis.xml"})// 读取文件路径 public class SkyRainbowApplication extends SpringBootServletInitializer { public static void main(String[] args) { /** * Spring boot 程序入口 */ SpringApplication.run(SkyRainbowApplication.class,args); } /** * 需要把web项目打成war包部署到外部tomcat运行时需要改变启动方式 */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SkyRainbowApplication.class); } public void addResourceHandlers(ResourceHandlerRegistry registry) { //配置模板资源路径 registry.addResourceHandler("/**").addResourceLocations("classpath:/"); registry.addResourceHandler("/fly").addResourceLocations("classpath:/fly"); } public SkyRainbowApplication(){ super(); setRegisterErrorPageFilter(false); } }