如何优化WordPress网站以提升托管服务协议中的标签关联效果?

摘要:网站托管服务协议,wordpress标签关联,网络运营商在哪里找,实力网站开发👌 棒棒有言:也许我一直照着别人的方向飞,可是这次&#
网站托管服务协议,wordpress标签关联,网络运营商在哪里找,实力网站开发#x1f44c; 棒棒有言#xff1a;也许我一直照着别人的方向飞#xff0c;可是这次#xff0c;我想要用我的方式飞翔一次#xff01;人生#xff0c;既要淡#xff0c;又要有味。凡事不必太在意#xff0c;一切随缘#xff0c;缘深多聚聚#xff0c;缘浅随它去。凡事… 棒棒有言也许我一直照着别人的方向飞可是这次我想要用我的方式飞翔一次人生既要淡又要有味。凡事不必太在意一切随缘缘深多聚聚缘浅随它去。凡事看淡点看开些顺其自然无意于得就无所谓失。人生看轻看淡多少痛苦就远离你多少。 本章简介MyBatis本是apache的一个开源项目iBatis2010年这个项目由apache software foundation迁移到了google code并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access ObjectsDAOs。 当前最新版本是MyBatis 3.5.11其发布时间是2022年09月18日。  作者get棒棒给个关注呗 非常重要 如果不介意麻烦动动你们的小手点个关注 Mybatis框架 MyBatis简介 MyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects普通老式 Java 对象为数据库中的记录 2010年这个项目由apache software foundation 迁移到了google code并且改名为MyBatis 。2013年11月迁移到Github。 回顾JDBC的使用步骤 1.加载驱动 Class.forName(com.mysql.jdbc.Driver); 2.获取连接对象 DiverManerger.getConnection(url,username,password) 3.获取执行sql的Statement对象 connection.CreateStatement(); 4.执行sql语句 5.处理结果集 6.释放连接 connection.Close() 与JDBC相比 Mybatis通过参数映射方式可以将参数灵活的配置在SQL语句中的配置文件中避免在Java类中配置参数 Mybatis通过输出映射机制将结果集的检索自动映射成相应的Java对象避免对结果集手工检索 Mybatis可以通过Xml配置文件对数据库连接进行管理 MyBatis整体架构及运行流程 Mybatis整体构造由 数据源配置文件、Sql映射文件、会话工厂、会话、执行器和底层封装对象组成 1.数据源配置文件 通过配置的方式将数据库的配置信息从应用程序中独立出来由独立的模块管理和配置。Mybatis的数据源配置文件包含数据库驱动、数据库连接地址、用户名密码、事务管理等还可以配置连接池的连接数、空闲时间等 一个MapConfig.xml基本的配置信息如下 ?xml version1.0 encodingUTF-8 ? !DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configurationenvironments defaultdevelopmentenvironment iddevelopment!-- 事务的管理 JDBC  MANAGED--transactionManager typeJDBC/!-- 数据源 POOLED UNPOOLED JNDI --dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappersmapper resourceorg/mybatis/example/BlogMapper.xml//mappers /configuration mybatis mapper文件映射 !-- 使用相对于类路径的资源引用 --mappersmapper resourceorg/mybatis/builder/AuthorMapper.xml/ /mappers !-- 使用映射器接口实现类的完全限定类名mybais去加载class对应的接口然后还会去加载该接口同目录下的同名xml文件 --mappersmapper classorg.mybatis.builder.AuthorMapper/ /mappers !-- 将包内的映射器接口实现全部注册为映射器   使用package元素批量注册Mapper接口1.包名和接口所在的包名字一致2.mapper文件的名字和接口的名字一致3.创建包是使用/分割 --mapperspackage nameorg.mybatis.builder/ /mappers 设置资源文件路径 Maven中默认是只会打包resource下的资源文件。如果我们的文件不放在resource 则需要通过配置告知Maven resourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resourceresourcedirectorysrc/main/resources/directoryincludesinclude**/*.properties/includeinclude**/*.xml/includeinclude**/*.tld/include/includesfilteringfalse/filtering/resource /resources 2.Sql映射文件 Mybatis中所有数据库的操作都会基于该映射文件和配置的sql语句在这个配置文件中可以配置任何类型的sql语句。框架会根据配置文件中的参数配置完成对sql语句以及输入输出参数的映射配置。 Mapper.xml配置文件大致如下 ?xml version1.0 encodingutf-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespace命名空间 ​ select id方法名 resultMap返回值类型 parameterType参数类型 ​ -- sql语句 ​ /select ​ /mapper 3.会话工厂与会话 Mybatis中会话工厂SqlSessionFactory类可以通过加载资源文件读取数据源配置MapConfig.xml信息从而产生一种可以与数据库交互的会话实例SqlSession会话实例SqlSession根据Mapper.xml文件中配置的sql,对数据库进行操作。 4.运行流程 会话工厂SqlSessionFactory通过加载资源文件获取MapConfig.xml配置文件信息然后生成可以与数据库交互的会话实例SqlSession。会话实例可以根据Mapper配置文件中的Sql配置去执行相应的增删改查操作 执行流程图 mybatis实现增删改查 public class TestStudent { ​Testpublic void test01(){ ​try {//加载配置文件InputStream in Resources.getResourceAsStream(config/mybatis-config.xml);//获取sqlSession对象SqlSession sqlSession new SqlSessionFactoryBuilder().build(in).openSession();//查询所有学生信息ListStudent students sqlSession.selectList(cn.kgc.mybatis.dao.StudentDao.getAll); students.forEach(student - System.out.println(student) );} catch (IOException e) {e.printStackTrace();}} ​Testpublic void test02(){//查询一个学生信息 ​try {//加载配置文件InputStream in Resources.getResourceAsStream(config/mybatis-config.xml);//获取sqlSession对象SqlSession sqlSession new SqlSessionFactoryBuilder().build(in).openSession();//根据用户名查询一个学生信息Student student sqlSession.selectOne(cn.kgc.mybatis.dao.StudentDao.findOne,tom);System.out.println(student);sqlSession.close();} catch (IOException e) {e.printStackTrace();}}Testpublic void test03() {//添加一个学生信息 ​try {//加载配置文件InputStream in Resources.getResourceAsStream(config/mybatis-config.xml);//获取sqlSession对象SqlSession sqlSession new SqlSessionFactoryBuilder().build(in).openSession();//添加一个学生信息Student student Student.builder().stuBirth(new Date()).stuName(lilei).stuNo(2021073001).stuSex(男).build();int i sqlSession.insert(cn.kgc.mybatis.dao.StudentDao.addOne, student);System.out.println(i);sqlSession.commit();sqlSession.close(); ​} catch (IOException e) {e.printStackTrace();} ​}Testpublic void test04() {//删除一个学生信息 ​try{InputStream in Resources.getResourceAsStream(config/mybatis-config.xml);//获取sqlSession对象 同时可设置事务的自动提交 openSession(true)SqlSession sqlSession new SqlSessionFactoryBuilder().build(in).openSession();int delete sqlSession.delete(cn.kgc.mybatis.dao.StudentDao.delOne,lilei );sqlSession.commit();sqlSession.close();System.out.println(delete);}catch (Exception e){e.printStackTrace();} ​} ​Testpublic void test05() {//修改一个学生信息 ​try{InputStream in Resources.getResourceAsStream(config/mybatis-config.xml);//获取sqlSession对象SqlSession sqlSession new SqlSessionFactoryBuilder().build(in).openSession(); ​Student student Student.builder().stuBirth(new Date()).stuName(lili).stuNo(2021073001).stuSex(女).build();int delete sqlSession.update(cn.kgc.mybatis.dao.StudentDao.updateStudent,student);sqlSession.commit();sqlSession.close();System.out.println(delete);}catch (Exception e){e.printStackTrace();} ​ ​} ​ } ​ mybatis中使用log4j日志工具 1.配置mybatis-config.xml !--    开启日志--setting namelogImpl valueLOG4J/ 开启驼峰命名 !--    设置驼峰命名--setting namemapUnderscoreToCamelCase valuetrue/ 设置别名 typeAliases!--设置别名--package namecn.kgc.mybatis.pojo/ /typeAliases 2.配置log4j.properties文件放置在resources目录下 log4j.rootLoggerDEBUG,Console ​ #Console log4j.appender.Consoleorg.apache.log4j.ConsoleAppender log4j.appender.console.TargetSystem.out log4j.appender.Console.layoutorg.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern%d [%t] %-5p [%c] - %m%n ​ log4j.logger.org.apacheERROR log4j.logger.org.mybatisERROR log4j.logger.org.springframeworkERROR ​ #这个需要 log4j.logger.log4jdbc.debugERROR log4j.logger.com.gk.mapperERROR log4j.logger.jdbc.auditERROR log4j.logger.jdbc.resultsetERROR #这个打印SQL语句非常重要 log4j.logger.jdbc.sqlonlyDEBUG log4j.logger.jdbc.sqltimingERROR log4j.logger.jdbc.connectionFATAL 使用mapper代理对象实现增删改查 public class TestStudentMapper {SqlSessionFactory factory;Beforepublic void init(){try {InputStream  in Resources.getResourceAsStream(config/mybatis-config.xml);SqlSessionFactoryBuilder sfb new SqlSessionFactoryBuilder();factory sfb.build(in);} catch (IOException e) {e.printStackTrace();} ​ ​}Testpublic void test01(){//开启事务自动提交SqlSession sqlSession factory.openSession(true);//获取dao层的代理对象StudentDao studentDao sqlSession.getMapper(StudentDao.class);ListStudent students studentDao.getAll();students.forEach(student - System.out.println(student));} ​Testpublic void test02(){ //添加数据 ​SqlSession sqlSession factory.openSession(true);Student student Student.builder().stuSex(男).stuNo(2021073100).stuName(李四).stuBirth(new Date()).build();StudentDao studentDao sqlSession.getMapper(StudentDao.class);Integer line studentDao.addOne(student);System.out.println(line);} ​Testpublic  void test03(){//删除一条数据SqlSession sqlSession factory.openSession(true);StudentDao studentDao sqlSession.getMapper(StudentDao.class);Integer line studentDao.delOne(李四);System.out.println(line);} ​Testpublic void test04() { //修改数据SqlSession sqlSession factory.openSession(true);StudentDao studentDao sqlSession.getMapper(StudentDao.class);Student student Student.builder().stuSex(女).stuNo(2021073100).stuName(李四).stuBirth(new Date()).build();Integer line studentDao.updateOne(student);System.out.println(line); ​}Testpublic void test06(){//模糊查询一个学生信息 一个参数SqlSession sqlSession factory.openSession(true);StudentDao studentDao sqlSession.getMapper(StudentDao.class); ​ListStudent students studentDao.selectLikeName(li);System.out.println(students.toString()); ​} ​Testpublic void test07(){//模糊查询一个学生信息 两个参数SqlSession sqlSession factory.openSession(true);StudentDao studentDao sqlSession.getMapper(StudentDao.class); ​ListStudent students studentDao.selectLikeName2(li, 2021072902);System.out.println(students.toString()); ​ ​}Testpublic void test08(){//模糊查询一个学生信息 一个集合参数 mapper文件中按照key取值SqlSession sqlSession factory.openSession(true);StudentDao studentDao sqlSession.getMapper(StudentDao.class); ​HashMapString, String map new HashMap();map.put(stuname,li);map.put(stuno, 2021072902);ListStudent students studentDao.selectLikeName3(map);System.out.println(students.toString());} ​ } ​ Mybatis的获取参数的方式 方式1${} 字符串拼接 方式2#{} 占位符 1.Mapper接口参数为单个参数 delete iddelUserById parameterTypeintdelete from user where id #{id}/deletedelete iddelUserById parameterTypeintdelete from user where id ${id}/delete 注如何参数是String类型使用${}获取参数是需要手动添加引号 2.Mapper接口参数是多个参数的获取 mybatis在处理多个参数时,会将多个参数保存到map集合中会 以 agr0 agr1或param1 param2为键 以参数位置进行存储 User selectUserByUserNameAndPassword(String username,String password);select idselectUserByUserNameAndPassword resultTypeuserselect  * from user where user_name #{arg0} and password #{arg1}/select 3.将参数设为map集合进行数据的传递 User selectUserByMap(Map map); select idselectUserByMap resultTypecn.kgc.mybatis.entity.Userselect  * from user where user_name #{username} and password #{password} /select 4.通过注解param(键名)设置参数的获取名字 User selectUserByUserNameAndPassword(param(username)String username,(param(password)String password); select idselectUserByUserNameAndPassword resultTypeuserselect  * from user where user_name #{username} and password #{password} /select ​ 或者 ​ select idselectUserByUserNameAndPassword resultTypeuserselect  * from user where user_name #{param1} and password #{param2} /select ​ 5.将多个参数设置成对象进行数据的传递 int insertUser(User user);insert idinsertUser parameterTypeuser useGeneratedKeystrue keyPropertyid insert into user values ( #{id},#{userName},#{password})/insert Mybatis中的模糊查询 方式1 SELECT * FROM tableName WHERE name LIKE #{text} ​ -- 传递的参数需要拼接 ‘%text%’ 方式2 SELECT * FROM tableName WHERE name LIKE %${text}%; -- 使用$替代# 参数无需在拼接% 存在sql注入 方式3 SELECT * FROM tableName WHERE name LIKE CONCAT(%, #{text}), %); -- 使用mysql的函数 实现拼接 6.批量删除 int deleteMore(String ids);delete iddeleteMoredelete from user where id in(${ids})/delete mapper中自定义映射 自定义映射的用法之一解决表格查询的字段名和实体类中不一致的情况 resultMap iduserMap typeuserid columnid propertyid/idresult columnuser_name propertyuserName/resultresult columnpassword propertypassword/result /resultMap mybatis对象的关联关系 一对多关系处理(一方) resultMap idselectByEIdMap typecn.kgc.mybatis.entity.Empresult columnid propertydept.id /resultresult columndname propertydept.dName/result/resultMap ​ ​resultMap idselectByEIdMap2 typecn.kgc.mybatis.entity.Empid columneid propertyeId/idresult columnename propertyEName/resultresult columnage propertyage/resultresult columndeptno propertydeptNo/result!--实体对象标识--association propertydept javaTypedeptid columnid propertyid/idresult columndname propertydName/result/association/resultMap ​!-- 分步查询 --resultMap idselectByEIdMap3 typecn.kgc.mybatis.entity.Empid columneid propertyeId/idresult columnename propertyEName/resultresult columnage propertyage/resultresult columndeptno propertydeptNo/resultassociation propertydept selectcn.kgc.mybatis.mapper.DeptMapper.selectById columndeptno fetchTypeeager/association/resultMap ​ 注延迟加载设置 1. setting namelazyLoadingEnabled valuetrue/ 2. setting nameaggressiveLazyLoading valuefalse/  3.4.1之前的版本需要设置 ​select idselectByEId resultMapselectByEIdMap2select  * from emp left  join dept on emp.deptno dept.id  where eid #{eid}/select ​select idselectByEId2 resultMapselectByEIdMap3select  * from emp  where eid #{eid}/select 一对多关系处理(多方) resultMap idBaseResultMap typecn.kgc.mybatis.entity.Deptid propertyid columnid /result propertydName columndname /collection propertyemps ofTypeempid columneid propertyeId/idresult columnename propertyEName/resultresult columnage propertyage/resultresult columndeptno propertydeptNo/result/collection/resultMap ​ ​resultMap idBaseResultMap2 typecn.kgc.mybatis.entity.Deptid propertyid columnid /result propertydName columndname /collection propertyemps selectcn.kgc.mybatis.mapper.EmpMapper.selectByDeptId columnid/collection/resultMap ​select idselectById resultTypedeptselect  * from dept where id #{id}/select ​select idselectById2 resultMapBaseResultMapselect emp.* ,dept.* from dept left join emp on dept.id emp.deptno where id #{id}/select ​select idselectById3 resultMapBaseResultMap2select dept.* from dept  where id #{id}/select mybatis动态sql 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架你应该能理解根据不同条件拼接 SQL 语句有多痛苦例如拼接时要确保不能忘记添加必要的空格还要注意去掉列表最后一个列名的逗号。利用动态 SQL可以彻底摆脱这种痛苦 动态SQL:if 语句 根据 stu_name 和 stu_sex 来查询数据。如果stu_name为空那么将只根据stu_sex来查询反之只根据stu_name来查询 首先不使用 动态SQL 来书写 select idselectStudent resultTypestudent parameterTypecn.kgc.mybatis.pojo.Studentselect * from user where stu_name#{stu_name} and stu_sex#{stu_sex} /select 可以发现如果 #{stu_name} 为空那么查询结果也是空如何解决这个问题呢使用 if 来判断 select idselectStudent resultTypestudent parameterTypecn.kgc.mybatis.pojo.Studentselect * from student where  if teststu_name ! nullstu_name#{stu_name}/ifif teststu_sex! nulland stu_sex#{stu_sex}/if /select 这样写我们可以看到如果 sex 等于 null那么查询语句为 select * from student where stu_name#{stu_name},但是如果stu_name 为空呢那么查询语句为 select * from user where and stu_sex#{sex}这是错误的 SQL 语句如何解决呢 ifwhere 语句 select idselectStudent resultTypestudent parameterTypecn.kgc.mybatis.pojo.Studentselect * from student where if teststu_name ! nullstu_name#{stu_name}/ifif teststu_sex! nulland stu_sex#{stu_sex}/if/where /select 这个where标签会知道如果它包含的标签中有返回值的话它就插入一个where。此外如果标签返回的内容是以AND 或OR 开头的则它会剔除掉 动态SQL:ifset 语句 上面的对于查询 SQL 语句包含 where 关键字如果在进行更新操作的时候含有 set 关键词 update idupdateStudentById parameterTypecn.kgc.mybatis.pojo.Studentupdate student stusetif teststuname ! null and stuname ! stu.stu_name #{stuName},/ifif teststusex ! null and stusex ! stu.stu_sex #{stuSex}/if/setwhere id#{id} /update 如果第一个条件 username 为空那么 sql 语句为update user u set u.sex? where id? 如果第一个条件不为空那么 sql 语句为update user u set u.username ? ,u.sex ? where id? 动态SQL:choose(when,otherwise) 语句 有时候我们不想用到所有的查询条件只想选择其中的一个查询条件有一个满足即可使用 choose 标签可以解决此类问题类似于 Java 的 switch 语句 select idselectStudentByChoose resultTypecom.ys.po.User parameterTypecom.ys.po.Userselect * from studentwherechoosewhen testid ! and id ! nullid#{id}/whenwhen testusername ! and username ! nulland username#{username}/whenotherwiseand sex#{sex}/otherwise/choose/where/select 这里我们有三个条件id,username,sex只能选择一个作为查询条件 如果 id 不为空那么查询语句为select * from user where id? 如果 id 为空那么看username 是否为空如果不为空那么语句为 select * from user where username?; 如果 username 为空那么查询语句为 select * from user where sex? 动态SQL:trim 语句 trim标记是一个格式化的标记可以完成set或者是where标记的功能 用 trim 改写上面的 ifwhere 语句 select idselectStudent resultTypestudent parameterTypecn.kgc.mybatis.pojo.Studentselect * from user trim prefixwhere prefixOverrides and | orif teststu_name ! nullstu_name#{stu_name}/ifif teststu_sex! nulland stu_sex#{stu_sex}/if/trim /select ​ prefix前缀   prefixoverride去掉第一个and或者是or    用 trim 改写上面的 ifset 语句 update idupdateStudentById parameterTypecn.kgc.mybatis.pojo.Studentupdate student stutrim prefixset suffixOverrides,if teststuname ! null and stuname ! stu.stu_name #{stuName},/ifif teststusex ! null and stusex ! stu.stu_sex #{stuSex}/if/trimwhere id#{id} /update ​ suffix后缀   suffixoverride去掉最后一个逗号也可以是其他的标记就像是上面前缀中的and一样 动态SQL: foreach 语句 需求我们需要查询 user 表中 id 分别为1,2,3的用户,sql语句 select * from user where id1 or id2 or id3 ​ select * from user where id in (1,2,3) 用 foreach 来改写 select * from user where id1 or id2 or id3 select idselectUserByListId parameterTypecom.ys.vo.UserVo resultTypecom.ys.po.Userselect * from userwhere!--collection:指定输入对象中的集合属性item:每次遍历生成的对象open:开始遍历时的拼接字符串close:结束时拼接的字符串separator:遍历对象之间需要拼接的字符串select * from user where 11 and (id1 or id2 or id3)--foreach collectionids itemid separatororid#{id}/foreach/where /select 用 foreach 来改写 select * from user where id in (1,2,3) select idselectUserByListId parameterTypecom.ys.vo.UserVo resultTypecom.ys.po.Userselect * from user where!--collection:指定输入对象中的集合属性item:每次遍历生成的对象open:开始遍历时的拼接字符串close:结束时拼接的字符串separator:遍历对象之间需要拼接的字符串select * from user where11 and id in (1,2,3)--foreach collectionids itemid openid in (separator, close) #{id}/foreach/where/select 动态SQL: SQL 片段 有时候可能某个 sql 语句我们用的特别多为了增加代码的重用性简化代码我们需要将这些代码抽取出来然后使用时直接调用。 假如我们需要经常根据用户名和性别来进行联合查询那么我们就把这个代码抽取出来如下 sql idselectUserByUserNameAndSexSQLif testusername ! null and username ! AND username #{username}/if    if testsex ! null and sex ! AND sex #{sex}/if /sql select idselectUserByUsernameAndSex resultTypeuser parameterTypecom.ys.po.Userselect * from usertrim prefixwhere prefixOverridesand | or!-- 引用 sql 片段如果refid 指定的不在本文件中那么需要在前面加上 namespace --include refidselectUserByUserNameAndSexSQL/include!-- 在这里还可以引用其他的 sql 片段 --/trim /select 注意①、最好基于 单表来定义 sql 片段提高片段的可重用性 ②、在 sql 片段中最好不要包括 where mybatis注解开发 public interface StudentDao2 { ​Select(select * from student where stu_no #{stu_no})Results({Result(property stuNo ,columnstu_no),Result(property stuSex,column stu_sex),Result(property birth,column stu_birth)})ListStudent getAll(String stu_no); ​Insert(insert into student (stu_no,stu_name,stu_sex,stu_birth)values(#{stuNo},#{stuName},#{stuSex},#{birth}))int addStudent(Student student); ​Delete(delete from student where stu_no #{stu_no})int delOne(String stu_no); ​Update(update student set stu_name #{stuName} where stu_no #{stuNo})int uptStudent(Student student); ​ } mybatis缓存 MyBatis 中的缓存就是说 MyBatis 在执行一次SQL查询或者SQL更新之后这条SQL语句并不会消失而是被MyBatis 缓存起来当再次执行相同SQL语句的时候就会直接从缓存中进行提取而不是再次执行SQL命令。 mybatis的缓存机制有两级 1一级缓存一级缓存mybatsi已经为我们自动开启不用我们手动操作而且我们是关闭不了的但是我们可以手动清除缓存。SqlSession级别.提交事务缓存清空 一级缓存失效的情况 1.不同的SqlSession对应不同的缓存 2.同一个SqlSession但是查询条件不同 3.同一个SqlSession执行两次相同查询之间做了增删改的操作 4.同一个SqlSession执行两次相同查询之间手动清空缓存 2二级缓存二级缓存需要我们手动开启。全局级别 SqlSessionFactory !--开启二级缓存-- ​ 开启二级缓存需要两个步骤第一步在mybatis的全局配置文件中配置Setting属性设置名为cacheEnabled的属性值为true即可 settings!-- (1):开启二级缓存,这个全局的配置二级缓存默认是开启的但是还是需要写上防止版本的更新 --setting namecacheEnabled valuetrue/ /settings ​ 第二步在具体需要二级缓存的mapeer映射文件中开启二级缓存值需要在相应的映射文件中添加一个cache标签即可 2):在相应的映射文件中开启二级缓存 !-- 开启二级缓存 --cache/cache 3)查询数据封装的实体类要实现序列化的接口 4)二级缓存需要在一级缓存关闭或者提交后生效 ​ 二级缓存失效的条件 1.在两次查询之间进行了任意的增删改操作一级二级缓存同时失效 ​ Testpublic void test02(){//验证mybatis的缓存机制 一级缓存 默认开启 sqlsession级别 ​try {InputStream resource Resources.getResourceAsStream(config/mybatis-config.xml);SqlSessionFactory factory new SqlSessionFactoryBuilder().build(resource);SqlSession sqlSession factory.openSession(true);StudentDao mapper1 sqlSession.getMapper(StudentDao.class);StudentDao mapper2 sqlSession.getMapper(StudentDao.class);System.out.println(mapper1);System.out.println(mapper2);ListStudent a1 mapper1.getAll();System.out.println(a1);//手动提交事务 清空缓存sqlSession.commit();ListStudent a2 mapper2.getAll();System.out.println(a2); ​sqlSession.close();} catch (IOException e) {e.printStackTrace();}} ​ ​Testpublic void test03(){//验证mybatis的缓存机制 二级缓存 需要配置mybatis-config.xml 和mapper文件 ​try {InputStream resource Resources.getResourceAsStream(config/mybatis-config.xml);SqlSessionFactory factory new SqlSessionFactoryBuilder().build(resource);SqlSession sqlSession1 factory.openSession(true);SqlSession sqlSession2 factory.openSession(true);SqlSession sqlSession3 factory.openSession(true); ​StudentDao mapper1 sqlSession1.getMapper(StudentDao.class);StudentDao mapper2 sqlSession2.getMapper(StudentDao.class);StudentDao mapper3 sqlSession3.getMapper(StudentDao.class);ListStudent a1 mapper1.getAll();System.out.println(a1);//关闭session将查询结果写入二级缓存sqlSession1.close(); ​//当对同一张表进行增删改操作后 二级缓存清除mapper3.delStudent(2021072901);// sqlSession3.close(); ​ListStudent a2 mapper2.getAll();System.out.println(a2); ​} catch (IOException e) {e.printStackTrace();}} mybatis分页插件 !-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -- dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion5.2.1/version /dependency ​ !--在mybatis配置文件中 配置mybatis插件 --pluginsplugin interceptorcom.github.pagehelper.PageInterceptor!-- 配置mysql方言 --property namehelperDialect valuemysql /!-- 设置为true时如果pageSize0就会查询出全部的结果 --property namepageSizeZero valuetrue /!-- 3.3.0版本可用分页参数合理化默认false禁用 --!-- 启用合理化时如果pageNum1会查询第一页如果pageNumpages会查询最后一页 --!-- 禁用合理化时如果pageNum1或pageNumpages会返回空数据 --property namereasonable valuetrue //plugin/plugins 实例 // 测试分页插件的使用Testpublic void  test06(){SqlSession session factory.openSession(true);StudentDao mapper session.getMapper(StudentDao.class);PageHelper.startPage(5, 3);ListStudent all mapper.findAll();PageInfoStudent pageInfo new PageInfo(all); ​//获取分页的相关数据System.out.println(pageInfo);//获取总条数long total pageInfo.getTotal();System.out.println(total);//获取当前页的显示数据ListStudent list pageInfo.getList();list.forEach(student- System.out.println(student)); ​}