spring-项目结构

─src
├─main
│  ├─java
│  │  └─com.swy.demo
│  │    │
│  │    └─controller
│  │        SubjectsController
|  |    └─dao
|  |        OptionsMapper
|  |        SubjectsMapper
|  |    └─pojo
|  |        Options
|  |        Subjects
|  |    └─service
|  |        OptionsService
|  |        SubjectsService
|  |        └─impl
|  |            OptionsServiceImpl
|  |            SubjectsServiceImpl
|  |    └─DemoApplication
│  └─resources![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9waWNzLmltYWdlcy5hYy5jbi9pbWFnZS81ZWNjZDg2OWQwOTIyLmh0bWw?x-oss-process=image/format,png)
│      │
│      ├─mappers
│      │      SubjectsMapper.xml
│      │      OptionsMapper.xml
│      │      WechatUserOpenidMapper.xml
│      │
│      ├─static
│      └─templates
└─test└─java└─comswy.demo└─BajinsApiApplicationTests.java

spring-boot修改application.yml配置

yml配置

YML JSON的超集,简洁而强大,是种专门用来书写配置文件的语言,可以替代application properties。在创建 Spring Boot项目时,引入的 pring-boot-starter-web依赖间接地引入了 snakeyaml依赖, snakeyaml会实现对 YML 配置的解析。

Spring Boot 项目中的application.roperties配置文件一共可以出现在如下四个位置

  • 项目根目录下的 config 文件夫中
  • 项目根目录下
  • resource目录下的 config 文件夫中
  • resource目录下

注意事项:

  • yml 语法(大小写敏感)

在resource目录下添加application.yml并注释在application.properties中的端口设置

server :
port: 8090

spring-boot整合 redies

  1. 添加Maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.application.yml中加入redis相关配置

redis:host: 192.168.79.145    //连接地址port: 6379              //连接端口号password: root          //连接密码database: 0             //Redis数据库索引---默认为0pool.max-active:200    //连接池最大连接数pool.max-wait:-1       //连接池最大阻塞等待时间---使用负值表示没有限制pool.max-idle:10        //连接池中的最大空闲连接pool.min-idle:0        //连接池中的最小空闲连接  timeout:1000           //连接超时时间(毫秒)
  1. 写一个redis配置类
package com.zxy.demo.redis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/*** Redis工具类* @author ZENG.XIAO.YAN* @date   2018年6月7日*/
@Component
public final class RedisUtil {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// =============================common============================/*** 指定缓存失效时间* @param key 键* @param time 时间(秒)* @return*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间* @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在* @param key 键* @return true 存在 false不存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除缓存* @param key 可以传一个值 或多个*/@SuppressWarnings("unchecked")public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {redisTemplate.delete(key[0]);} else {redisTemplate.delete(CollectionUtils.arrayToList(key));}}}// ============================String=============================/*** 普通缓存获取* @param key 键* @return 值*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 普通缓存放入* @param key 键* @param value 值* @return true成功 false失败*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}    }/*** 普通缓存放入并设置时间* @param key 键* @param value 值* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期* @return true成功 false 失败*/public boolean set(String key, Object value, long time) {try {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 递增* @param key 键* @param delta 要增加几(大于0)* @return*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}/*** 递减* @param key 键* @param delta 要减少几(小于0)* @return*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}// ================================Map=================================/*** HashGet* @param key 键 不能为null* @param item 项 不能为null* @return 值*/public Object hget(String key, String item) {return redisTemplate.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值* @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}/*** HashSet* @param key 键* @param map 对应多个键值* @return true 成功 false 失败*/public boolean hmset(String key, Map<String, Object> map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** HashSet 并设置时间* @param key 键* @param map 对应多个键值* @param time 时间(秒)* @return true成功 false失败*/public boolean hmset(String key, Map<String, Object> map, long time) {try {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建* @param key 键* @param item 项* @param value 值* @return true 成功 false失败*/public boolean hset(String key, String item, Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建* @param key 键* @param item 项* @param value 值* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 false失败*/public boolean hset(String key, String item, Object value, long time) {try {redisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除hash表中的值* @param key 键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值* @param key 键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回* @param key 键* @param item 项* @param by 要增加几(大于0)* @return*/public double hincr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, by);}/*** hash递减* @param key 键* @param item 项* @param by 要减少记(小于0)* @return*/public double hdecr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, -by);}// ============================set=============================/*** 根据key获取Set中的所有值* @param key 键* @return*/public Set<Object> sGet(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据value从一个set中查询,是否存在* @param key 键* @param value 值* @return true 存在 false不存在*/public boolean sHasKey(String key, Object value) {try {return redisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {e.printStackTrace();return false;}}/*** 将数据放入set缓存* @param key 键* @param values 值 可以是多个* @return 成功个数     */public long sSet(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 将set数据放入缓存* @param key 键* @param time 时间(秒)* @param values 值 可以是多个* @return 成功个数*/public long sSetAndTime(String key, long time, Object... values) {try {Long count = redisTemplate.opsForSet().add(key, values);if (time > 0)expire(key, time);return count;} catch (Exception e) {e.printStackTrace();return 0;}}/*** 获取set缓存的长度* @param key 键* @return*/public long sGetSetSize(String key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 移除值为value的* @param key 键* @param values 值 可以是多个* @return 移除的个数*/public long setRemove(String key, Object... values) {try {Long count = redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {e.printStackTrace();return 0;}}// ===============================list=================================/*** 获取list缓存的内容* @param key 键* @param start 开始* @param end 结束 0 到 -1代表所有值* @return*/public List<Object> lGet(String key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取list缓存的长度* @param key 键* @return*/public long lGetListSize(String key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 通过索引 获取list中的值* @param key 键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推* @return*/public Object lGetIndex(String key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将list放入缓存* @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存* @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, Object value, long time) {try {redisTemplate.opsForList().rightPush(key, value);if(time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存* @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, List<Object> value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存* * @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, List<Object> value, long time) {try {redisTemplate.opsForList().rightPushAll(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据索引修改list中的某条数据* @param key 键* @param index 索引* @param value 值* @return*/public boolean lUpdateIndex(String key, long index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 移除N个值为value* @param key 键* @param count 移除多少个* @param value 值* @return 移除的个数*/public long lRemove(String key, long count, Object value) {try {Long remove = redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {e.printStackTrace();return 0;}}
}
  1. 注意设置下key和value的序列化方式,不然存到Redis的中数据看起来像乱码一下
  • redisTemplate方法说明
redisTemplate.opsForValue(); //操作字符串类型
redisTemplate.opsForHash();  //操作hash类型
redisTemplate.opsForList();  //操作List类型
redisTemplate.opsForSet();   //操作Set类型
redisTemplate.opsForZSet();  //操作有序set类型

注意:

RedisTemplate里传送的数据key和value都是object类型的

StringRedisTemplate里传送的数据都是String类型的

spring-boot整合 mybatis

  1. 添加Maven依赖
<!-- 添加MySQL依赖-->
<dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 添加mybatis整合spring boot依赖-->
<dependency>  <groupId>org.mybatis.spring.boot</groupId>  <artifactId>mybatis-spring-boot-starter</artifactId>  <version>1.3.0</version>
</dependency>
  1. 编写controller控制器层
@RestController
public class LibrarianController {@Autowiredprivate LibrarianService librarianService;@GetMapping("/getLibrarian")public Librarian getALibrarianInfo(int id) {return librarianService.selectLibrarian(id);}
}

记得要加@RestController注解

  1. 编写service层
public interface LibrarianService {Librarian selectLibrarian(int id);
}
  1. 实现service接口ServiceImpl
@Service
public class LibrarianServiceImpl implements LibrarianService{@Autowiredprivate LibrarianMapper librarianMapper;@Overridepublic Librarian selectLibrarian(int id) {return librarianMapper.selectLibrarian(id);}
}

记得要加@Service注解,才会被spring生成bean然后注入到controller那里去
4. 编写Dao层接口

package com.example.dao;
import org.apache.ibatis.annotations.Mapper;
import com.example.entity.Librarian;
@Mapper
public interface LibrarianMapper {Librarian selectLibrarian(int id);
}
  1. 最后编写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="com.example.dao.LibrarianMapper"><!-- 可根据自己的需求,是否要使用 --><resultMap type="Librarian" id="LibrarianMap"><id column="id" property="id" jdbcType="INTEGER" /><result column="userName" property="useName" jdbcType="VARCHAR" /><result column="password" property="password" jdbcType="VARCHAR" /><result column="age" property="age" jdbcType="INTEGER" /><result column="position" property="position" jdbcType="VARCHAR" /></resultMap><select id="selectLibrarian" parameterType="INTEGER" resultMap="LibrarianMap">select * from t_librarian where 1=1 and id = #{id,jdbcType=INTEGER}</select>
</mapper>
  1. 最后在spring boot 启动类写入注解@SpringBootApplication @MapperScan

spring-boot整合 thymeleaf

1.引入Maven依赖

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

2.配置视图解析器

(1)默认
spring-boot很多配置都有默认配置,比如默认页面映射路径为

classpath:/templates/*.html

同样静态文件路径为

classpath:/static/
  1. 编写controller控制器用来跳转HTML页面
@Controller
public class HelloController(){@RequestMapping(value = "/")public String index(){return "index";}
}
  1. 测试
    访问 localhost:8080/这个地址,会直接跳转到 ```index.html`` 页面,并显示如下

spring-boot整合redies、mybatis、thymeleaf相关推荐

  1. Spring Boot 教程(三): Spring Boot 整合Mybatis

    教程简介 本项目内容为Spring Boot教程样例.目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中.如您觉得该项目对您有用,欢迎点击收藏和点赞按钮, ...

  2. spring boot 整合mybatis 无法输出sql的问题

    使用spring boot整合mybatis,测试功能的时候,遇到到了sql问题,想要从日志上看哪里错了,但是怎么都无法输出执行的sql,我使用的是log4j2,百度了一下,很多博客都说,加上下面的日 ...

  3. Spring boot 整合 Mybatis 实现增删改查(MyEclipse版)

    1.首先搭建好一个Spring boot 程序,编写好启动类. 启动类代码如下: @SpringBootApplication public class Start {public static vo ...

  4. java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板

    点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...

  5. spring boot整合mybatis+通用mapper+pagehelper分页插件

    spring boot整合mybatis+通用mapper+pagehelper分页插件 pom依赖 <?xml version="1.0" encoding="U ...

  6. spring boot整合mybatis步骤

    spring boot整合mybatis步骤 官方说明:MyBatis-Spring-Boot-Starter will help you use MyBatis with Spring Boot 其 ...

  7. Spring Boot整合Thymeleaf模板引擎

    转载自 Spring Boot整合Thymeleaf模板引擎 什么是Thymeleaf Thymeleaf是一款用于渲染XML.XHTML.HTML5内容的模板引擎.类似Velocity,FreeMa ...

  8. Spring Boot整合MyBatis

    最近项目原因可能会继续开始使用MyBatis,已经习惯于spring-data的风格,再回头看xml的映射配置总觉得不是特别舒服,接口定义与映射离散在不同文件中,使得阅读起来并不是特别方便. Spri ...

  9. Spring Boot基础学习笔记06:Spring Boot整合MyBatis

    文章目录 零.学习目标 1.了解Spring Boot数据访问概述 2.掌握使用注解的方式整合MyBatis 3.掌握使用配置文件的方式整合MyBatis 一.Spring Boot数据访问概述 二. ...

  10. Spring Boot 整合MyBatis(23)

    Spring Boot 整合MyBatis Spring Boot 整合 Druid 引入依赖 配置 application.yml pring Boot 整合 tk.mybatis 引入依赖 配置 ...

最新文章

  1. vue中子组件和子组件之间怎么通信_vue.js组件之间如何通信?
  2. tornado(七)
  3. linux之LAMP架构优化
  4. 升级vue-cli为 cli3 并创建项目
  5. mysql 基本操作
  6. 一家很好的iPhone应用程序开发公司——易标科技
  7. DMA及cache一致性的学习心得 --dma_alloc_writecombine
  8. 应该如何设计圣诞元素到项目?
  9. acl 允许同网段访问_ENSP模拟交换环境中调用高级ACL限制不同网段之间互访
  10. Maven安装与配制环境【win7/win10】
  11. 《ROS理论与实践》学习笔记(七)机器人语音交互
  12. AURIX TC397 ASCLIN UART
  13. OSChina 周三乱弹 —— who's your 大爷
  14. win11解决右键卡顿
  15. swing标题边框(TitleBorder)
  16. 苹果13的home键怎么调出来
  17. 鸿蒙时期有厉害的人吗,急求:中国神话中有几位圣人.都是谁。鸿钧.鸿蒙.陆压.东皇太一的来历。天界掌控者一共更换了几代都是谁...
  18. 四、用简单神经网络识别手写数字(内含代码详解及订正)
  19. Delphi 通过窗口句柄 加粗窗口边框、描边
  20. 如何评价一套合格的推荐系统?

热门文章

  1. 火狐浏览器被恶意篡改,劫持(打开同时跳出主页和2345网页)
  2. 吴恩达深度学习资料 Quiz+ 编程+ ppt+学习笔记(可jupyter笔记本实战)
  3. 该如何学习三维点云配准的相关知识?
  4. iP1000废弃墨水吸收器已满解决方法
  5. MySQL数据库系统中的文件
  6. 工资管理系统(附源码,直接复制就可以跑起来)
  7. IDEA配置SVN同步路径
  8. 大学计算机学习计划书,大学学习计划书500字
  9. 结构化方法和面向对象方法详解
  10. 数据库SQL Server中数据的模糊查询