当前位置: 首页 > news >正文

mybatis04-mybatis缓存、分页插件、注解开发(一对一、多对一、多对多)

mybatis04

mybatis 缓存

一、mybatis 缓存概述

1、缓存

​ 缓存 是存在于内存中的临时数据,使用缓存的目的是:减少和数据库的交互次数,提高执行效率。

2、mybatis 缓存

​ mybatis 与 大多数的持久层框架一样,提供了缓存策略,通过策略减少数据库的查询次数,从而提高性能。

3、mybatis 缓存分类

  • 一级缓存
  • 二级缓存

二、一级缓存

1、一级缓存介绍

(1)描述

​ mybatis 一级缓存,是一种 session 级别的,针对同一个会话SqlSession中,执行多次条件完全相同的同一个SQL,那么会共享这一个缓存。

(2)特点
  • 自带的,不能卸载
  • SQLSession 级别的,使用无需配置

2、一级缓存结构图

在这里插入图片描述

3、一级缓存示例代码

(1)项目结构和pom.xml、jdbc.properties、mybatisConfig.xml文件与mybatis03一样
(2)持久层接口 StudentMapper.java
package com.etime.mapper;import com.etime.pojo.Student;import java.util.List;public interface StudentMapper {List<Student> getAllStudent();
}
(3)持久层接口映射文件 StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.etime.mapper.StudentMapper"><select id="getAllStudent" resultType="Student">SELECT * FROM student</select></mapper>
(4)在mybatisConfig.xml文件中设置setting
<settings><!--日志打印--><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
  • 注意setting标签的位置
(5)编写测试方法
 @Testpublic void t01() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);List<Student> list1 = studentMapper.getAllStudent();list1.forEach(System.out::println);System.out.println("----------------------------------");List<Student> list2 = studentMapper.getAllStudent();list2.forEach(System.out::println);sqlSession.close();}

在这里插入图片描述

4、一级缓存分析

​ 从上面的代码可以出,我们写了两次查询操作,但在访问数据时,只有一次。

​ 第一次先从一级缓存中获取,因为session是新创建的,一级缓存中没有数据,于是就查询数据获取数据,然后把查询的数据放到一级缓存中,此时一定要注意的是,一级缓存是一个Map集合,map的key是你的查询条件字符串,值就是查询出来的对象。

​ 第二次查询时,先从一缓存中获取,因为上一次查询后已经放到一级缓存中了,所以从一级缓存中获取到了,就不用访问数据库了,减少和数据次的一次交互,提高了执行效率。

5、一级缓存的清空

  • 代码
@Test
public void test01(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = studentMapper.getAllStudent();// 清理以及缓存sqlSession.clearCache();list.forEach(System.out::println);System.out.println("--------------------------");List<Student> list2 = studentMapper.getAllStudent();list2.forEach(System.out::println);sqlSession.close();
}
  • 结果
    在这里插入图片描述

6、总结一级缓存清空三种方式

  • clearCache();
  • 执行数据库的操作:delete、insert、update;
  • 手动提交事务:commit();
    • 对于查询来说,事务可以不提交。故使用该方式需考虑情况

三、二级缓存

1、二级缓存介绍

(1)描述

​ 二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个
SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

(2)特点
  • 默认不开启
  • 使用需配置

2、二级缓存结构图

在这里插入图片描述

3、二级缓存的开启与关闭

(1)在mybatisConfig.xml文件中开启二级缓存
<settings><!--日志打印--><setting name="logImpl" value="STDOUT_LOGGING"/><!--开启二级缓存--><setting name="cacheEnabled" value="true"/>
</settings>
  • cacheEnabled
    • true:默认值,开启
    • false:关闭
(2)配置映射文件 StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入dtd约束-->
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是当前mapper对应的接口-->
<mapper namespace="com.etime.mapper.StudentMapper"><cache></cache><select id="getAllStudent" resultType="Student">select * from student</select>
</mapper>
  • 注意:cache标签的位置
(3)在映射文件 StudentMapper.xml 配置statement 上面的 userCache属性
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入dtd约束-->
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是当前mapper对应的接口-->
<mapper namespace="com.etime.mapper.StudentMapper"><cache></cache><select id="getAllStudent" resultType="Student" useCache="true">select * from student</select>
</mapper>
  • useCache
    • true:开启
    • false:关闭
  • 注意:针对每次查询都需要最新的数据sql,要禁用二级缓存
(4)二级缓存测试
a.实体类需要序列化
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student implements Serializable {private int sid;private String sname;private int cid;
}
b.测试方法
@Test
public void test01(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = studentMapper.getAllStudent();sqlSession.clearCache();list.forEach(System.out::println);System.out.println("--------------------------");List<Student> list2 = studentMapper.getAllStudent();list2.forEach(System.out::println);sqlSession.close();
}

在这里插入图片描述

4、二级缓存分析

​ 从结果可以看出,第一次查询将所有学生信息存入一级缓存,然后存入二级缓存中。

​ 第二次查询,我们现将一级缓存清除,再进行查询发现是从二级缓存取出的学生信息,但它又从数据库中查询数据。

​ 可以得出结论,在没有清除一级缓存时,我们是从二级缓存中取得的数据。

mybatis 分页插件

一、什么是分页

​ 分页是将所有数据分段展示各用户的技术,用户所看到的数据只是一部分。若用户没有想要的内容,可通过指定页面、翻页的方式转换内容。

二、分页的好处

1、提高性能

​ 数据量很大,若一次性查出,浪费内存 ,降低了效率。

2、展现层面的考虑

​ 不好排版,不美观

三、分页插件的使用

1、引入依赖,在pom.xml文件中

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.10</version>
</dependency>

2、在mybatisConfig.xml配置文件中 配置分页

  • 注意:配置分页的位置在environments标签之前
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

3、在接口 StudentMapper.java 中定义方法

package com.etime.mapper;import com.etime.pojo.Student;import java.util.List;public interface StudentMapper {List<Student> getAllStudent();
}

4、 在映射文件 StudentMapper.xml 配置信息

<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入dtd约束-->
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是当前mapper对应的接口-->
<mapper namespace="com.etime.mapper.StudentMapper"><cache></cache><select id="getAllStudent" resultType="Student" useCache="true">select * from student</select>
</mapper>

5、测试

@Test
public void test02() {// 设置当前页码及每页显示条数 必须在获得sqlSession对象的前面设置PageHelper.startPage(1,2);SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = studentMapper.getAllStudent();// 从查到的数据 取出当前页数据,生成pageInfo对象PageInfo<Student> pageInfo = new PageInfo<>(list);// 从pageInfo对象中获取当页数据List<Student> pageList = pageInfo.getList();System.out.println("当前页数据");pageList.forEach(System.out::println);// 获取总数据条数long total = pageInfo.getTotal();System.out.println("总数据条数 = " + total);// 获取总页数int pages = pageInfo.getPages();System.out.println("总页数 = " + pages);sqlSession.close();
}

mybatis 注解开发

一、mybatis 注解开发概述

​ 注解提供了一种简单的方式来实现 简单映射语句,而不糊引入大量的开销。

​ 能够读懂别人的代码,特别是框架相关的代码。

​ 本来是可能需要很多配置文件,需要很多逻辑才能实现事务使用一个或多个注解来替代,这样就使得编程更加简洁,代码更加清晰。

二、mybatis 注解介绍

注解描述
@Insert新增
@Update更新
@Delete删除
@Select查询
@Result结果封装集
@Results与@Result使用,封装多个结果集
@ResultMap引用@Results定义的封装
@One一对一结果封装集
@Many一对多结果哦封装集
@SelectProvider动态SQL映射
@CacheNamespace注解二级缓存的使用

三、注解实现基本增删改查

1、实体类

  • 学生类
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private int sid;private String sname;private int cid;
}

2、在接口 StudentMapper中定义方法并使用注解

  • mybatisConfig.xml 中映射文件的注册信息不变
  • 将resource资源包中的 映射文件给删除
package com.etime.mapper;import com.etime.pojo.Student;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;public interface StudentMapper {@Select("select * from student")List<Student> getAllStudent();@Insert("insert into student(sname,cid) values(#{sname},#{cid})")int addStudent(Student student);@Update("update student set sname=#{sname},cid=#{cid} where sid=#{sid}")int updateStudent(Student student);@Delete("delete from student where sid=#{sid}")int deleteStudentBySid(int sid);
}

3、测试

package com.etime.test;import com.etime.mapper.StudentMapper;
import com.etime.pojo.Student;
import com.etime.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class StudentTest {@Testpublic void test01(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = mapper.getAllStudent();list.forEach(System.out::println);sqlSession.close();}@Testpublic void test02() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);int res = mapper.addStudent(new Student(0, "胡神哎", 1));System.out.println("res = " + res);sqlSession.close();}@Testpublic void test03() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);int res = mapper.updateStudent(new Student(8, "胡-寂", 1));System.out.println("res = " + res);sqlSession.close();}@Testpublic void test04() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);int res = mapper.deleteStudentBySid(8);System.out.println("res = " + res);sqlSession.close();}
}

四、复杂关系的注解

1、注解介绍

(1)@Results注解
  • 代替标签:
  • 使用示例:@Results({@Result(),@Result()})或者 @Results(@Result())
  • 使用说明:该注解中可以使用单个 @Result,或 @Result集合
(2)@Result注解
  • 代替标签:、
  • @Result 属性介绍
    • id:是否 是主键字段
    • properties:需要配置实体类的属性
    • column:数据库表的列名
    • one:需使用 @One 注解
      • 例:@Result(one=@One)
    • many:需使用 @Many 注解
      • 例:@Result(many=@Many)
(3)@One注解
  • 描述:一对一,是多表插叙的关键,用来指定子查询返回单一对象。
  • 代替标签:
  • @One 属性介绍
    • select:指定多表查询的 sqlMaper。使用完全限定名确定方法的位置。
  • 示例:@Result(column=" “,property=”“,one=@One(select=”"))
(4)@Many 注解
  • 描述:多对一,是多表查询的关键,指定子查询返回对象集合
  • 代替标签:
  • 注意:聚集元素用来处理“一对多”的关系。需要执行映射的java实体类的属性,属性的javaType。
  • 示例:@Result(property=“”,column=“”,many=@Many(select=“”,javaType=“”))

2、一对一关系注解

(1)实体类
  • 以妻子表 和 丈夫表为例

  • 妻子类

package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Wife {private int wid;private String wname;
}
  • 丈夫类(主体)
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Husband {private int hid;private String hname;private int wid;private Wife wife;
}
(2)在接口 HusbandMapper.java 中使用注解方法
package com.etime.mapper;import com.etime.pojo.Husband;
import com.etime.pojo.Wife;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface HusbandMapper {// 查询所有丈夫中,对应一对一的妻子@Select("select * from husband")@Results({@Result(property = "hid",column = "hid"),@Result(property = "hname",column = "hname"),@Result(property = "wid",column = "wid"),/*javaType:指定类型column:指定传入那列 为参数one:一对一,返回一个对象select:子查询的方法的位置*/@Result(property = "wife",javaType = Wife.class,column = "wid",one = @One(select = "com.etime.mapper.WifeMapper.getWifeByWid"))})List<Husband> getAllHusband();
}
(3)在接口 WifeMapper.java 中使用注解方法,定义子查询
package com.etime.mapper;import com.etime.pojo.Wife;
import org.apache.ibatis.annotations.Select;public interface WifeMapper {@Select("select * from wife where wid=#{wid}")Wife getWifeByWid(int wid);
}
(4)测试
package com.etime.test;import com.etime.mapper.HusbandMapper;
import com.etime.pojo.Husband;
import com.etime.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class HusbandTest {@Testpublic void test01(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();HusbandMapper mapper = sqlSession.getMapper(HusbandMapper.class);List<Husband> list = mapper.getAllHusband();list.forEach(System.out::println);sqlSession.close();}
}

3、多对一关系注解

  • 以学生和班级为例
多对一
(1) 实体类
  • 班级类
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Classes {private int cid;private String cname;}
  • 学生类(主体)
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private int sid;private String sname;private int cid;private Classes classes;
}
(2)在接口StudentMapper.java中使用注解方法
@Select("select * from student")
@Results({@Result(property = "sid",column = "sid"),@Result(property = "sname",column = "sname"),@Result(property="cid",column = "cid"),@Result(property = "classes",javaType = Classes.class,column = "cid",one = @One(select = "com.etime.mapper.ClassesMapper.getClassesByCid"))
})
List<Student> getAllStudentAndClasses();
(3)在接口ClassesMapper.java中使用注解方法
@Select("select * from classes where cid=#{cid}")
Classes getClassesByCid(int cid);
(4)测试
@Test
public void test05() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = mapper.getAllStudentAndClasses();list.forEach(System.out::println);sqlSession.close();
}
一对多
(1) 实体类
  • 学生类
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private int sid;private String sname;private int cid;
}
  • 班级类(主体)
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Classes {private int cid;private String cname;private List<Student> studentList;
}
(2)在接口ClassesMapper.java中使用注解方法
package com.etime.mapper;import com.etime.pojo.Classes;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface ClassesMapper {@Select("select * from classes where cid=#{cid}")Classes getClassesByCid(int cid);@Select("select * from classes")@Results({@Result(property = "cid",column = "cid"),@Result(property = "cname",column = "cname"),@Result(property = "studentList",javaType = List.class,column = "cid",many = @Many(select = "com.etime.mapper.StudentMapper.getStudentByCid"))})List<Classes> getAllClassesAndStudent();
}
(3)在接口StudentMapper.java中使用注解方法
@Select("select * from student where cid=#{cid}")
List<Student> getStudentByCid(int cid);
(4)测试
package com.etime.test;import com.etime.mapper.ClassesMapper;
import com.etime.pojo.Classes;
import com.etime.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class ClassesTest {@Testpublic void test01(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);List<Classes> list = mapper.getAllClassesAndStudent();list.forEach(System.out::println);sqlSession.close();}
}

4、多对多关系注解

(1)实体类
  • 以 学生、课程、中间表为例

  • 课程类

package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Course {private int courseid;private String coursename;
}
  • 中间表类(第二主体)
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
@Data
public class StudentCourse {private int scid;private int sid;private int courseid;private Course course;
}
  • 学生类(第一主体)
package com.etime.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {private int sid;private String sname;private int cid;private List<StudentCourse> studentCourseList;
}
(2)在接口 StudentMapper.java中 编写使用注解方法
@Select("select * from student")
@Results({@Result(property = "sid",column = "sid"),@Result(property = "sname",column = "sname"),@Result(property = "cid",column = "cid"),@Result(property = "studentCourseList",javaType = List.class,column = "sid",many = @Many(select = "com.etime.mapper.StudentCourseMapper.getStudentCourseBySid"))
})
List<Student> getStudentAndCourse();
(3)在接口 StudentCourseMapper.java中 编写使用注解方法
package com.etime.mapper;import com.etime.pojo.Course;
import com.etime.pojo.StudentCourse;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface StudentCourseMapper {@Select("select * from studentcourse where sid=#{sid}")@Results({@Result(property = "scid",column = "scid"),@Result(property = "sid",column = "sid"),@Result(property = "courseid",column = "courseid"),@Result(property = "course",javaType = Course.class,column = "sid",one = @One(select = "com.etime.mapper.CourseMapper.getCourseByCid"))})List<StudentCourse> getStudentCourseBySid(int sid);
}
(4)在接口 CourseMapper.java中 编写使用注解方法
package com.etime.mapper;import com.etime.pojo.Course;
import org.apache.ibatis.annotations.Select;public interface CourseMapper {@Select("select * from course where cid=#{cid}")Course getCourseByCid(int cid);
}
(5)测试
@Test
public void test06() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = mapper.getAllStudentAndClasses();list.forEach(System.out::println);sqlSession.close();
}
(4)在接口 CourseMapper.java中 编写使用注解方法
package com.etime.mapper;import com.etime.pojo.Course;
import org.apache.ibatis.annotations.Select;public interface CourseMapper {@Select("select * from course where cid=#{cid}")Course getCourseByCid(int cid);
}
(5)测试
@Test
public void test06() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = mapper.getAllStudentAndClasses();list.forEach(System.out::println);sqlSession.close();
}

相关文章:

mybatis04-mybatis缓存、分页插件、注解开发(一对一、多对一、多对多)

mybatis04 mybatis 缓存 一、mybatis 缓存概述 1、缓存 ​ 缓存 是存在于内存中的临时数据&#xff0c;使用缓存的目的是&#xff1a;减少和数据库的交互次数&#xff0c;提高执行效率。 2、mybatis 缓存 ​ mybatis 与 大多数的持久层框架一样&#xff0c;提供了缓存策略…...

软件平台接口常见问题汇总

接口常见问题汇总 一、接口技术层面 1、输入参数验证校验不全面。如&#xff1a; 1.1入参数据类型长度边界&#xff0c;范围边界。 1.2 入参数据内容、成员内容&#xff0c;有效无效&#xff0c;合法非法。 1.3 入参数据 特殊字符 敏感字符过滤。 1.4 入参可否必选。 2、接口…...

SparkStreaming学习之——无状态与有状态转化、遍历kafka的topic消息、WindowOperations

目录 一、状态转化 二、kafka topic A→SparkStreaming→kafka topic B (一)rdd.foreach与rdd.foreachPartition (二)案例实操1 1.需求&#xff1a; 2.代码实现&#xff1a; 3.运行结果 (三)案例实操2 1.需求&#xff1a; 2.代码实现&#xff1a; 3.运行结果 三、W…...

上市公司碳排放测算数据(1992-2022年)

根据《温室气体核算体系》&#xff0c;企业的碳排放可以分为三个范围。 范围一是直接温室气体排放&#xff0c;产生于企业拥有或控制的排放源&#xff0c;例如企业拥有或控制的锅炉、熔炉、车辆等产生的燃烧排放&#xff1b;拥有或控制的工艺设备进行化工生产所产生的排放。 范…...

Springboot 整合 JPA 及 Swagger2

首先是官方文档&#xff1a; Spring Data JPA - Reference Documentationhttps://docs.spring.io/spring-data/jpa/docs/2.2.4.RELEASE/reference/html/#repositories.query-methods 1、JPA相关概念 2、创建 Springboot 项目 修改 pom 文件&#xff0c;可以直接进行复制粘贴&a…...

android aidl

本文只是记录个人学习aidl的实现&#xff0c;如需学习请参考下面两篇教程 官方文档介绍Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 本文参考文档Android进阶——AIDL详解_android aidl_Yawn__的博客-CSDN博客 AIDL定义&#xff1a;Android 接口…...

MYSQL---主从同步概述与配置

一、MYSQL主从同步概述 1、什么是MySQL主从同步&#xff1f; 实现数据自动同步的服务结构 主服务器(master): 接受客户端访问连接 从服务器(slave)&#xff1a;自动同步主服务器数据 2、主从同步原理 Maste&#xff1a;启用binlog 日志 Slave&#xff1a;Slave_IO: 复制master主…...

WebClient学习

1. 介绍 Java中传统的RestTemplate 的主要问题在于不支持响应式流规范&#xff0c;也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端&#xff0c;属于Spring5中的spring-webflux库 2. 依赖 maven依赖 <dependency><groupId>org.springfra…...

「计算机控制系统」6. 直接设计法

特殊类型系统的最小拍无差设计 一般系统的最小拍无差设计 最小拍控制器的工程化改进 Dahlin算法 文章目录 特殊类型系统的最小拍无差设计理论分析典型输入函数的最小拍无差系统 一般系统的最小拍无差设计有波纹最小拍无差设计无波纹最小拍无差设计 最小拍控制器的工程化改进针对…...

什么是JWT?

起源 需要了解一门技术&#xff0c;首先从为什么产生开始说起是最好的。JWT 主要用于用户登录鉴权&#xff0c;所以我们从最传统的 session 认证开始说起。 session认证 众所周知&#xff0c;http 协议本身是无状态的协议&#xff0c;那就意味着当有用户向系统使用账户名称和…...

STM32—0.96寸OLED液晶显示

本文主要介绍基于STM32F103的0.96寸的OLED液晶显示&#xff0c;详细关于0.96寸OLED液晶屏幕的介绍可参考这篇博客&#xff1a;https://blog.csdn.net/u011816009/article/details/130119426 一、简介 OLED被称为有机激光二极管&#xff0c;也被称为有机激光显示&#xff0c;O…...

Mysql的简介和选择

文章目录 前言一、为什么要使用数据库 数据库的概念为什么要使用数据库二、程序员为什么要学习数据库三、数据库的选择 主流数据库简介使用MySQL的优势版本选择四、Windows 平台下安装与配置MySQL 启动MySQL 服务控制台登录MySQL命令五、Linux 平台下安装与配置MySQL总结 前言…...

3D视觉之深度相机方案

随着机器视觉&#xff0c;自动驾驶等颠覆性的技术逐步发展&#xff0c;采用 3D 相机进行物体识别&#xff0c;行为识别&#xff0c;场景 建模的相关应用越来越多&#xff0c;可以说 3D 相机就是终端和机器人的眼睛。 3D 相机 3D 相机又称之为深度相机&#xff0c;顾名思义&…...

Mysql列的完整性约束详解(主键约束)

文章目录 前言一、设置表字段的主键约束&#xff08;PRIMARY KEY&#xff0c;PK&#xff09; 1.单字段主键2.多字段主键总结 前言 完整性约束条件是对字段进行限制&#xff0c;要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件&#xff0c;数据库系统将不再…...

母婴市场竞争激烈,如何通过软文营销脱颖而出

如今&#xff0c;随着宝宝数量增加以及人们对孩子的重视程度的增加&#xff0c;母婴市场愈发火爆。然而&#xff0c;母婴行业的竞争也越来越激烈&#xff0c;企业需要不断开拓新市场才能生存。在这样的情况下&#xff0c;软文营销成为了母婴企业拓展市场的一种有效方式。 首先&…...

java--线程池

目录 1.线程池概 2 为什么要使用线程池 1创建线程问题 2解决上面两个问题思路&#xff1a; 3线程池的好处 4线程池适合应用场景 3 线程池的构造函数参数 1.corePoolSize int 线程池核心线程大小 2.maximumPoolSize int 线程池最大线程数量 3.keepAliveTime long 空闲…...

asp.net765数码手机配件租赁系统

员工部分功能 1.员工登录&#xff0c;员工通过自己的账号和密码登录到系统中来&#xff0c;对租赁信息进行管理 2.配件查询&#xff0c;员工可以查询系统内的配件信息 3.客户信息管理&#xff0c;员工可以管理和店内有业务往来的客户信息 4.配件租赁&#xff0c;员工可以操作用…...

有关态势感知(SA)的卷积思考

卷积是一种数学运算&#xff0c;其本质是将两个函数进行操作&#xff0c;其中一个函数是被称为卷积核或滤波器的小型矩阵&#xff0c;它在另一个函数上滑动并产生新的输出。在计算机视觉中&#xff0c;卷积通常用于图像处理和特征提取&#xff0c;它可以通过滤波器对输入图像进…...

Docker快速部署springboot项目

有很多开发者在项目部署过程中都会遇到一些繁琐的问题&#xff0c;比如打包、上传、部署等。而使用Docker可以非常方便地解决这些问题。在本文中&#xff0c;将详细讲解如何使用IDEA中的docker打包插件&#xff0c;将代码打包并直接发布到服务器上。这样&#xff0c;我们就可以…...

Linux命令rsync增量同步目录下的文件

业务场景描述 最近遇到一个问题&#xff0c;需要编写相应的Linux命令&#xff0c;增量同步/var/mysql里的所有文件到另外一个目录/opt/mysql&#xff0c;但是里面相关的日志文件xx.log是不同步的&#xff0c;这个场景&#xff0c;可以使用rsync来实现 什么是rsync命令&#x…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...