后端开发总是要保证数据返回的速度越快越好,可是数据库查问就是那么个速度,通过优化SQL和数据库配置都不是最正当的办法。所以明天咱们来看一下缓存。
Cache
话说缓存,咱们总是第一工夫想到redis,可是最要害的是redis须要本人启动客户端,这就比拟麻烦了。咱们只是须要缓存简略的数据怎么办?springboot为咱们想到了这个问题,于是默认增加了缓存ConcurrentMapCacheManager。
1. 新建SpringBoot我的项目
不再赘述,参考之前的文章即可
2. 批改pom.xml文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
这里咱们应用jpa。
3. 新建数据库表
DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '姓名', `address` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '地址', `age` int NULL DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
4. 写代码啦
4.1 新建实体类User
/** * 实体类 * @author zhouzhaodong */@Entitypublic class User implements Serializable { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private int id; private String name; private String address; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", address='" + address + '\'' + ", age=" + age + '}'; }}
4.2 新建数据库拜访层继承JpaRepository
/** * 数据库拜访层 * @author zhouzhaodong */public interface UserRepository extends JpaRepository<User, Integer> { /** * 依据id更新 * * @param id * @param name * @param address * @param age */ @Modifying @Query(value = "update user u set u.name = :name, u.address = :address, u.age = :age where u.id = :id", nativeQuery = true) User updateById(@Param("id") Integer id, @Param("name") String name, @Param("address") String address, @Param("age") int age);}
4.3 定义业务层类
/** * Service * @author zhouzhaodong */@Servicepublic interface UserService { /** * 新增 * @param user * @return */ User insert(User user); /** * 删除 * @param id * @return */ void delete(int id); /** * 更新 * @param user * @return */ void update(User user); /** * 依据id查问 * @param id * @return */ Object findById(int id);}
/** * 实现类 * @author zhouzhaodong */@Servicepublic class UserServiceImpl implements UserService { @Resource UserRepository userRepository; @Override @CachePut(value = "user", key = "#result.id") public User insert(User user) { return userRepository.save(user); } @Override @CacheEvict(value = "user", key = "#id") public void delete(int id) { userRepository.deleteById(id); } @Override @CachePut(value = "user", key = "#user.id") public User update(User user) { return userRepository.updateById(user.getId(), user.getName(), user.getAddress(), user.getAge()); } @Override @Cacheable(value = "user", key = "#id") public Object findById(int id) { return userRepository.findById(id); }}
4.4 管制层
/** * 管制层 * @author zhouzhaodong */@RestControllerpublic class UserController { @Resource UserService userService; @RequestMapping("/save") public User saveUser(User user){ return userService.insert(user); } @RequestMapping("/delete") public void deleteUser(int id){ userService.delete(id); } @RequestMapping("/update") public User updateUser(User user){ return userService.update(user); } @RequestMapping("/find") public Object findById(int id){ return userService.findById(id); }}
4.5 启动类增加注解
/** * 启动类 * @author zhouzhaodong */@SpringBootApplication@EnableCachingpublic class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); }}
4.6 application配置文件
server: port: 8989 # 端口号spring: datasource: url: jdbc:mysql://ip地址:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true username: 用户名 password: 明码 jpa: show-sql: true # 打印sql properties: hibernate: format_sql: true # 打印sql
5. post测试
首先新增数据,而后进行查问就会发现并不走数据库查问,控制台不打印sql,缓存胜利。
具体代码请查看:
https://github.com/zhouzhaodo...
集体博客:
http://www.zhouzhaodong.xyz/