Spring Boot学习记录:Web开发模板

2019/08/28

Web开发模板

集合一些常用的功能

</br> </br> </br>

Mapper层

1.使用Mybatis

依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

启动类Application上添加 @MapperScan 注解

@MapperScan("com.hiki.mapper")
@SpringBootApplication
public class AlbumApplication {
    public static void main(String[] args) {
		SpringApplication.run(AlbumApplication.class, args);
	}
}

Mapper类

@Mapper
public interface UserMapper {
}

Insert

    @Insert("INSERT INTO users (id, mobile, created, updated) values ( #{id}, #{mobile}, #{name}, #{created}, #{updated})")
    @Options(useGeneratedKeys = true,keyProperty = "id", keyColumn = "id")
    Integer insertUser(UserEntity userEntity);

这里使用实体类作为参数</br> @Options 注解定义了自增id

Update

    @Update("UPDATE users SET name = #{name} , updated = #{updated} WHERE id = #{id}")
    Integer updateName(UserEntity userEntity);

Select

单个查询:

    @Select("SELECT id From users where mobile = #{mobile}")
    UserEntity queryUserByMobile(@Param("mobile") String mobile);

多个查询:

    @Select("SELECT iid, name FROM investors WHERE status = 1 ORDER BY iid ASC LIMIT #{limitStart}, #{limitEnd}")
    List<InvestorEntity> getInvestorList(int limitStart, int limitEnd);

2.使用JPA

实现JpaRepository

public interface UsersRepository extends JpaRepository<Users, Integer> {
    public List<Users> findAll();

    public Users findAllByUsername(String username);

    public Users findByUid(int uid);

    @Transactional
    public void deleteByUid(int uid);
}

Insert

使用接口的 .save()方法即可:

    Users user = new Users();
    user.setUsername(username);
    user.setName(name);
    user.setPassSalt(passSalt);
    user.setPassHash(passHash);
    user.setStatus(1);
    user.setCreated(time);
    user.setUpdated(time);

    try {
        usersRepository.save(user);
    }catch (Exception e){
        return false;
    }

Delete

再进行删除的时候,需要添加事务注解 @Transactional ,否则会报错:

    @Transactional
    public void deleteByUid(int uid);

Select

    //查全部
    List<AlbumCategory> findAll();
    
    //指定查询字段
    @Query(value = "select acid, banner from AlbumCategory")
    List<Object> findBannerList();
    
    //ORDER BY
    List<AlbumCategory> findAllByAidOrderByPriorityDesc(int aid);

Update

也是使用 .save() 方法,需要将id填进去

</br> </br> </br>

Service 层

实现类添加 @Service 注解即可

</br> </br> </br>

Json返回

Json包装类

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseBase {

    private Integer ret;
    private String msg;
    private Object data;
    
    public ResponseBase() {
        
    }
    
    public ResponseBase(Integer ret, String msg, Object data) {
        super();
        this.ret = ret;
        this.msg = msg;
        this.data = data;
    }
    

    public ResponseBase(Integer ret, String msg) {
        super();
        this.ret = ret;
        this.msg = msg;
    }

    @Override
    public String toString() {
        if(data == null ) {
            return "ResponseBase [ret=" + ret + ", msg=" + msg +  "]";
        } else {
            return "ResponseBase [ret=" + ret + ", msg=" + msg + ", data=" + data + "]";
        }
    }

}

</br> </br> </br>

Controller层

返回Json的接口

@RestController
@RequestMapping(value = "/hiki", produces="application/json;charset=UTF-8")
public class HikiController {

    @Autowired
    private HikiService hikiService;

    @RequestMapping(value = "/index")
    public String index() {
        return null;
    }

}

注意produces="application/json;charset=UTF-8"是可以省略的。

</br> </br> </br>

redis

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置

# Redis
spring.redis.database = 0
spring.redis.host = 
spring.redis.port = 6379
spring.redis.password = 

#最大可用连接数(默认为8,负数表示无限) 
spring.redis.jedis.pool.max-active = 100 

# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait = -1

# 最大空闲连接数(默认为8,负数表示无限)
spring.redis.jedis.pool.max-idle = 10

# 最小空闲连接数(默认为0,该值只有为正数才有作用) 
spring.redis.jedis.pool.min-idle = 1

# 连接超时时间(毫秒)
spring.redis.timeout = 500

使用RedisTemplate

@Autowired
private RedisTemplate redisTemplate;
    
    //写入
    if (!redisTemplate.hasKey("WEATHER_" + city)) {
        redisTemplate.opsForValue().set("WEATHER_" + city, WeatherUtil.getWeather(city), 3600000, TimeUnit.MILLISECONDS);
    }
    
    //获取(需要转换类型 get()方法获取的是Object类型)
    String value = redisTemplate.opsForValue().get("WEATHER_" + city).toString();

使用StringRedisTemplate

使用这个的好处是,拿到的value是String类型,不必再转换

获取:

String redisKey = "HIKI_NAME";
String cache = stringRedisTemplate.opsForValue().get(redisKey);

写入

@Autowired
private StringRedisTemplate stringRedisTemplate;

    //写入
    stringRedisTemplate.opsForValue().set(redisKey, theJson);
    
    //设置key失效时间
    int cacheDay = 86400;
    stringRedisTemplate.expire(redisKey, cacheDay, TimeUnit.SECONDS);

</br> </br> </br>

发起Http请求

使用RestTemplate发起请求

    import com.alibaba.fastjson.JSONObject;

    RestTemplate restTemplate = new RestTemplate();
    JSONObject resJson = restTemplate.getForEntity(url,JSONObject.class).getBody();
    String name = resJson.getString("name");
    String id = resJson.getString("id");

其中用的 JSONObject 依赖:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.57</version>
        <scope>compile</scope>
    </dependency>

</br> </br> </br>

环境打包

多环境配置

    <!-- 多环境配置 -->
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <!-- 默认情况下使用dev配置 -->
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
        </profile>

        <!-- 生产环境,打包命令"maven clean package -P prod" -->
        <profile>
            <id>prod</id>
            <!-- applicateion-dev.properties -->
            <properties>
                <profileActive>prod</profileActive>
            </properties>
        </profile>
    </profiles>

开启Maven指定环境配置

# 使用Maven时指定环境配置(dev/prod)
spring.profiles.active = @profileActive@

打包配置

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <!-- 项目打包完成的包中只包含当前环境文件 -->
                    <include>application.properties</include>
                    <include>application-${profileActive}.properties</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 配置修改文件保存后自动重启 -->
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

</br> </br> </br>

加密

sha256加密

    public static String getSHA256(String str){
        MessageDigest messageDigest;
        String encodestr = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes("UTF-8"));
            encodestr = byte2Hex(messageDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return encodestr;
    }

    /**
    * 将byte转为16进制
    * @param bytes
    * @return
    */
    private static String byte2Hex(byte[] bytes){
        StringBuffer stringBuffer = new StringBuffer();
        String temp = null;
        for (int i=0;i<bytes.length;i++){
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length()==1){
            //1得到一位的进行补0操作
            stringBuffer.append("0");
            }
        stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }

hash对称加密

依赖

<dependency>
    <groupId>org.hashids</groupId>
    <artifactId>hashids</artifactId>
    <version>1.0.3</version>
</dependency>

使用

    //加密
    Hashids hashids = new Hashids(salt, 15);
    String hashid = hashids.encodeHex(String.valueOf(id));
    
    //解密
    Hashids hashids = new Hashids(salt, 15);
    long id = Long.valueOf(hashids.decodeHex(encodeId));

MD5加密

使用封装类 DigestUtils 实现

import org.springframework.util.DigestUtils;

    DigestUtils.md5DigestAsHex("1".getBytes());

源码实现其实是使用 MessageDigest ,所以可以使用MessageDigest直接实现

使用MessageDigest加密

public static String encode(String str){
        try {
        MessageDigest digest = MessageDigest.getInstance("md5");
        byte[] buffer = digest.digest(str.getBytes());

        StringBuffer sb = new StringBuffer();
        for (byte b : buffer) {
            int a = b & 0xff;
            // Log.d(TAG, "" + a);
            String hex = Integer.toHexString(a);

            if (hex.length() == 1) {
                hex = 0 + hex;
            }
            sb.append(hex);
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
    }

拦截器

1.实现 HandlerInterceptor

这里用自己写过的一个权限拦截做例子:

public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行之前执行
     *
     * @param request
     * @param response
     * @param handler
     * @return
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        Object uid = request.getSession().getAttribute("uid");
        //没有登录,返回错误页面
        if( uid == null || (int)uid < 1 ){
            try {
                response.sendRedirect("/auth_error");     //没有uid信息的话进行路由重定向
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

    }
}

2.配置拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 自定义拦截规则
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns - 用于添加拦截规则
        // excludePathPatterns - 用户排除拦截

        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/admin/**");

        //      .excludePathPatterns("/index.html", "/", "/user/login");
    }
}





github: https://github.com/Hikiy
作者:Hiki
创建日期:2019.8.28
更新日期:2019.8.29

(转载本站文章请注明作者和出处 Hiki

Post Directory