curiousL 2020-03-24
上一节创建好基本环境后每一次访问查询都会进行sql查询:
我访问三次上面的链接每次都会进行sql查询:
打印是在service中执行的
@Service public class EmployeeService { @Autowired EmployeeMapper employeeMapper; public Employee getEmp(Integer id){ System.out.println("查询"+id+"号员工"); Employee employee = employeeMapper.getEmpById(id); return employee; } }
想要看到具体的sql执行语句可以修改mapper包的日志级别(即在application.xml中添加配置):
#指定mapper包下的日志级别 logging.level.com.atguigu.cache.mapper=debug
再次在浏览器中访问三次查询链接,此时控制台的输出为:
通过控制台可以看到,我们每次查询相同的数据时服务器端都执行sql查询,这样有时候效率会低;
所以必要时我们需要用到缓存
@EnableCaching @MapperScan("com.atguigu.cache.mapper") @SpringBootApplication public class Springboot01CacheApplication { public static void main(String[] args) { SpringApplication.run(Springboot01CacheApplication.class, args); } }
@Service public class EmployeeService { @Autowired EmployeeMapper employeeMapper; /** * @Cacheable : 将方法的运行结果进行缓存;以后再要相同的数据,直接从缓存中获取,不用调用方法了 * 几个属性: * 1、cacheNames/value:两个都是指定缓存组件的名字,cacheNames可以指定这个缓存组件有多个名字 * 因为CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一的名字 * 2、key:缓存数据使用的key,这个key对应着一个缓存数据,默认是使用方法参数的值作为key * 可以使用SpEL获取方法参数的值,举例:①#id:方法中参数id的值、②a0或者p0或者#root.args[0]:取出方法参数中第一个参数的值 * 3、keyGenerator:key的生成器:默认用方法参数的值作为缓存的key,通过这个生成器生成 * 可以自己指定key的生成器的组件id 注意:key属性和keyGenerator属性只能二选一使用 * 4、cacheManager:指定缓存管理器;或者用cacheResolver指定缓存解析器 ;这两个作用是一样;使用时也是二选一 * 5、condition:指定符合条件的情况下才缓存; * 这里也可以使用SpEL;举例:condition = "#id > 0" * 6、unless:当unless指定的条件为true时;方法的返回值就不会缓存了(正好与condition属性相反) * 可以获取到结果进行判断;举例:unless = "#result == null " * 7、sync:是否使用异步模式;默认不使用 */ @Cacheable(cacheNames = {"emp"}) public Employee getEmp(Integer id){ System.out.println("查询"+id+"号员工"); Employee employee = employeeMapper.getEmpById(id); return employee; } }
各个属性解释:
条件判断中SpEL的获取各个值的参考:
但即使访问链接三次,此时控制台也只有第一次的时候才会进行sql查询,之后是在缓存中直接获取的