第八章 JPA和缓存

1.JPA

1.1.创建User实体类

public class User {private Integer uId;private String uName;private Integer uGender;private Integer uAge;private String uLoginname;private String uPassword;private Date uBirth;private String uEmail;private String uAddress;
}

1.2.创建UserMapper类

public interface UserMapper {@Select("select * from department where u_loginname = #{uLoginname} and u_password = #{uPassword}")public User login(User user);
}

1.3.创建UserController类

@Controller
public class LoginController {@AutowiredUserMapper userMapper;@PostMapping(value="/user/login")public String login(@RequestParam("username")String username,@RequestParam("password")String password,Map<String,String> map,HttpSession session) {User user = new User();user.setuLoginname(username);user.setuPassword(password);User login = userMapper.login(user);if(login != null) {session.setAttribute("loginName", login.getuName());//session.setAttribute("password", password);//重定向,防止表单重复提交return "redirect:/main.html";}map.put("message","用户名密码错误!");return "login";}
}

1.4.SpringData-JPA简介

SpringData下有三大模块分别是:
Repository support:常应用的是:JPA,因为其中包含大量的CRUD的操作
Templates:SpringData Redis
Object Mapping:SpringData MongoDB

1.5.SpringBoot整合JPA

        创建项目选择依赖

        JPA本质上还是一个OPM(实体对象关系映射)【Object Relational Mapping】,首先需要创建项目勾选jpa、web、JDBC和MySQL驱动,既然JPA本质ORP,离不开实体对象,那么我们先创建实体类
        1.编写User类(实体类),有一个Entity和数据库表去进行映射,并且进行映射关系的配置

//使用JPA注解声明映射关系
@Entity//告诉JPA这是一个实体类(和数据表映射的实体类)
@Table(name="t_user")//告诉JPA与数据库中那张表进行映射
public class User {@Id//告诉JPA这是主键列@GeneratedValue(strategy=GenerationType.IDENTITY)//这是使用主键自增的策略private Integer id;@Column(name="last_name",length=50)//这是对应的数据表中的一列数据private String lastName;@Column(name="email")//省略就是属性名就是数据表中的列名private String email;@Column(name="did")private Integer dId;

        2.编写Repository接口去继承JAPRepository接口,实现操作数据库的表中的数据

/*** 继承JpaRepository来实现对数据库进行CRUD的操作* @author Administrator*/
public interface UserRepository extends JpaRepository<User, Integer>{
}

        3.基本配置:yml文件中配置:jpa的创建表和显示执行时的sql语句;

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://101.132.192.20:3306/jpausername: rootpassword: 123456initialization-mode: always
#101.132.192.20   jpa:hibernate:#更新或创建实体类对应的数据表ddl-auto: update#在执行sql时控制台显示SQL语句show-sql: true

        在主程序需要剥离一些SpringBoot自动配置的数据源,否则SpringBoot使用默认数据源!那么自己配置的数据源是不会生效!也就是需要排除自动配置,手动配置(指定)数据源

@EnableAutoConfiguration //把UserRepository初始化,并把其对象放在Spring容器中去
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class })

        4.在pom文件中加上Hibernate的依赖,因为JPA底层是依赖于Hibernate

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId>
</dependency>

        在MySQL中创建数据库jpa,接下来运行SpringBootApplication(springboot的启动程序),控制台显示建表sql语句,数据库中t_user表创建成功!
        5.创建UserController类

@RestController
public class UserController {@AutowiredUserRepository repository;@GetMapping("/user")public User addUser(User user){User u = repository.save(user);return u;}@GetMapping("/user/{id}")public User findUserById(@PathVariable("id") Integer id){Optional<User> opt = repository.findById(id);return opt.get();}
}

        访问地址:http://localhost:8080/user/1

2.缓存

2.1.缓存简介

2.1.1.什么是缓存

        从三个角度了解缓存:性能:将相应数据存储起来以避免数据的重复创建、处理和传输,可有效提高性能。
        稳定性:同一个应用中,对同一数据、逻辑功能和用户界面的多次请求时经常发生的。当用户基数很大时,如果每次请求都进行处理,消耗的资源是很大的浪费,也同时造成系统的不稳定。例如,web应用中,对一些静态页面的呈现内容进行缓存能有效的节省资源,提高稳定性。而缓存数据也能降低对数据库的访问次数,降低数据库的负担和提高数据库的服务能力;
        可用性:有时,提供数据信息的服务可能会意外停止,如果使用了缓存技术,可以在一定时间内仍正常提供对最终用户的支持,提高了系统的可用性。

2.1.2.为什么学习缓存

        减少交互通讯量:缓存数据能有效减少在进程和机器间的传输量;
        降低系统中的处理量:减少处理次数;
        降低需要做的磁盘访问次数:比如缓存在内存中的数据。

2.1.3.缓存数据特点

        数据量不大;访问频率高;数据更改频率低

2.2.JSR107

        Java Caching定义了5个核心接口,分别是:CachingProvider, CacheManager, Cache, EntryExpiry
        CachingProvider:定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
        CacheManager:定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
        Cache:是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
        Entry:是一个存储在Cache中的key-value对。
        Expiry:每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

2.2.Spring缓存抽象

2.2.1.介绍

        Spring为了简化缓存开发,定义了org.springframework.cache包下的Cache和CacheManager两个接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache等;每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
        使用Spring缓存抽象时我们需要关注以下两点:确定方法需要被缓存以及他们的缓存策略;从缓存中读取之前缓存存储的数据

2.2.2.Spring缓存概念以及注解:

概念

描述

Cache

缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等

CacheManager

缓存管理器,管理各种缓存(Cache)组件

@Cacheable

主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

@CacheEvict

清空缓存

@CachePut

保证方法被调用,又希望结果被缓存。

@EnableCaching

开启基于注解的缓存

keyGenerator

缓存数据时key生成策略

serialize

缓存数据时value序列化策略

2.3.项目搭建及测试

2.3.1.创建项目测试和使用缓存及环境

        创建项目需要使用的模块有:core模块下的:cache;web模块下的:web;SQL模块下的:MySQL、MyBatis
        搭建基本环境:创建数据库:创建出department和employee表;创建实体类:创建实体类封装数据(department和employee类拷贝到项目中);整合MyBatis整合数据库 (配置数据源信息;写mapper接口);创建Service;创建Control。
        注意:环境搭配正确,如果springboot的版本是2.4.4,mybatis推荐2.1.4

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency>

2.3.2.建库语句

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (`id` int(11) NOT NULL AUTO_INCREMENT,`departmentName` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (`id` int(11) NOT NULL AUTO_INCREMENT,`lastName` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,`gender` int(2) DEFAULT NULL,`d_id` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.3.3.拷贝是注意类路径

实体类,加上getter、setter、toString和有参无参构造方法

public class Employee {private Integer id;private String lastName;private String email;private Integer gender; //性别 1男  0女private Integer dId;
}public class Department {private Integer id;private String departmentName;
}

2.3.4.整合MyBatis整合数据库(开启驼峰)

        配置数据源信息

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:// 192.168.202.203:3306/spring_cacheusername: rootpassword: 123456

        写mapper接口

public interface EmployeeMapper {@Insert("insert into employee(lastName,email,gender,d_id) values(#{lastName},#{email},#{gender},#{dId})")public void insertEmp(Employee employee);@Delete("delect from employee where id = #{id}")public void deleteEmp(Integer id);@Update("update employee set lastName=#{lastName},email=#{email},gender=#{gender},dId=#{d_id} where id = #{id}")public void updateEmp(Employee employee);@Select("select * from employee")public List<Employee> selectAllEmp();@Select("select * from employee where id = #{id}")public Employee selectEmpNyId(Integer id);
}

        开启驼峰命名法

mybatis.configuration.map-underscore-to-camel-case=true

2.4.测试类

        选中项目右键-》Build Path-》Configure Build Path-》Add Library-》JUnit-》选中Junit 4->Apply

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootData09Cache1ApplicationTests {@AutowiredEmployeeMapper employeeMapper;@Testvoid contextLoads() {Employee emp = employeeMapper.selectEmpNyId(1);System.out.println(emp.toString());}
}

2.4.1.创建Service层:EmployeeService类

@Service
public class EmployeeService {@AutowiredEmployeeMapper mapper;public Employee findEmpById(Integer id) {System.out.println("查询id为:" + id +"员工信息!");return mapper.selectEmpNyId(id);}
}

2.4.2.创建Controller

@RestController
public class EmployeeControl {@AutowiredEmployeeService employeeService;@GetMapping("/emp/{id}")public Employee getEmpByIt(@PathVariable("id")Integer id) {return employeeService.findEmpById(id);}
}

2.4.3.快速体验缓存

        步骤:1.开启基于注解的缓存(@EnableCaching),启动类

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@MapperScan("com.school.demo.mapper")
@SpringBootApplication
@EnableCaching
public class SpringBootData09Cache1Application {public static void main(String[] args) {SpringApplication.run(SpringBootData09Cache1Application.class, args);}}

        2.标注缓存注解(@Cacheable:能够根据方法的请求参数对其结果进行缓存;@CacheEvict: 清空缓存;@CachePut:保证方法被调用,又希望结果被缓存。)
为了控制台方便观看,需要把方法执行时的日志和SQL显示出来:

#开启驼峰命名法校验规则
mybatis.configuration.map-underscore-to-camel-case=true
#输出mapper文件中的日志
logging.level.com.com.zpark.demo.mapper=debug
#输出执行时的SQL语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

        将刚才的方法查询的结果,放到缓存中去,以后调用相同的方法以后,需要到缓存中去找,缓存中没有再去连接数据库查询
        @Cacheable的几个属性:cacheName/value:指定缓存组件的名字

  • CacheManager管理多个Cache组件,对缓存进行CRUD
  • key:缓存数据用的key,如果不指定key,默认使用的是方法的参数
  • keyGenerator:key的生成器,可以自己指定key的生成器的组件id
  • cacheManager:可以指定缓存管理器
  • cacheResolver:可以指定缓存解析器
  • condition:指定符合条件的情况下才会缓存
    • condition="#id > 0":表示参数id>0的时候,才可以缓存到Cache中
  • sync:是否使用异步
    • unless:unless=“#result == null”
  • unless:除非满足条件的情况下不缓存,可以获取到结果进行判断

名字

位置

描述

methodName

root object

当前被调用的方法名

method

root object

当前被调用的方法

target

root object

当前被调用的目标对象

targetClass

root object

当前被调用的目标对象类

args

root object

当前被调用的方法的参数列表

caches

root object

当前方法调用使用的缓存列表(如@Cacheable(value={"cache1", "cache2"})),则有两个cache

argument name

evaluation context

方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0或#a0 的形式,0代表参数的索引;

result

evaluation context

方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,’cache put’的表达式 ’cache evict’的表达式beforeInvocation=false)

// 在service进行测试
@Service
public class EmployeeService {	@AutowiredEmployeeMapper mapper;//@Cacheable(value="Emp",key="#id")@Cacheable(value="Emp",condition="#id > 1")public Employee findEmpById(Integer id) {	System.out.println("查询id为:" + id +"员工信息!");	return mapper.selectEmpNyId(id);	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2660338.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

走进电子技术之光敏电阻、电位器、开关

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

Redis 是如何执行的?

文章目录 命令执行流程步骤一&#xff1a;用户输入一条命令步骤二&#xff1a;客户端先将命令转换成 Redis 协议&#xff0c;然后再通过 socket 连接发送给服务器端步骤三&#xff1a;服务器端接收到命令步骤四&#xff1a;执行前准备步骤五&#xff1a;执行最终命令&#xff0…

牛客网SQL训练5—SQL大厂真题面试

文章目录 一、某音短视频1.各个视频的平均完播率2.平均播放进度大于60%的视频类别3.每类视频近一个月的转发量/率4.每个创作者每月的涨粉率及截止当前的总粉丝量5.国庆期间每类视频点赞量和转发量6.近一个月发布的视频中热度最高的top3视频 二、用户增长场景&#xff08;某度信…

idea Spring Boot项目使用JPA创建与数据库链接

1.pom.xml文件中添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>…

文章智能改写伪原创方法技巧

哈喽&#xff0c;小伙伴们&#xff0c;大家好&#xff0c;我 又回来了。 今天给大家分享一个文章智能改写原创的方法&#xff0c;现在的自媒体平台&#xff0c;做视频流量挺不好做的&#xff0c;除非你有好的方法&#xff0c;文章呢&#xff0c;就相对比较容易点了&#xff0c;…

Graph Transformer2023最新研究成果汇总,附15篇必看论文

图Transformer是一种结合了Transformer模型和图神经网络&#xff08;GNN&#xff09;的框架&#xff0c;用于在图形结构数据上执行预测任务。在图Transformer中&#xff0c;Transformer的自注意力机制被用来学习节点之间的关系&#xff0c;而GNN则被用来生成节点的嵌入表示。通…

Qt学习:Qt的意义安装Qt

Qt 的简介 QT 是一个跨平台的 C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 支持平台 xP 、 Vista、Win7、win8、win2008、win10Windows . Unix/Linux: Ubuntu 等…

一、C++简介

C语言的发展史 1983年&#xff0c;贝尔实验室&#xff08;Bell Labs&#xff09;的Bjarne Stroustrup发明了C。 C在C语言的基础上进行了扩充和完善&#xff0c;是一种面向对象程序设计&#xff08;OOP&#xff09;语言。 Stroustrup说&#xff1a;“这个名字象征着源自于C语言变…

离线AI聊天清华大模型(ChatGLM3)本地搭建

在特定的情况下&#xff0c;要保证信息安全的同时还能享受到AIGC大模型带来的乐趣和功能&#xff0c;那么&#xff0c;离线部署就能帮助到你&#xff0c;最起码&#xff0c;它是一个真正可用的方案。 大模型本身清华的 (ChatGLM3)&#xff0c;为的是对中文支持友好&#xff0c…

爬虫基础一(持续更新)

爬虫概念&#xff1a; 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程 分类&#xff1a; 1&#xff0c;通用爬虫&#xff1a;抓取一整张页面数据 2&#xff0c;聚焦爬虫&#xff1a;抓取页面中的局部内容 3&#xff0c;增量式爬虫&…

NFC刷卡soc芯片SI3262集成刷卡+触摸+ACD超低功耗一体

简介 13.56mhz刷卡soc芯片SI3262集成刷卡触摸ACD超低功耗&#xff0c;ACD模式刷卡距离可达到5cm以上&#xff0c;非常适用于小体积门锁&#xff0c;密码锁&#xff0c;柜锁&#xff0c;接下来介绍一下这款芯片的具体功能。 优势 1.超低功耗&#xff0c;最低功耗达 1.7uA&…

【网络安全 | Misc】世安杯 适合作为桌面(Stegsolve及Winhex的使用)

正文 解压后得到图片&#xff1a; 图片属性正常&#xff0c;无特殊点&#xff0c;经测试&#xff0c;无隐写文件&#xff1a; Stegsolve 运行方法&#xff1a; 可以看到出现二维码&#xff1a; 对其解密得到&#xff1a; 03F30D0A79CB05586300000000000000000100000040000000…

【起草】【第六章】ChatGPT 在软件测试的应用场景

6.1 、引言 & 背景 在测试领域&#xff0c;AIGC 的爆发引发了对其在软件测试中的应用可能性的广泛研究和探讨。传统的软件测试方法往往需要大量的人力和时间投入&#xff0c;而 AIGC 技术的引入可能为测试领域带来革命性的变化。AIGC 在测试中的优势在于其高效的自动化能力…

R语言学习笔记-R包的安装

推荐在线安装&#xff0c;可以解决包与包之间的依赖关系。 1.首先在RGui&#xff1a; 2.在RStudio 的console下&#xff1a; 如安装ggplot2包&#xff0c;则&#xff1a; install.packages("ggplot2") 生信方面&#xff1a; 首先安装&#xff1a; install.packa…

HDFS客户端UnknownHostException事故解析

文章目录 前言事故现场问题分析是否是整个域名解析服务当时都出问题了是否是出问题的pods本身的域名解析有问题 异常发生的全部过程域名的解析是什么时候发生的&#xff0c;怎么发生的域名解析的详细流程 重试发生在什么地方为什么重试会无效 Bugfix代码详解关于StandardHostRe…

jenkins解决工具找不到的问题

--------------------------插件选择版本最好能跟服务器对上

腾讯云服务器怎么买划算?最新优惠价格表

2023腾讯云轻量应用服务器优惠价格表&#xff0c;12月最新报价&#xff0c;腾讯云轻量2核2G3M带宽62元一年、2核2G4M轻量服务器118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元三年、4核8G12M轻量服务器646元15个月&#xff0c;CVM云服务器S5实例2核2G…

C语言实验2:循环结构程序设计和数组

目录 一、实验要求 二、实验内容 实验一&#xff1a;循环结构程序设计 1.1 代码 截图 分析 1.2 代码 截图 分析 1.3 代码 截图 分析 实验二&#xff1a;数组 2.1 代码 截图 分析 2.2 代码 截图 分析 2.3 代码 截图 分析 实验三&#xff1a;循环结…

产品管理-学习笔记-版本的划分

版本号说明【X.Y.Z_修饰词】 版本号定义原则X表示大版本号&#xff0c;一般当产品出现重大更新、调整、不再向后兼容的情况时我们会在X上加1Y表示功能更新&#xff0c;在产品原有的基础上增加、修改部分功能&#xff0c;且并不影响产品的整体流程或业务Z表示小修改&#xff0c…

小米SU7汽车发布会; 齐碳科技C+轮融资;网易 1 月 3 日发布子曰教育大模型;百度文心一言用户数已突破 1 亿

投融资 • 3200 家 VC 投资的创业公司破产&#xff0c;那个投 PLG 的 VC 宣布暂停投资了• 云天励飞参与 AI 技术与解决方案提供商智慧互通 Pre-IPO 轮融资• 百度投资 AIGC 公司必优科技• MicroLED量测公司点莘技术获数千万级融资• 智慧互通获AI上市公司云天励飞Pre-IPO轮战…