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

Mybatis学习笔记二

目录

  • 一、MyBatis的各种查询功能
    • 1.1 查询一个实体类对象
    • 1.2 查询一个List集合
    • 1.3 查询单个数据
    • 1.4 查询一条数据为map集合
    • 1.5 查询多条数据为map集合
      • 1.5.1 方法一:
      • 1.5.2 方法二:
  • 二、特殊SQL的执行
    • 2.1 模糊查询
    • 2.2 批量删除
    • 2.3 动态设置表名
    • 2.4 添加功能获取自增的主键
  • 三、自定义映射resultMap
    • 3.1 多对一映射处理
    • 3.2 一对多映射处理
    • 3.3 延迟加载
  • 四、动态SQL
    • 4.1 if
    • 4.2 where
    • 4.3 trim
    • 4.4 choose、when、otherwise
    • 4.5 foreach
    • 4.6 SQL片段

一、MyBatis的各种查询功能

  1. 如果查询出的数据只有一条,可以通过
    1. 实体类对象接收
    2. List集合接收
    3. Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}
  2. 如果查询出的数据有多条,一定不能用实体类对象接收,会抛异常TooManyResultsException,可以通过
    1. 实体类类型的LIst集合接收
    2. Map类型的LIst集合接收
    3. 在mapper接口的方法上添加@MapKey注解

1.1 查询一个实体类对象

/**
* 根据用户id查询用户信息
* @param id
* @return
*/
User getUserById(@Param("id") int id);
<!--User getUserById(@Param("id") int id);-->
<select id="getUserById" resultType="User">select * from t_user where id = #{id}
</select>

1.2 查询一个List集合

/*** 查询所有用户信息* @return*/
List<User> getUserList();
<!--List<User> getUserList();-->
<select id="getUserList" resultType="User">select * from t_user
</select>

1.3 查询单个数据

/**  * 查询用户的总记录数  * @return  * 在MyBatis中,对于Java中常用的类型都设置了类型别名  * 例如:java.lang.Integer-->int|integer  * 例如:int-->_int|_integer  * 例如:Map-->map,List-->list  */  
int getCount();
<!--int getCount();-->
<select id="getCount" resultType="_integer">select count(id) from t_user
</select>

1.4 查询一条数据为map集合

/**  * 根据用户id查询用户信息为map集合  * @param id  * @return  */  
Map<String, Object> getUserToMap(@Param("id") int id);
<!--Map<String, Object> getUserToMap(@Param("id") int id);-->
<select id="getUserToMap" resultType="map">select * from t_user where id = #{id}
</select>
<!--结果:{password=123456, sex=男, id=1, age=23, username=admin}-->

1.5 查询多条数据为map集合

1.5.1 方法一:

/**  * 查询所有用户信息为map集合  * @return  * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取  */  
List<Map<String, Object>> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->  
<select id="getAllUserToMap" resultType="map">  select * from t_user  
</select>
<!--结果:[{password=123456, sex=男, id=1, age=23, username=admin},{password=123456, sex=男, id=2, age=23, username=张三},{password=123456, sex=男, id=3, age=23, username=张三}]
-->

1.5.2 方法二:

/*** 查询所有用户信息为map集合* @return* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合*/
@MapKey("id")
Map<String, Object> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">select * from t_user
</select>
<!--结果:{1={password=123456, sex=男, id=1, age=23, username=admin},2={password=123456, sex=男, id=2, age=23, username=张三},3={password=123456, sex=男, id=3, age=23, username=张三}}
-->

二、特殊SQL的执行

2.1 模糊查询

/*** 根据用户名进行模糊查询* @param username * @date 2022/2/26 21:56*/
List<User> getUserByLike(@Param("username") String username);
<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User"><!--select * from t_user where username like '%${mohu}%'-->  <!--select * from t_user where username like concat('%',#{mohu},'%')-->  select * from t_user where username like "%"#{mohu}"%"
</select>

其中select * from t_user where username like “%”#{mohu}"%"是最常用的

2.2 批量删除

只能使用${},如果使用#{},则解析后的sql语句为delete from t_user where id in (‘1,2,3’),这样是将1,2,3看做是一个整体,只有id为1,2,3的数据会被删除。正确的语句应该是delete from t_user where id in (1,2,3),或者delete from t_user where id in (‘1’,‘2’,‘3’)

/*** 根据id批量删除* @param ids * @return int* @date 2022/2/26 22:06*/
int deleteMore(@Param("ids") String ids);
<delete id="deleteMore">delete from t_user where id in (${ids})
</delete>
//测试类
@Test
public void deleteMore() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);int result = mapper.deleteMore("1,2,3,8");System.out.println(result);
}

2.3 动态设置表名

  • 只能使用${},因为表名不能加单引号
/*** 查询指定表中的数据* @param tableName */
List<User> getUserByTable(@Param("tableName") String tableName);
<!--List<User> getUserByTable(@Param("tableName") String tableName);-->
<select id="getUserByTable" resultType="User">select * from ${tableName}
</select>

2.4 添加功能获取自增的主键

  • 使用场景
    • t_clazz(clazz_id,clazz_name)
    • t_student(student_id,student_name,clazz_id)
    1. 添加班级信息
    2. 获取新添加的班级的id
    3. 为班级分配学生,即将某学生班级id修改为新添加的班级的id
  • 在mapper.xml中设置两个属性
    • useGeneratedKeys:设置使用自增的主键
    • keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中,指定实体类中的哪个变量接收自增id
/*** 添加用户信息* @param user * @date 2022/2/27 15:04*/
void insertUser(User user);
<!--void insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
</insert>
//测试类
@Test
public void insertUser() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);User user = new User(null, "ton", "123", 23, "男", "123@321.com");mapper.insertUser(user);System.out.println(user);//输出:user{id=10, username='ton', password='123', age=23, sex='男', email='123@321.com'},自增主键存放到了user的id属性中
}

三、自定义映射resultMap

resultMap处理字段和属性的映射关系

  • resultMap:设置自定义映射
    • 属性:
      • id:表示自定义映射的唯一标识,不能重复
      • type:查询的数据要映射的实体类的类型
    • 子标签:
      • id:设置主键的映射关系
      • result:设置普通字段的映射关系
      • 子标签属性:
        • property:设置映射关系中实体类中的属性名
        • column:设置映射关系中表中的字段名
  • 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射,也就是全部属性都要列出来
<resultMap id="empResultMap" type="Emp"><id property="eid" column="eid"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result>
</resultMap>
<!--List<Emp> getAllEmp();-->
<select id="getAllEmp" resultMap="empResultMap">select * from t_emp
</select>

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)。此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系 .

  1. 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
<!--List<Emp> getAllEmp();-->
<select id="getAllEmp" resultType="Emp">select eid,emp_name empName,age,sex,email from t_emp
</select>
  1. 可以在MyBatis的核心配置文件中的setting标签中,设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰,例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为userName。
<settings><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

3.1 多对一映射处理

查询员工信息以及员工所对应的部门信息

public class Emp {  private Integer eid;  private String empName;  private Integer age;  private String sex;  private String email;  private Dept dept;//...构造器、get、set方法等
}

第一种方法:级联方式处理映射关系

<resultMap id="empAndDeptResultMapOne" type="Emp"><id property="eid" column="eid"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result><result property="dept.did" column="did"></result><result property="dept.deptName" column="dept_name"></result>
</resultMap>
<!--Emp getEmpAndDept(@Param("eid")Integer eid);-->
<select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
</select>

第二种方法:使用association处理映射关系

  • association:处理多对一的映射关系
  • property:需要处理多对的映射关系的属性名
  • javaType:该属性的类型
<resultMap id="empAndDeptResultMapTwo" type="Emp"><id property="eid" column="eid"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result><association property="dept" javaType="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result></association>
</resultMap>
<!--Emp getEmpAndDept(@Param("eid")Integer eid);-->
<select id="getEmpAndDept" resultMap="empAndDeptResultMapTwo">select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
</select>

第三种方法:分步查询

  1. 查询员工信息
    select:设置分布查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
    column:设置分步查询的条件
//EmpMapper里的方法
/*** 通过分步查询,员工及所对应的部门信息* 分步查询第一步:查询员工信息* @param  */
Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);
<resultMap id="empAndDeptByStepResultMap" type="Emp"><id property="eid" column="eid"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result><association property="dept"select="com.lx.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"column="did"></association>
</resultMap>
<!--Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);-->
<select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">select * from t_emp where eid = #{eid}
</select>

2.查询部门信息

//DeptMapper里的方法
/*** 通过分步查询,员工及所对应的部门信息* 分步查询第二步:通过did查询员工对应的部门信息* @param*/
Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);
<!--此处的resultMap仅是处理字段和属性的映射关系-->
<resultMap id="EmpAndDeptByStepTwoResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result>
</resultMap>
<!--Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);-->
<select id="getEmpAndDeptByStepTwo" resultMap="EmpAndDeptByStepTwoResultMap">select * from t_dept where did = #{did}
</select>

3.2 一对多映射处理

public class Dept {private Integer did;private String deptName;private List<Emp> emps;//...构造器、get、set方法等
}java

collection

  • collection:用来处理一对多的映射关系
  • ofType:表示该属性对应的集合中存储的数据的类型
<resultMap id="DeptAndEmpResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><collection property="emps" ofType="Emp"><id property="eid" column="eid"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result></collection>
</resultMap>
<!--Dept getDeptAndEmp(@Param("did") Integer did);-->
<select id="getDeptAndEmp" resultMap="DeptAndEmpResultMap">select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}
</select>

分步查询
1.查询部门信息

/*** 通过分步查询,查询部门及对应的所有员工信息* 分步查询第一步:查询部门信息* @param did */
Dept getDeptAndEmpByStepOne(@Param("did") Integer did);
<resultMap id="DeptAndEmpByStepOneResultMap" type="Dept"><id property="did" column="did"></id><result property="deptName" column="dept_name"></result><collection property="emps"select="com.lx.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"column="did"></collection>
</resultMap>
<!--Dept getDeptAndEmpByStepOne(@Param("did") Integer did);-->
<select id="getDeptAndEmpByStepOne" resultMap="DeptAndEmpByStepOneResultMap">select * from t_dept where did = #{did}
</select>

2.根据部门id查询部门中的所有员工

/*** 通过分步查询,查询部门及对应的所有员工信息* 分步查询第二步:根据部门id查询部门中的所有员工* @param did*/
List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);
<!--List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);-->
<select id="getDeptAndEmpByStepTwo" resultType="Emp">select * from t_emp where did = #{did}
</select>

3.3 延迟加载

  • 分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
    • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
    • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载
  • 此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)|eager(立即加载)”
<settings><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/>
</settings>
@Test
public void getEmpAndDeptByStepOne() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);Emp emp = mapper.getEmpAndDeptByStepOne(1);System.out.println(emp.getEmpName());
}
  • 关闭延迟加载,两条SQL语句都运行了
    -
  • 开启延迟加载,只运行获取emp的SQL语句
    在这里插入图片描述
  • fetchType:当开启了全局的延迟加载之后,可以通过该属性手动控制延迟加载的效果,fetchType=“lazy(延迟加载)|eager(立即加载)”
<resultMap id="empAndDeptByStepResultMap" type="Emp"><id property="eid" column="eid"></id><result property="empName" column="emp_name"></result><result property="age" column="age"></result><result property="sex" column="sex"></result><result property="email" column="email"></result><association property="dept"select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"column="did"fetchType="lazy"></association>
</resultMap>

四、动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题

4.1 if

  • if标签可通过test属性(即传递过来的数据)的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行
  • 在where后面添加一个恒成立条件1=1
    • 这个恒成立条件并不会影响查询的结果
    • 这个1=1可以用来拼接and语句,例如:当empName为null时
      • 如果不加上恒成立条件,则SQL语句为select * from t_emp where and age = ? and sex = ? and email = ?,此时where会与and连用,SQL语句会报错
      • 如果加上一个恒成立条件,则SQL语句为select * from t_emp where 1= 1 and age = ? and sex = ? and email = ?,此时不报错
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">select * from t_emp where 1=1<if test="empName != null and empName !=''">and emp_name = #{empName}</if><if test="age != null and age !=''">and age = #{age}</if><if test="sex != null and sex !=''">and sex = #{sex}</if><if test="email != null and email !=''">and email = #{email}</if>
</select>

4.2 where

where和if一般结合使用:

  • 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
  • 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and/or去掉
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">select * from t_emp<where><if test="empName != null and empName !=''">emp_name = #{empName}</if><if test="age != null and age !=''">and age = #{age}</if><if test="sex != null and sex !=''">and sex = #{sex}</if><if test="email != null and email !=''">and email = #{email}</if></where>
</select>

注意:where标签不能去掉条件后多余的and/or

<!--这种用法是错误的,只能去掉条件前面的and/or,条件后面的不行-->
<if test="empName != null and empName !=''">emp_name = #{empName} and
</if>
<if test="age != null and age !=''">age = #{age}
</if>

4.3 trim

  • trim用于去掉或添加标签中的内容
  • 常用属性
    • prefix:在trim标签中的内容的前面添加某些内容
    • suffix:在trim标签中的内容的后面添加某些内容
    • prefixOverrides:在trim标签中的内容的前面去掉某些内容
    • suffixOverrides:在trim标签中的内容的后面去掉某些内容
  • 若trim中的标签都不满足条件,则trim标签没有任何效果,也就是只剩下select * from t_emp
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">select * from t_emp<trim prefix="where" suffixOverrides="and|or"><if test="empName != null and empName !=''">emp_name = #{empName} and</if><if test="age != null and age !=''">age = #{age} and</if><if test="sex != null and sex !=''">sex = #{sex} or</if><if test="email != null and email !=''">email = #{email}</if></trim>
</select>
//测试类
@Test
public void getEmpByCondition() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);List<Emp> emps= mapper.getEmpByCondition(new Emp(null, "张三", null, null, null, null));System.out.println(emps);
}

在这里插入图片描述

4.4 choose、when、otherwise

  • choose、when、otherwise相当于if…else if…else
  • when至少要有一个,otherwise至多只有一个
<select id="getEmpByChoose" resultType="Emp">select * from t_emp<where><choose><when test="empName != null and empName != ''">emp_name = #{empName}</when><when test="age != null and age != ''">age = #{age}</when><when test="sex != null and sex != ''">sex = #{sex}</when><when test="email != null and email != ''">email = #{email}</when><otherwise>did = 1</otherwise></choose></where>
</select>
@Test
public void getEmpByChoose() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);List<Emp> emps = mapper.getEmpByChoose(new Emp(null, "张三", 23, "男", "123@qq.com", null));System.out.println(emps);
}

在这里插入图片描述
只要满足一个when条件,后面的when就不会再判断了。

4.5 foreach

  • 属性:
    • collection:设置要循环的数组或集合
    • item:表示集合或数组中的每一个数据
    • separator:设置循环体之间的分隔符,分隔符前后默认有一个空格,如,
    • open:设置foreach标签中的内容的开始符
    • close:设置foreach标签中的内容的结束符
  • 批量删除
<!--int deleteMoreByArray(Integer[] eids);-->
<delete id="deleteMoreByArray">delete from t_emp where eid in<foreach collection="eids" item="eid" separator="," open="(" close=")">#{eid}</foreach>
</delete>
@Test
public void deleteMoreByArray() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);int result = mapper.deleteMoreByArray(new Integer[]{6, 7, 8, 9});System.out.println(result);
}

在这里插入图片描述

  • 批量添加
<!--int insertMoreByList(@Param("emps") List<Emp> emps);-->
<insert id="insertMoreByList">insert into t_emp values<foreach collection="emps" item="emp" separator=",">(null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)</foreach>
</insert>
@Test
public void insertMoreByList() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);Emp emp1 = new Emp(null,"a",1,"男","123@321.com",null);Emp emp2 = new Emp(null,"b",1,"男","123@321.com",null);Emp emp3 = new Emp(null,"c",1,"男","123@321.com",null);List<Emp> emps = Arrays.asList(emp1, emp2, emp3);int result = mapper.insertMoreByList(emps);System.out.println(result);
}

在这里插入图片描述

4.6 SQL片段

  • sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
  • 声明sql片段:<sql>标签
<sql id="empColumns">eid,emp_name,age,sex,email</sql>
  • 引用sql片段:<include>标签
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">select <include refid="empColumns"></include> from t_emp
</select>

相关文章:

Mybatis学习笔记二

目录 一、MyBatis的各种查询功能1.1 查询一个实体类对象1.2 查询一个List集合1.3 查询单个数据1.4 查询一条数据为map集合1.5 查询多条数据为map集合1.5.1 方法一&#xff1a;1.5.2 方法二&#xff1a; 二、特殊SQL的执行2.1 模糊查询2.2 批量删除2.3 动态设置表名2.4 添加功能…...

大屏数据可视化开源项目

一、DataGear —— 数据可视化项目 官网&#xff1a;DataGear - 开源免费的数据可视化分析平台 DataGear 是一款开源免费的数据可视化分析平台&#xff0c;数据可视化看板。 功能特性&#xff1a; 1、多种数据源&#xff0c;支持运行时接入任意提供 JDBC 驱动的数据库&#…...

面试经典150题:数组/字符串合集

新专栏&#xff0c;预计两个月写完吧&#xff0c;每天下班回来抽空做几道题。会把做题计划顺序记录下来&#xff0c;如果你有缘&#xff0c;刷到这个开篇序列&#xff0c;那就跟着文章去练题吧。初学者可以慢慢来 88. 合并两个有序数组 void merge(vector<int>& nums…...

Java源文件的执行过程

目录 1.JVM 2.字节码 3.Java源文件执行的过程 4.JIT&#xff08;Just In Time Compilation&#xff09; 5.AOT&#xff08;Ahead Of Time Compilation&#xff09; 6.AOT破坏Java动态性 7.编译型语言与解释型语言 8.Java-编译与解释并存的语言 9.Java和C的相同点与不同…...

10个ai算法常用库java版

今年ChatGPT 火了半年多,热度丝毫没有降下来。深度学习和 NLP 也重新回到了大家的视线中。有一些小伙伴问我,作为一名 Java 开发人员,如何入门人工智能,是时候拿出压箱底的私藏的学习AI的 Java 库来介绍给大家。 这些库和框架为机器学习、深度学习、自然语言处理等提供了广…...

怎么看服务器带宽大小 103.219.179.X

第一种&#xff0c;可以使用网站测速&#xff0c;这种方式比较便捷&#xff0c;但是由于网站测速是测试服务器发送数据包到他网站节点的一个速度情况&#xff0c;有时候节点问题或者服务器做了封包限制可能导致测试不准确的情况。 第二种&#xff0c;可以在IIS上架设一个大一点…...

图形编辑器开发:最基础但却复杂的选择工具

大家好&#xff0c;我是前端西瓜哥。 对于一个图形设计软件&#xff0c;它最基础的工具是什么&#xff1f;选择工具。 但这个选择工具&#xff0c;却是相当的复杂。这次我来和各位&#xff0c;细说细说选择工具的一些弯弯道道。 我正在开发的图形设计工具的&#xff1a; http…...

apk签名-signapk.jar

如果做平台app开发&#xff0c;需要签platform签名&#xff0c;除了通过adroid.bp或者android.mk的方式使用AOSP整个大工程中签名外&#xff0c;还可以直接通过signapk.jar的方式进行签名&#xff0c;效率更高更快捷简便。 首先我们来回顾下AOSP平台签名的办法。 Android.mk 使…...

【100个高大尚求职简历】简历模板+修改教程+行业分类简历模板 (涵盖各种行业) (简历模板+编辑指导+修改教程)

文章目录 1 简历预览2 简历下载 很多人说自己明明投了很多公司的简历&#xff0c;但是都没有得到面试邀请的机会。自己工作履历挺好的&#xff0c;但是为什么投自己感兴趣公司的简历&#xff0c;都没有面试邀请的机会。反而是那些自己没有投递的公司&#xff0c;经常给自己打电…...

Nginx平滑升级版本或添加模块

文章目录 一、Nginx 平滑升级二、升级失败 回滚操作三、遇到问题 一、Nginx 平滑升级 一般有两种情况下需要升级 nginx&#xff0c;一种是确实要升级 nginx 的版本&#xff0c;另一种是要为 nginx 添加新的模块。 Nginx平滑升级其原理简单概括&#xff1a; &#xff08;1&am…...

高阶复杂网络重建:从时间序列中重建高阶网络

论文链接&#xff1a;https://www.nature.com/articles/s41467-022-30706-9 一、为什么要研究高阶网络&#xff1f; 复杂网络跟我们生活息息相关&#xff0c;例如社交网络的信息传播&#xff0c;疾病的感染扩散和基因调控网络的相互作用等。越来越多的研究突破了传统网络中两…...

Day05 03-MySQL主从-主主原理与搭建详解

文章目录 第十六章 MySQL的系统架构&#xff08;主从架构&#xff09;16.1 MySQL集群架构的介绍16.1.1 主从架构介绍16.1.2 主从复制的原理 16.2 MySQL主从复制的实现16.2.1 环境说明16.2.2 主库配置16.2.3 从库配置16.2.4 主从复制测试 16.3 MySQL主主复制的实现16.3.1 主主复…...

STL之vector

目录 vector模拟实现一. vector的基本框架二. 常用方法及实现1.初始化和清理a. 默认构造函数b. 析构函数 2. 迭代器a. beginb. end 3.数据访问a. sizeb. capacityc. operator[]d. frontc. back 4.增删查改操作a. reserveb. resizec. insertd. push_backe. erasef. pop_back 5.构…...

2020年CSP-J认证 CCF非专业级别软件能力认证第一轮真题-单项选择题解析

2020 CCF认证第一轮&#xff08;CSP-J&#xff09;真题 一、单项选择题 (共15题&#xff0c;每2分&#xff0c;共30分;每题有且有一个正确选项&#xff09; 1、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 答案&#xff1a;C…...

vscode Delete `␍⏎·····`

在公司拉取代码报错 Delete ␍⏎&#xff0c;首先问题的关键是换行导致&#xff0c;相信你看别的博客也知道为什么了&#xff0c;但是我使用别的博客的解决办法&#xff0c;没搞定&#xff0c;无论是配置 auto 还是命令行执行&#xff0c;都不行 下面介绍我的解决办法 我使用…...

读书笔记-《ON JAVA 中文版》-摘要16[第十六章 代码校验]

文章目录 第十六章 代码校验1. 测试1.1 单元测试1.2 JUnit1.3 测试覆盖率的幻觉 2. 前置条件2.1 断言&#xff08;Assertions&#xff09;2.2 Java 断言语法2.3 Guava 断言2.4 使用断言进行契约式设计2.4.1 检查指令2.4.2 前置条件2.4.3 后置条件2.4.4 不变性2.4.5 放松 DbC 检…...

SQL Server:打造高效数据管理系统的利器

使用SQL Server进行数据管理 简介 SQL Server是由Microsoft开发的一款关系型数据库管理系统&#xff0c;它可以用于存储和管理大量结构化数据。本篇博客将介绍如何使用SQL Server进行数据管理。 数据库连接 在开始使用SQL Server之前&#xff0c;需要先建立与数据库的连接。…...

代码随想录二刷day20 | 二叉树之 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

day20 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目链接 解题思路&#xff1a; 本题属于构造二叉树&#xff0c;需要使用前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树。 确定递归函数的参数…...

python基础知识(十三):numpy库的基本用法

目录 1. numpy的介绍2. numpy库产生矩阵2.1 numpy将列表转换成矩阵2.2 numpy创建矩阵 3. numpy的基础运算4. numpy的基础运算25. 索引 1. numpy的介绍 numpy库是numpy是python中基于数组对象的科学计算库。 2. numpy库产生矩阵 2.1 numpy将列表转换成矩阵 import numpy as …...

【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread() 源码分析

【【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread 源码分析 一、TP 线程函数:tp_recv_thread()二、处理&上报 坐标数据 cypress_read_touch_data()系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接:《【SA8295P 源码…...

Python3数据分析与挖掘建模(13)复合分析-因子关分析与小结

1.因子分析 1.1 探索性因子分析 探索性因子分析&#xff08;Exploratory Factor Analysis&#xff0c;EFA&#xff09;是一种统计方法&#xff0c;用于分析观测变量之间的潜在结构和关联性。它旨在确定多个观测变量是否可以归结为较少数量的潜在因子&#xff0c;从而帮助简化…...

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型

参考&#xff1a; B站教学视频【&#xff1a;AI绘画】新手向&#xff01;Lora训练&#xff01;训练集准备、tag心得、批量编辑、正则化准备】官方教程&#xff1a;https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…...

TCP可靠数据传输

TCP的可靠数据传输 1.TCP保证可靠数据传输的方法 TCP主要提供了检验和、序号/确认号、超时重传、最大报文段长度、流量控制等方法实现了可靠数据传输。 检验和 通过检验和的方式&#xff0c;接收端可以检测出来数据是否有差错和异常&#xff0c;假如有差错就会直接丢失该TC…...

Python 私有变量和私有方法介绍

Python 私有变量和私有方法介绍 关于 Python 私有变量和私有方法&#xff0c;通常情况下&#xff0c;开发者可以在方法或属性名称前加上单下划线&#xff08;_&#xff09;&#xff0c;以表示该方法或属性仅供内部使用&#xff0c;但这只是一种约定&#xff0c;并没有强制执行禁…...

Kotlin Lambda表达式和匿名函数的组合简直太强了

Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先&#xff0c;在 Kotlin 中&#xff0c;函数是“第一公民”&#xff08;First Class Citizen&#xff09;。因此&#xff0c;它们可以被分配为变量的值&#xff0c;作为其他函数的参数传递或者函数的返回值。同样&…...

uniapp 小程序 获取手机号---通过前段获取

<template><!-- 获取手机号&#xff0c;登录内容 --><view><!-- 首先需要先登录获取code码&#xff0c;然后才可以获取用户唯一标识openid以及会话密钥及用于解密获取手机的加密信息 --><view click"login">登录</view><view…...

面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布

2023年6月12日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中&#xff0c;1Panel进一步增强了安全方面的能力&#xff0c;包括新增SSH配置管理、域名绑定和IP授权支持&#xff0c;以及启用网站防盗链功能。此外&#xff0c;该版本…...

k8s学习-CKS考试必过宝典

目录 CKS考纲集群安装&#xff1a;10%集群强化&#xff1a;15%系统强化&#xff1a;15%微服务漏洞最小化&#xff1a;20%供应链安全&#xff1a;20%监控、日志记录和运行时安全&#xff1a;20% 报名模拟考试考试注意事项考前考中考后 参考 CKS考纲 集群安装&#xff1a;10% 使…...

jmeter如何将上一个请求的结果作为下一个请求的参数

目录 1、简介 2、用途 3、下载、简单应用 4、如何将上一个请求的结果作为下一个请求的参数 1、简介 在JMeter中&#xff0c;可以通过使用变量来将上一个请求的结果作为下一个请求的参数传递。 ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测…...

JAVA如何学习爬虫呢?

学习Java爬虫需要掌握以下几个方面&#xff1a; Java基础知识&#xff1a;包括Java语法、面向对象编程、集合框架等。 网络编程&#xff1a;了解HTTP协议、Socket编程等。 HTML、CSS、JavaScript基础&#xff1a;了解网页的基本结构和样式&#xff0c;以及JavaScript的基本语…...

化工企业网站jsp/模板建站代理

** JS遍历对 象的总结 ** 1、使用Object.keys()遍历 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性). var obj {‘0’:‘a’,‘1’:‘b’,‘2’:‘c’}; Object.keys(obj).forEach(function(key){ console.log(key,’:’,obj[key]); }); 输出结果…...

网站标题的写法/常州seo招聘

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G3锅炉水处理报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新G3锅炉水处理考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过G3锅炉水处理证考试很简单。 1、【多选题】甲基橙指示剂在pH&…...

电子政务网站建设ppt/金戈枸橼酸西地那非片

在很多实际项目中&#xff0c;有一类实际问题&#xff0c;就是将一些图层设置为可选和不可选&#xff0c;类似于地图背景是不能被选择的&#xff0c; 自己添加的一些图元(如GPS应用中的被监控车辆、最优化路径中的必须经过点)是可以选择和编辑的。 设置图层可不可以选择&#x…...

广州设计网站/如何自己做网页

iOS开发 AudioServices(音效播放)的使用 AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service).System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制: 音频播放时间不能超过3…...

js代码网站大全/珠海企业网站建设

RT1052之GPIO与IOMUX原文链接&#xff1a;https://blog.csdn.net/weixin_44021648/article/details/113839882 前提提一句&#xff0c;i.MX RT1052与imx6ul的很多片内外设的架构长的都是一样的。 RT1052 GPIO和IOMUX 一、简介 按照编写STM32程序的思维&#xff0c;其实GPIO和I…...

政府网站app/网络广告策划书范文

近日&#xff0c;一家VR&#xff08;虚拟现实&#xff09;创业公司Pico对外披露&#xff0c;该公司已被字节跳动收购。受这件事的催化&#xff0c;一个很多人都不认识的新名词——“元宇宙”&#xff0c;进入了大众的视野。 当我们还在试图理解消化这个新概念时&#xff0c;一…...