spring-boot整合redies、mybatis、thymeleaf
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
- 添加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 //连接超时时间(毫秒)
- 写一个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;}}
}
- 注意设置下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
- 添加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>
- 编写controller控制器层
@RestController
public class LibrarianController {@Autowiredprivate LibrarianService librarianService;@GetMapping("/getLibrarian")public Librarian getALibrarianInfo(int id) {return librarianService.selectLibrarian(id);}
}
记得要加@RestController注解
- 编写service层
public interface LibrarianService {Librarian selectLibrarian(int id);
}
- 实现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);
}
- 最后编写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>
- 最后在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/
- 编写controller控制器用来跳转HTML页面
@Controller
public class HelloController(){@RequestMapping(value = "/")public String index(){return "index";}
}
- 测试
访问localhost:8080/
这个地址,会直接跳转到 ```index.html`` 页面,并显示如下
spring-boot整合redies、mybatis、thymeleaf相关推荐
- Spring Boot 教程(三): Spring Boot 整合Mybatis
教程简介 本项目内容为Spring Boot教程样例.目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中.如您觉得该项目对您有用,欢迎点击收藏和点赞按钮, ...
- spring boot 整合mybatis 无法输出sql的问题
使用spring boot整合mybatis,测试功能的时候,遇到到了sql问题,想要从日志上看哪里错了,但是怎么都无法输出执行的sql,我使用的是log4j2,百度了一下,很多博客都说,加上下面的日 ...
- Spring boot 整合 Mybatis 实现增删改查(MyEclipse版)
1.首先搭建好一个Spring boot 程序,编写好启动类. 启动类代码如下: @SpringBootApplication public class Start {public static vo ...
- java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板
点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...
- spring boot整合mybatis+通用mapper+pagehelper分页插件
spring boot整合mybatis+通用mapper+pagehelper分页插件 pom依赖 <?xml version="1.0" encoding="U ...
- spring boot整合mybatis步骤
spring boot整合mybatis步骤 官方说明:MyBatis-Spring-Boot-Starter will help you use MyBatis with Spring Boot 其 ...
- Spring Boot整合Thymeleaf模板引擎
转载自 Spring Boot整合Thymeleaf模板引擎 什么是Thymeleaf Thymeleaf是一款用于渲染XML.XHTML.HTML5内容的模板引擎.类似Velocity,FreeMa ...
- Spring Boot整合MyBatis
最近项目原因可能会继续开始使用MyBatis,已经习惯于spring-data的风格,再回头看xml的映射配置总觉得不是特别舒服,接口定义与映射离散在不同文件中,使得阅读起来并不是特别方便. Spri ...
- Spring Boot基础学习笔记06:Spring Boot整合MyBatis
文章目录 零.学习目标 1.了解Spring Boot数据访问概述 2.掌握使用注解的方式整合MyBatis 3.掌握使用配置文件的方式整合MyBatis 一.Spring Boot数据访问概述 二. ...
- Spring Boot 整合MyBatis(23)
Spring Boot 整合MyBatis Spring Boot 整合 Druid 引入依赖 配置 application.yml pring Boot 整合 tk.mybatis 引入依赖 配置 ...
最新文章
- vue中子组件和子组件之间怎么通信_vue.js组件之间如何通信?
- tornado(七)
- linux之LAMP架构优化
- 升级vue-cli为 cli3 并创建项目
- mysql 基本操作
- 一家很好的iPhone应用程序开发公司——易标科技
- DMA及cache一致性的学习心得 --dma_alloc_writecombine
- 应该如何设计圣诞元素到项目?
- acl 允许同网段访问_ENSP模拟交换环境中调用高级ACL限制不同网段之间互访
- Maven安装与配制环境【win7/win10】
- 《ROS理论与实践》学习笔记(七)机器人语音交互
- AURIX TC397 ASCLIN UART
- OSChina 周三乱弹 —— who's your 大爷
- win11解决右键卡顿
- swing标题边框(TitleBorder)
- 苹果13的home键怎么调出来
- 鸿蒙时期有厉害的人吗,急求:中国神话中有几位圣人.都是谁。鸿钧.鸿蒙.陆压.东皇太一的来历。天界掌控者一共更换了几代都是谁...
- 四、用简单神经网络识别手写数字(内含代码详解及订正)
- Delphi 通过窗口句柄 加粗窗口边框、描边
- 如何评价一套合格的推荐系统?