MyBatis之动态sql

目录

一、MyBatis动态sql

1.1 是什么

1.2 作用

1.3 优点

1.4 特殊标签

1.5 代码演示

二、#和$的区别

2.1 #使用

2.2 $使用

2.3 综合

2.4 代码演示

三、resultType与resultMap的区别

3.1 关于resultType

3.2 关于resultMap 

 3.3 两者区别

3.4 代码演示


一、MyBatis动态sql

1.1 是什么

是一种在SQL语句中根据不同条件动态拼接SQL的方式。通过使用动态SQL,可以根据不同的条件生成不同的SQL语句,从而实现灵活的查询和更新操作。动态SQL可以使用if、choose、when、otherwise等标签来实现条件判断和循环操作,同时还可以使用foreach标签来实现对集合类型参数的遍历操作。这样可以避免在代码中使用大量的字符串拼接,提高代码的可读性和维护性。

1.2 作用

Mybatis的动态SQL具有以下作用:

  • 1&. 灵活的条件查询:通过动态SQL,可以根据不同的条件生成不同的SQL语句,实现灵活的条件查询。可以根据用户输入的不同条件动态拼接SQL,从而实现动态的查询操作。
  • 2&. 动态更新操作:通过动态SQL,可以根据不同的条件生成不同的更新SQL语句,实现动态的更新操作。可以根据不同的业务需求动态拼接更新语句,从而实现灵活的数据更新。
  • 3&. 避免SQL注入:通过使用动态SQL,可以使用预编译的方式来拼接SQL语句,避免了直接拼接字符串的方式,从而有效防止SQL注入攻击。
  • 4&. 提高代码可读性和维护性:通过使用动态SQL的标签和语法,可以将复杂的SQL语句拆分为多个小块,提高了代码的可读性和维护性。可以根据不同的条件使用不同的标签和语法,使代码更加清晰易懂。
  • 总之,动态SQL是Mybatis的重要特性之一,可以帮助开发者灵活地拼接SQL语句,实现动态的查询和更新操作,提高代码的可读性和维护性。

动态SQL在扩展方面有以下几个方面的作用:

  • 1#. 支持多表关联查询:通过动态SQL,可以根据不同的条件动态拼接多表关联查询的SQL语句。可以根据业务需求动态选择关联的表和关联条件,从而实现复杂的多表查询操作。
  • 2#. 支持分页查询:通过动态SQL,可以根据不同的条件动态拼接分页查询的SQL语句。可以根据分页参数动态计算查询结果的起始位置和数量,并将其拼接到SQL语句中,实现分页查询操作。
  • 3#. 支持动态排序:通过动态SQL,可以根据不同的条件动态拼接排序查询的SQL语句。可以根据排序参数动态选择排序字段和排序方式,并将其拼接到SQL语句中,实现动态排序查询操作。
  • 4#. 支持动态字段选择:通过动态SQL,可以根据不同的条件动态拼接字段选择的SQL语句。可以根据字段选择参数动态选择需要查询的字段,并将其拼接到SQL语句中,实现动态字段选择查询操作。
  • 5#. 支持动态更新字段:通过动态SQL,可以根据不同的条件动态拼接更新字段的SQL语句。可以根据更新参数动态选择需要更新的字段,并将其拼接到SQL语句中,实现动态更新字段操作。

总之,动态SQL在扩展方面可以根据不同的条件动态拼接SQL语句,满足复杂的查询和更新需求。通过动态SQL,可以灵活地处理多表关联查询、分页查询、动态排序、动态字段选择和动态更新字段等扩展操作,提高了系统的灵活性和可扩展性。

1.3 优点

Mybatis的动态SQL具有以下优点:

  • -1. 灵活性:动态SQL可以根据不同的条件生成不同的SQL语句,实现灵活的查询和更新操作。可以根据不同的业务需求动态拼接SQL,从而满足不同的查询和更新需求。
  • -2. 可读性:通过使用动态SQL的标签和语法,可以将复杂的SQL语句拆分为多个小块,提高了代码的可读性。可以根据不同的条件使用不同的标签和语法,使代码更加清晰易懂。
  • -3. 维护性:使用动态SQL可以将SQL语句的拼接逻辑与业务逻辑分离,使代码更易于维护。可以根据需要修改或添加条件,而不需要修改大段的SQL语句,减少了代码的维护成本。
  • -4. 防止SQL注入:通过使用动态SQL,可以使用预编译的方式来拼接SQL语句,避免了直接拼接字符串的方式,从而有效防止SQL注入攻击。
  • -5. 性能优化:动态SQL可以根据不同的条件生成不同的SQL语句,可以根据业务需求进行优化。可以根据查询条件动态选择索引,从而提高查询效率。

总之,动态SQL是Mybatis的强大特性之一,具有灵活性、可读性、维护性、安全性和性能优化等优点,能够帮助开发者更好地处理复杂的查询和更新需求,提高代码质量和开发效率。

1.4 特殊标签

Mybatis的动态SQL是一种在SQL语句中根据不同条件动态生成不同SQL片段的技术。它通过使用Mybatis提供的一些特殊标签和语法,可以根据不同的条件动态拼接SQL语句,从而实现灵活的查询和更新操作。 

Mybatis提供了以下几种常用的动态SQL标签和语法:

  • 1. if标签:if标签可以根据条件判断是否包含某段SQL语句。可以在if标签中使用OGNL表达式来判断条件,如果条件满足,则包含if标签中的SQL语句。
  • 2. choose、when、otherwise标签:choose标签类似于Java中的switch语句,可以根据不同的条件选择不同的SQL语句执行。可以在choose标签中使用when标签定义多个条件分支,当条件满足时,执行对应的SQL语句;可以使用otherwise标签定义默认的SQL语句。
  • 3. trim标签:trim标签可以根据不同的条件动态拼接SQL语句的开头或结尾部分。可以使用trim标签来去除或添加不需要的SQL关键字,从而实现灵活的SQL拼接。
  • 4. foreach标签:foreach标签可以遍历集合或数组,并根据集合中的元素动态生成SQL语句。可以使用foreach标签来实现批量插入或批量更新操作。
  • 5. set标签:set标签可以根据不同的条件动态生成更新操作中的set语句。可以使用set标签来根据更新参数动态选择需要更新的字段,并将其拼接到SQL语句中。
  • 通过使用这些动态SQL标签和语法,可以根据不同的条件动态生成不同的SQL语句,从而实现灵活的查询和更新操作。动态SQL使得Mybatis可以根据不同的业务需求动态拼接SQL语句,提高了代码的可读性、维护性和扩展性。

1.5 代码演示

根据我们自动生成的xml,接口,实体进行增加代码进行动态SQL的演示操作,如下: 

Book:

package com.Kissship.model;public class Book {private Integer bid;private String bname;private Float price;public Book(Integer bid, String bname, Float price) {this.bid = bid;this.bname = bname;this.price = price;}public Book() {super();}public Integer getBid() {return bid;}public void setBid(Integer bid) {this.bid = bid;}public String getBname() {return bname;}public void setBname(String bname) {this.bname = bname;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}@Overridepublic String toString() {return "Book{" +"bid=" + bid +", bname='" + bname + '\'' +", price=" + price +'}';}
}

BookMapper:

package com.Kissship.mapper;import com.Kissship.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper {int deleteByPrimaryKey(Integer bid);int insert(Book record);int insertSelective(Book record);Book selectByPrimaryKey(Integer bid);int updateByPrimaryKeySelective(Book record);int updateByPrimaryKey(Book record);//增加根据多个ID(bid)查询多个数据的方法List<Book> selectByBll(@Param("bids") List bids);}

BookMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.Kissship.mapper.BookMapper" ><resultMap id="BaseResultMap" type="com.Kissship.model.Book" ><constructor ><idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" /><arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" /><arg column="price" jdbcType="REAL" javaType="java.lang.Float" /></constructor></resultMap><sql id="Base_Column_List" >bid, bname, price</sql><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >select <include refid="Base_Column_List" />from t_mvc_bookwhere bid = #{bid,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >delete from t_mvc_bookwhere bid = #{bid,jdbcType=INTEGER}</delete><insert id="insert" parameterType="com.Kissship.model.Book" >insert into t_mvc_book (bid, bname, price)values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL})</insert><insert id="insertSelective" parameterType="com.Kissship.model.Book" >insert into t_mvc_book<trim prefix="(" suffix=")" suffixOverrides="," ><if test="bid != null" >bid,</if><if test="bname != null" >bname,</if><if test="price != null" >price,</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="bid != null" >#{bid,jdbcType=INTEGER},</if><if test="bname != null" >#{bname,jdbcType=VARCHAR},</if><if test="price != null" >#{price,jdbcType=REAL},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="com.Kissship.model.Book" >update t_mvc_book<set ><if test="bname != null" >bname = #{bname,jdbcType=VARCHAR},</if><if test="price != null" >price = #{price,jdbcType=REAL},</if></set>where bid = #{bid,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="com.Kissship.model.Book" >update t_mvc_bookset bname = #{bname,jdbcType=VARCHAR},price = #{price,jdbcType=REAL}where bid = #{bid,jdbcType=INTEGER}</update><!-- 根据多个bid(编号)进行查询出多个Book(对象),bids参数需要是一个List<Integer> 集合--><select id="selectByBll" resultType="com.Kissship.model.Book" parameterType="java.util.List" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bid in<foreach collection="bids" item="bid" open="(" close=")" separator=",">#{bid}</foreach></select></mapper>

其中的动态SQL可以根据自己的需要进行编写 :

  <select id="selectByBll" resultType="com.Kissship.model.Book" parameterType="java.util.List" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bid in
    <foreach collection="bids" item="bid" open="(" close=")" separator=",">
      #{bid}
    </foreach>
  </select> 

然后再将以下代码增加到增加编写的接口中,

//    封装方法List<Book> selectByBll(List bids);

 接着在实现类中增加以下代码:

//    方法实现@Overridepublic List<Book> selectByBll(List bids) {return bookMapper.selectByBll(bids);}

最后我们就可以在Demo测试类中进行方法调用测试

在Demo中增加以下代码进行测试 :  

    @Testpublic void Bll(){List<Integer> bids = Arrays.asList(new Integer[]{41,42,43,45,47});//jdk1.8的新特性写法  bookBiz.selectByBll(bids).forEach(System.out::println);
//        for (Book book: bookBiz.selectByBll(bids)) {
//            System.out.println(book);
//        }}

    其中方法调用的输出代码是jdk 1.8的新特性,提倡大家可以去探索,有很大收获。 

输出的结果: 

二、#和$的区别

2.1 #使用

(1)#占位符语法

  • #占位符会将传入的参数值自动进行预编译处理,可以防止SQL注入攻击。
  • 使用#占位符时,Mybatis会将参数值以安全的方式替换到SQL语句中,使用JDBC的预编译语句来执行SQL查询。
  • #占位符在生成SQL语句时会对参数值进行类型处理,将参数值转换为对应的JDBC类型。
  • #占位符可以防止SQL注入攻击,但是无法实现动态拼接SQL片段。

(2)优点 

#占位符语法在使用动态SQL时具有以下优点:

  • 1. 防止SQL注入攻击:#占位符语法会将传入的参数值进行预编译处理,将参数值转换为对应的JDBC类型。这样可以防止恶意输入对SQL语句造成的安全威胁,提高了系统的安全性。
  • 2. 参数值类型处理:#占位符语法会对参数值进行类型处理,将参数值转换为对应的JDBC类型。这样可以避免在SQL语句中手动进行类型转换的麻烦,提高了开发效率。
  • 3. 可读性和可维护性:使用#占位符语法可以使SQL语句更加清晰和可读,因为参数值被封装在占位符中,不会直接出现在SQL语句中。这样可以方便后续的维护和修改,减少出错的可能性。
  • 4. 兼容性:#占位符语法是Mybatis的特有语法,相对于$占位符语法更具有兼容性。如果项目需要切换到其他ORM框架,使用#占位符语法可以减少代码的修改量。

综上所述,#占位符语法具有防止SQL注入攻击、参数值类型处理、可读性和可维护性、兼容性等优点。因此,在项目中使用动态SQL时,推荐使用#占位符语法。

2.2 $使用

(1)$占位符语法

  • $占位符会直接将传入的参数值替换到SQL语句中,不进行预编译处理。
  • 使用$占位符时,Mybatis会将参数值直接替换到SQL语句中,生成最终的SQL语句。
  • $占位符在生成SQL语句时不会对参数值进行类型处理,参数值会直接拼接到SQL语句中,可能存在安全风险。
  • $占位符可以实现动态拼接SQL片段,但是可能存在SQL注入攻击的风险。

(2)$优点

$占位符语法在使用动态SQL时具有以下优点:

  1. 动态拼接SQL片段:$占位符语法允许在SQL语句中直接使用参数值,可以方便地进行动态拼接SQL片段。这样可以在某些特殊情况下,更灵活地构建SQL语句。
  2. 字段名动态替换:$占位符语法可以用于动态替换字段名。这在某些场景下非常有用,比如需要根据用户的选择动态查询不同的字段。
  3. SQL语句灵活性:$占位符语法允许在SQL语句中使用任意有效的SQL表达式。这样可以在SQL语句中进行一些复杂的计算、字符串拼接等操作。

2.3 综合

综上所述,$占位符语法在某些特殊情况下具有灵活性和动态拼接SQL的优势,但需要注意SQL注入攻击的风险,并且可能会降低SQL语句的可读性和可维护性。因此,在使用动态SQL时,#占位符语法具有防止SQL注入攻击、参数值类型处理、可读性和可维护性、兼容性等优点。因此,在项目中使用动态SQL时,推荐使用#占位符语法。只有在特殊情况下,需要动态拼接SQL片段或动态替换字段名时,才考虑使用占位符语法,并且需要确保参数值的安全性。

2.4 代码演示

在自动生成的 BookMapper.xml 配置文件中增加以下代码 

  <select id="like01" resultType="com.Kissship.model.Book" parameterType="java.lang.String" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bname like #{bname}</select><select id="like02" resultType="com.Kissship.model.Book" parameterType="java.lang.String" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bname like  '${bname}'</select><select id="like03" resultType="com.Kissship.model.Book" parameterType="java.lang.String" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bname like concat('%',#{bname},'%')</select>

自己在配置文件中根据自己需求来进行编写动态SQL

注意 : 

这里如果使用$占位符语法的话需要在${bname}的左右增加单引号 列如:  '${bname}' 

这已是$占位符语法的一个小缺陷,在我们日常使用中一般使用的是第三种方法( like03 )

在自动生成的 BookMapper 接口中增加以下代码 

    //增加模糊查询的方法List<Book> like01(@Param("bname") String bname);List<Book> like02(@Param("bname") String bname);List<Book> like03(@Param("bname") String bname);

 编写动态SQL后进行封装方法, 在自己创建的接口中增加以下代码:

    List<Book> like01(String bname);List<Book> like02(String bname);List<Book> like03(String bname);

  在自己创建的实现类中增加以下代码:

    @Overridepublic List<Book> like01(String bname) {return bookMapper.like01(bname);}@Overridepublic List<Book> like02(String bname) {return bookMapper.like02(bname);}@Overridepublic List<Book> like03(String bname) {return bookMapper.like03(bname);}

 在测试类( Demo )中增加以下代码并且进行一一调用测试 

    @Testpublic void like01(){bookBiz.like01("%斗破%").forEach(System.out::println);}@Testpublic void like02(){bookBiz.like02("%斗破%").forEach(System.out::println);}@Testpublic void like03(){bookBiz.like03("%斗破%").forEach(System.out::println);}

 like01的方法测试结果,如下:

 

like02的方法测试结果,如下:

 

 like03的方法测试结果,如下:

 

 

三、resultType与resultMap的区别

3.1 关于resultType

在Mybatis的动态SQL中,resultType和resultMap都是用于指定查询结果的类型或映射关系的配置项。

resultType: resultType用于指定查询结果的类型,可以是Java基本类型、Java对象类型或自定义的Java类。当使用resultType时,Mybatis会根据查询结果的列名和Java对象的属性名进行自动映射。例如,如果查询结果的列名为"username",Java对象中有对应的属性"userName",则Mybatis会自动将查询结果映射到Java对象中。

示例:

<select id="getUser" resultType="com.example.User">SELECT id, username, email FROM user WHERE id = #{id}
</select>

在上述示例中,resultType指定了查询结果的类型为com.example.User类,Mybatis会根据查询结果的列名和User类的属性名进行自动映射。

3.2 关于resultMap 

resultMap: resultMap用于自定义查询结果的映射关系,可以通过指定映射关系来实现更灵活的结果映射。resultMap需要在映射文件中进行配置,通过定义<resultMap>标签来指定映射关系。在<resultMap>标签中,可以使用<id>、<result>、<association>等标签来定义主键、普通列和关联对象之间的映射关系。

示例:

<resultMap id="userResultMap" type="com.example.User"><id property="id" column="user_id"/><result property="username" column="user_name"/><result property="email" column="user_email"/>
</resultMap><select id="getUser" resultMap="userResultMap">SELECT id as user_id, username as user_name, email as user_email FROM user WHERE id = #{id}
</select>

在上述示例中,resultMap指定了自定义的映射关系userResultMap,通过<resultMap>标签中的<id>和<result>标签来定义查询结果列和User类属性之间的映射关系。

 3.3 两者区别

  • resultType用于简单的结果映射,适用于查询结果列与Java对象属性名一致的情况,自动进行映射。
  • resultMap用于复杂的结果映射,适用于查询结果列与Java对象属性名不一致或需要自定义映射关系的情况,需要手动定义映射关系

总结:

resultType适用于简单的结果映射,可以自动进行映射;

resultMap适用于复杂的结果映射,需要手动定义映射关系。

根据具体的需求和情况,选择合适的配置项来实现查询结果的映射。

3.4 代码演示

 resultType的使用场景:

  • 当查询结果与Java对象的属性名一致,并且查询结果较为简单时,可以使用resultType。这样可以简化配置,避免过多的映射配置。
  • 当查询结果只包含少量列,并且不需要进行复杂的映射操作时,也可以使用resultType。
  •  resultMap的使用场景:
  • 当查询结果与Java对象的属性名不一致,或者查询结果需要进行复杂的映射操作时,可以使用resultMap。通过自定义映射关系,可以灵活地将查询结果映射到Java对象中。
  • 当查询结果包含多个关联对象,需要进行关联查询和关联映射时,也可以使用resultMap。通过<association>、<collection>等标签,可以定义关联对象之间的映射关系。

综上所述,resultType适用于简单的结果映射,而resultMap适用于复杂的结果映射。在实际项目中,根据查询结果的复杂度和需求的灵活性,选择合适的配置项来进行结果映射。如果查询结果较为简单且与Java对象属性名一致,可以使用resultType;如果查询结果复杂或需要进行自定义映射操作,可以使用resultMap。

在自动生成的 BookMapper.xml 配置文件中增加以下代码, 如下:

  <select id="BookList01" resultType="com.Kissship.model.Book" >select<include refid="Base_Column_List" />from t_mvc_book</select><select id="BookList02" resultMap="BaseResultMap" >select<include refid="Base_Column_List" />from t_mvc_book</select>

在自动生成的 BookMapper 接口中增加以下代码,如下:

   List<Book> BookList01();List<Book> BookList02();

 在自己创建的接口  BookBiz 中增加以下代码,如下:

    List<Book>  BookList01();List<Book>  BookList02();

 在自己创建的实现类  BookBizImpl 中增加以下代码,如下:

    @Overridepublic List<Book> BookList01() {return bookMapper.BookList01();}@Overridepublic List<Book> BookList02() {return bookMapper.BookList02();}

  在测试类 Demo 中 增加以下代码,如下:

    @Testpublic  void List01(){bookBiz.BookList01().forEach(System.out::println);}@Testpublic  void List02(){bookBiz.BookList02().forEach(System.out::println);}

 List01测试结果如下:

 List02测试结果如下:


最后MyBatis之动态sql及分页就到这里,祝大家在敲代码的路上一路通畅!

感谢大家的观看 !

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRYPTO 密码学-笔记

一、古典密码学 1.替换法&#xff1a;用固定的信息&#xff0c;将原文替换成密文 替换法的加密方式&#xff1a;一种是单表替换&#xff0c;另一种是多表替换 单表替换&#xff1a;原文和密文使用同一张表 abcde---》sfdgh 多表替换&#xff1a;有多涨表&#xff0c;原文和密文…

云服务器 宝塔(每次更新)

su root 输入密码 使用 root 权限 /etc/init.d/bt default 获取宝塔登录 位置和账号密码。进入宝塔 删除数据库 删除php前端站点 删除PM2后端项目 前端更改完配置打包dist文件 后端更改完配置项目打包 数据库结构导出 导入数据库 配置 PM2 后端 安装依赖

剪枝基础与实战(2): L1和L2正则化及BatchNormalization讲解

1. CIFAR10 数据集 CIFAR10 是深度学习入门最先接触到的数据集之一,主要用于图像分类任务中,该数据集总共有10个类别。 图片数量:6w 张图片宽高:32x32图片类别:10Trainset: 5w 张,5 个训练块Testset: 1w 张,1 个测试块Pytorch 集成了很多常见数据集的API, 可以通过py…

idea的断点调试

1、行断点 首先在代码的最左侧点击会显示红色的圆圈 第二步在main方法中右键选中debug run进行运行 会出现下面图片的情况 出现上图之后&#xff0c;点击console 下一步 这个时候就可以看到调试的结果了 6、方法调用栈&#xff1a;这里显示了该线程调试所经过的所有方法&…

VBA_MF系列技术资料1-167

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

测试先行:探索测试驱动开发的深层价值

引言 在软件开发的世界中,如何确保代码的质量和可维护性始终是一个核心议题。测试驱动开发(TDD)为此提供了一个答案。与传统的开发方法相比,TDD鼓励开发者从用户的角度出发,先定义期望的结果,再进行实际的开发。这种方法不仅可以确保代码满足预期的需求,还可以在整个开…

IT运维:使用数据分析平台监控DELL服务器

概述 在企业日常运维中&#xff0c;我们有着大量的服务器设备&#xff0c;设备故障一般可以通过常用的监控软件实现自动告警&#xff0c;但如果在管理运维中我们要做的不仅仅是发现故障&#xff0c;处理硬件故障&#xff0c;我们还需要进一步的了解&#xff0c;今年一共出现了多…

基于开源模型搭建实时人脸识别系统(四):人脸质量

续人脸识别实战之基于开源模型搭建实时人脸识别系统&#xff08;三&#xff09;&#xff1a;人脸关键点、对齐模型概览与模型选型_CodingInCV的博客-CSDN博客 不论对于静态的人脸识别还是动态的人脸识别&#xff0c;我们都会面临一个问题&#xff0c;就是输入的人脸图像的质量可…

某网站DES加密逆向分析实战

文章目录 一、抓包分析二、加密分析一、重写加密 一、抓包分析 分析站点&#xff1a; aHR0cDovL2VpcC5jaGFuZmluZS5jb20v 首先我们提交一下登陆信息&#xff1a; 搜索j_password查看加密函数: 把上图搜索到的encryptPassword函数拿出来分析一下&#xff1a; function encryptP…

vue 简单实验 v-bind 变量与html属性绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"bind-attribute"><span v-bind:title"message">鼠标悬停几秒钟查看此处动态绑定的提示信息&#xff01;</sp…

企业ADManager Plus软件的使用案例

引言&#xff1a; 在当今数字化时代&#xff0c;企业的活动主要依赖于信息技术和计算机系统。作为关键的IT基础架构组件之一&#xff0c;Active Directory&#xff08;AD&#xff09;在维护和管理用户、计算机和资源方面发挥着关键作用。AD的高效管理对于确保企业的平稳运行至…

亿赛通电子文档安全管理系统 RCE漏洞

亿赛通电子文档安全管理系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测: 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失…

Android studio之GridView使用

目录 效果图&#xff1a;![在这里插入图片描述](https://img-blog.csdnimg.cn/86e4a48a71164dec82613d58b1fbaa1c.jpeg)代码&#xff1a; 效果图&#xff1a; 代码&#xff1a; UserGridviewAdapter package com.example.gridviewpro.Adapter;import android.content.Contex…

Wireshark数据抓包分析之ARP协议

一、实验目的&#xff1a; 通过wireshark的数据抓包了解这个ARP协议的具体内容 二、预备知识: 1.Address Resolution Protocol协议&#xff0c;就是通过目标IP的值&#xff0c;获取到目标的mac地址的一个协议 2.ARP协议的详细工作过程&#xff0c;下面描述得非常清晰&#xff…

07-微信小程序-注册页面-模块化

07-微信小程序-注册页面 文章目录 注册页面使用 Page 构造器注册页面参数Object初始数据案例代码 生命周期回调函数组件事件处理函数setData()案例代码 生命周期模块化 注册页面 对于小程序中的每个页面&#xff0c;都需要在页面对应的 js 文件中进行注册&#xff0c;指定页面…

云渲染小课堂 | 3dmax渲染小技巧,让你作品更出色!

3dmax是一款专业的三维建模、动画和渲染软件&#xff0c;广泛应用于影视、游戏、建筑、广告等领域。云渲染是一种利用云计算技术&#xff0c;将渲染任务分配到海量的服务器上进行并行计算的服务&#xff0c;可以大大提高渲染效率和质量&#xff0c;节省时间和成本。使用3dmax和…

Cesium 添加与原生按钮样式相同的按钮

Cesium 添加与原生按钮样式相同的按钮 原生的按钮自定义一个&#xff0c;仿生按钮 原生的按钮 自定义一个&#xff0c;仿生按钮 html <div id"cesiumContainer"><button class"btn" ref"newBtn" click"buttonClick()">&l…

论文解读 | ScanNet:室内场景的丰富注释3D重建

原创 | 文 BFT机器人 大型的、有标记的数据集的可用性是为了利用做有监督的深度学习方法的一个关键要求。但是在RGB-D场景理解的背景下&#xff0c;可用的数据非常少,通常是当前的数据集覆盖了一小范围的场景视图&#xff0c;并且具有有限的语义注释。 为了解决这个问题&#…

字节一面:post为什么会发送两次请求?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;因为在前端开发的日常开发中我们总是会与post请求打交道&#xff0c;一个小小的post请求也是牵扯到很多知识点的&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…

vue3 基础知识 ( webpack 基础知识)05

你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性&#xff1a; 代码的高亮&#xff1b;ES6、CommonJS的模块化能力&#xff1b;组件作用域的CSS&#xff1b;可以使用预处理器来…