Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
( 虽然文章中有大多文本内容,想了解更深需要耐心看完,必定大有受益 )
目录
一、动态SQL
( 1 ) 是什么
( 2 ) 作用
( 3 ) 优点
( 4 ) 特殊标签
( 5 ) 演示
二、#和$的区别
2.1 #使用
( 1 ) #占位符语法
( 2 ) #优点
2.2 $使用
( 1 ) $占位符语法
( 2 ) $优点
2.3 综合
2.4 实例演示
三、resultType及resultMap的区别
3.1 讲述
3.2 演示
给我们带来的收获
一、动态SQL
( 1 ) 是什么
是一种在SQL语句中根据不同条件动态拼接SQL的方式。通过使用动态SQL,可以根据不同的条件生成不同的SQL语句,从而实现灵活的查询和更新操作。动态SQL可以使用if、choose、when、otherwise等标签来实现条件判断和循环操作,同时还可以使用foreach标签来实现对集合类型参数的遍历操作。这样可以避免在代码中使用大量的字符串拼接,提高代码的可读性和维护性。
( 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,可以灵活地处理多表关联查询、分页查询、动态排序、动态字段选择和动态更新字段等扩展操作,提高了系统的灵活性和可扩展性。
( 3 ) 优点
Mybatis的动态SQL具有以下优点:
- -1. 灵活性:动态SQL可以根据不同的条件生成不同的SQL语句,实现灵活的查询和更新操作。可以根据不同的业务需求动态拼接SQL,从而满足不同的查询和更新需求。
- -2. 可读性:通过使用动态SQL的标签和语法,可以将复杂的SQL语句拆分为多个小块,提高了代码的可读性。可以根据不同的条件使用不同的标签和语法,使代码更加清晰易懂。
- -3. 维护性:使用动态SQL可以将SQL语句的拼接逻辑与业务逻辑分离,使代码更易于维护。可以根据需要修改或添加条件,而不需要修改大段的SQL语句,减少了代码的维护成本。
- -4. 防止SQL注入:通过使用动态SQL,可以使用预编译的方式来拼接SQL语句,避免了直接拼接字符串的方式,从而有效防止SQL注入攻击。
- -5. 性能优化:动态SQL可以根据不同的条件生成不同的SQL语句,可以根据业务需求进行优化。可以根据查询条件动态选择索引,从而提高查询效率。
总之,动态SQL是Mybatis的强大特性之一,具有灵活性、可读性、维护性、安全性和性能优化等优点,能够帮助开发者更好地处理复杂的查询和更新需求,提高代码质量和开发效率。
( 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语句,提高了代码的可读性、维护性和扩展性。
( 5 ) 演示
该演示效果是需要结合我上一篇文章的代码进行扩展 :
mybatis入门的环境搭建及快速完成CRUD(增删改查)
根据我们自动生成的xml,接口,实体进行增加代码进行动态SQL的演示操作
自动生成的实体代码( Book )对象
package com.CloudJun.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.CloudJun.mapper;import com.CloudJun.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.CloudJun.mapper.BookMapper" ><resultMap id="BaseResultMap" type="com.CloudJun.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.CloudJun.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.CloudJun.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.CloudJun.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.CloudJun.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.CloudJun.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.CloudJun.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时具有以下优点:
动态拼接SQL片段:$占位符语法允许在SQL语句中直接使用参数值,可以方便地进行动态拼接SQL片段。这样可以在某些特殊情况下,更灵活地构建SQL语句。
字段名动态替换:$占位符语法可以用于动态替换字段名。这在某些场景下非常有用,比如需要根据用户的选择动态查询不同的字段。
SQL语句灵活性:$占位符语法允许在SQL语句中使用任意有效的SQL表达式。这样可以在SQL语句中进行一些复杂的计算、字符串拼接等操作。
2.3 综合
综上所述,$占位符语法在某些特殊情况下具有灵活性和动态拼接SQL的优势,但需要注意SQL注入攻击的风险,并且可能会降低SQL语句的可读性和可维护性。因此,在使用动态SQL时,#占位符语法具有防止SQL注入攻击、参数值类型处理、可读性和可维护性、兼容性等优点。因此,在项目中使用动态SQL时,推荐使用#占位符语法。只有在特殊情况下,需要动态拼接SQL片段或动态替换字段名时,才考虑使用占位符语法,并且需要确保参数值的安全性。
2.4 实例演示
在自动生成的 BookMapper.xml 配置文件中增加以下代码
<select id="like01" resultType="com.CloudJun.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.CloudJun.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.CloudJun.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没有增加单引号时会执行SQL报错
like02的方法测试结果
like03的方法测试结果
三、resultType及resultMap的区别
3.1 讲述
在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类的属性名进行自动映射。
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类属性之间的映射关系。
区别:
- resultType用于简单的结果映射,适用于查询结果列与Java对象属性名一致的情况,自动进行映射。
- resultMap用于复杂的结果映射,适用于查询结果列与Java对象属性名不一致或需要自定义映射关系的情况,需要手动定义映射关系。
总结:
resultType适用于简单的结果映射,可以自动进行映射;
resultMap适用于复杂的结果映射,需要手动定义映射关系。
根据具体的需求和情况,选择合适的配置项来实现查询结果的映射。
3.2 演示
resultType的使用场景:
- 当查询结果与Java对象的属性名一致,并且查询结果较为简单时,可以使用resultType。这样可以简化配置,避免过多的映射配置。
- 当查询结果只包含少量列,并且不需要进行复杂的映射操作时,也可以使用resultType。
resultMap的使用场景:
- 当查询结果与Java对象的属性名不一致,或者查询结果需要进行复杂的映射操作时,可以使用resultMap。通过自定义映射关系,可以灵活地将查询结果映射到Java对象中。
- 当查询结果包含多个关联对象,需要进行关联查询和关联映射时,也可以使用resultMap。通过<association>、<collection>等标签,可以定义关联对象之间的映射关系。
综上所述,resultType适用于简单的结果映射,而resultMap适用于复杂的结果映射。在实际项目中,根据查询结果的复杂度和需求的灵活性,选择合适的配置项来进行结果映射。如果查询结果较为简单且与Java对象属性名一致,可以使用resultType;如果查询结果复杂或需要进行自定义映射操作,可以使用resultMap。
在自动生成的 BookMapper.xml 配置文件中增加以下代码
<select id="BookList01" resultType="com.CloudJun.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中#和$的区别以及resultType和resultMap的区别和作用可以带来以下收获:
- 1. 理解#和$的区别:#和$都是用于动态SQL的占位符,但它们的处理方式有所不同。#会将参数值作为字符串替换到SQL语句中,而$会将参数直接替换到SQL语句中。这意味着使用#可以防止SQL注入,而$则需要谨慎使用以避免安全问题。
- 2. 熟悉#和$的使用场景:学习#和$的区别可以帮助我们根据具体需求选择合适的占位符。一般来说,如果需要将参数作为字符串替换到SQL语句中,应该使用#;如果需要将参数直接替换到SQL语句中,可以使用$。
- 3. 理解resultType和resultMap的区别:resultType和resultMap都是用于结果映射的配置项。resultType用于简单的结果映射,可以自动进行映射;resultMap用于复杂的结果映射,需要手动定义映射关系。
- 4. 熟悉resultType和resultMap的使用场景:学习resultType和resultMap的区别可以帮助我们根据查询结果的复杂度和需求的灵活性选择合适的配置项。如果查询结果较为简单且与Java对象属性名一致,可以使用resultType;如果查询结果复杂或需要进行自定义映射操作,可以使用resultMap。
- 5. 提高结果映射的灵活性和效率:通过合理配置resultType和resultMap,可以实现灵活和准确的结果映射,从而提高结果处理效率和代码编写效率。
总的来说,学习#和$的区别以及resultType和resultMap的区别和作用可以帮助我们更好地处理和操作动态SQL和结果映射,提高代码编写效率和查询结果处理效率,同时也提高了对动态SQL和结果映射的理解。这些知识对于开发数据库相关的应用程序非常有用。
相关文章:
Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
( 虽然文章中有大多文本内容,想了解更深需要耐心看完,必定大有受益 ) 目录 一、动态SQL ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 优点 ( 4 ) 特殊标签 ( 5 ) 演示 二、#和$的区别 2.1 #使用 ( 1 ) #占位符语法 ( 2 ) #优点 2.…...
mysql下载
网址 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2、选择MSI进行安装 3、这里我选择离线安装 4、这里我选择直接下载 5、等待下载安装即可...
聚合函数与窗口函数
聚合函数 回答一 聚合函数(Aggregate Functions)是SQL中的函数,用于对一组数据进行计算,并返回单个结果。聚合函数通常用于统计和汇总数据,包括计算总和、平均值、计数、最大值和最小值等。 以下是一些常见的聚合函…...
c语言实现堆
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树1、树的概念2、树的相关概念3、树的表示 二、二叉树1、二叉树概念2、特殊的二叉树3、二叉树的性质4、二叉树的顺序结构5、二叉树的链式结构 三、堆(二叉树…...
ubuntu 如何将文件打包成tar.gz
要将文件打包成.tar.gz文件,可以使用以下命令: tar -czvf 文件名.tar.gz 文件路径 其中,-c表示创建新的归档文件,-z表示使用gzip进行压缩,-v表示显示详细的打包过程,-f表示指定归档文件的名称。 例如&am…...
前端优化页面加载速度的方法(持续更新)
提速方法方向 延迟脚本加载 使用 async 属性: 在这种方法中,脚本将在下载完成后立即执行,而不会阻塞其他页面资源的加载和渲染。这适用于那些不依赖于其他脚本和页面内容的脚本,例如分析脚本等。示例如下: html …...
利用SSL证书的SNI特性建立自己的爬虫ip服务器
今天我要和大家分享一个关于自建多域名HTTPS爬虫ip服务器的知识,让你的爬虫ip服务器更加强大!无论是用于数据抓取、反爬虫还是网络调试,自建一个支持多个域名的HTTPS爬虫ip服务器都是非常有价值的。本文将详细介绍如何利用SSL证书的SNI&#…...
HTML和CSS
HTML HTML(Hyper Text Markup Language):超文本语言 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。 标记语言:由标签构成的语言 HTML标签都是预定义好的。例如:使用&l…...
C#的IndexOf
在 C# 中,IndexOf 是一个字符串、数组或列表的方法,用于查找指定元素的第一个匹配项的索引。它返回一个整数值,表示匹配项在集合中的位置,如果未找到匹配项,则返回 -1。 IndexOf 方法有多个重载形式,可以根…...
深度学习2.神经网络、机器学习、人工智能
目录 深度学习、神经网络、机器学习、人工智能的关系 大白话解释深度学习 传统机器学习 VS 深度学习 深度学习的优缺点 4种典型的深度学习算法 卷积神经网络 – CNN 循环神经网络 – RNN 生成对抗网络 – GANs 深度强化学习 – RL 总结 深度学习 深度学习、神经网络…...
利用LLM模型微调的短课程;钉钉宣布开放智能化底座能力
🦉 AI新闻 🚀 钉钉宣布开放智能化底座能力AI PaaS,推动企业数智化转型发展 摘要:钉钉在生态大会上宣布开放智能化底座能力AI PaaS,与生态伙伴探寻企业服务的新发展道路。AI PaaS结合5G、云计算和人工智能技术的普及和…...
软件工程(七) UML之用例图详解
1、UML-4+1视图 UML-4+1视图将会与后面的架构4+1视图会一一对应上 视图往往出现在什么场景:我们看待一个事物,我们觉得它很复杂,难以搞清楚,为了化繁为简,我们会从一个侧面去看,这就是视图。而4+1视图就是分不同角度去看事物。 逻辑视图(logical view) 一般使用类与对…...
pd.cut()函数--Pandas
1. 函数功能 将连续性数值进行离散化处理:如对年龄、消费金额等进行分组 2. 函数语法 pandas.cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise, orderedTrue)3. 函数参数 参数含义x要离散分箱操作的数组&…...
DataBinding的基本使用
目录 一、MVC、MVP和MVVM框架的使用场景二、Java使用 一、MVC、MVP和MVVM框架的使用场景 MVC: 适用于小型项目,够灵活, 缺点:Activity不仅要做View的事情还要做控制和模型的处理,导致Activity太过臃肿,管理…...
eslint和prettier格式化冲突
下载插件 ESLint 和 Prettier ESLint 进入setting.json中 setting.json中配置 {"editor.tabSize": 2,"editor.linkedEditing": true,"security.workspace.trust.untrustedFiles": "open","git.autofetch": true,"…...
matlab使用教程(26)—常微分方程的求解
1.求解非刚性 ODE 本页包含两个使用 ode45 来求解非刚性常微分方程的示例。MATLAB 提供几个非刚性 ODE 求解器。 • ode45 • ode23 • ode78 • ode89 • ode113 对于大多数非刚性问题,ode45 的性能最佳。但对于允许较宽松的误差容限或刚度适中的问题&…...
尚硅谷宋红康MySQL笔记 14-18
是记录,不会太详细,受本人知识限制会有错误,会有个人的理解在里面 第14章 视图 了解一下,数据库的常见对象 对象描述表(TABLE)表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记…...
香港全新的虚拟资产服务商发牌制度
香港证监会2023年2月20日通告,原有虛擬資產交易平台如要符合資格參與當作為獲發牌的安排,必須在2023 年6 月1 日至2024 年2 月29 日期間(即由2023 年6 月1 日37起計九個月內)內,根據《打擊洗錢條例》下的虛擬資產服務提供者制度在網上提交完全…...
C# 泛型
目录 一、前言 二、相关内容 1、什么是泛型? 2、泛型类 3、泛型方法 4、限定类型参数 4.1、 类型参数的基本约束 4.2、接口约束 4.3、基类约束 4.5、泛型参数与限定类型参数的关系 4.6、自定义约束 5、使用泛型的好处 5.1、代码复用性 5.2、类型安全…...
servlet,Filter,责任的设计模式,静态代理
servlet servlet是前端和数据库交互的一个桥梁 静态网页资源的技术:在前端整个运行的过程中 我们的网页代码不发生改变的这种情况就称为静态的网页资源技术动态网页资源的技术:在前端运行的过程中 我们的前端页面代码会发生改变的这种情况就称为 动态的网…...
C++中的运算符总结(5):按位运算符(上)
C中的运算符总结(5):按位运算符(上) 9、按位运算符 NOT( ~)、 AND( &)、 OR( |)和 XOR( ^) 逻辑运算符和…...
8.Oracle中多表连接查询方式
表连接分类: 内连接、外连接、交叉连接、自连接 1 内连接 内连接是一种常见的多表关联查询方式,一般使用关键字INNER JOIN来实现。其中,INNER关键字可以省略,当只使用JOIN关键字时,语句只表示内连接操作。在使用内连…...
Linux 安装mysql(ARM架构)
添加mysql用户组和mysql用户 安装依赖libaio yum install -y libaio* 下载Mysql wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz安装mysql 解压Mysql tar xvf mysql-5.7.27-aarch64.tar.gz -C /usr/local/ 重命名 …...
git:git clone报错提示permissions xxxx for xxxxxx are too open
问题: 如题 参考: [密钥权限过大错误]ssh “permissions are too open” error 解决办法: 将id_rsa和id_rsa.pub的权限改为600...
elasticSearch数据的导入和导出
http://wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.gz 解压即可: 1、将索引中的数据导出到本地 myindex 是我的索引 elasticdump --inputhttp://localhost:9200/myindex--output/home/date/myindex.json2、将本地数据导入es中 elasticdum…...
DDR PHY
1.ddr phy架构 1.pub(phy unility block) 支持特性: (1)不支持SDRAM的DLL off mode (2)数据位宽是以8bit逐渐递增的(这样做的目的是因为可能支持16/32/64bit的总线位宽ÿ…...
XSS攻击是怎么回事?记录一下
title: XSS攻击 date: 2023-08-27 19:15:57 tags: [XSS, 网络安全] categories: 网络安全 今天学习了一个网络攻击的手段,XSS攻击技术,大家自建网站的朋友,记得看看是否有此漏洞。 🎈 XSS 攻击 全称跨站脚本攻击 Cross Site Sc…...
FFmpeg支持多线程编码并保存mp4文件示例
之前介绍的示例: (1).https://blog.csdn.net/fengbingchun/article/details/132129988 中对编码后数据保存成mp4 (2).https://blog.csdn.net/fengbingchun/article/details/132128885 中通过AVIOContext实现从内存读取数据 (3).https://blog.csdn.net/fengbingchun/…...
一文搞懂深度信念网络!DBN概念介绍与Pytorch实战
目录 一、概述1.1 深度信念网络的概述1.2 深度信念网络与其他深度学习模型的比较结构层次学习方式训练和优化应用领域 1.3 应用领域图像识别与处理自然语言处理推荐系统语音识别无监督学习与异常检测药物发现与生物信息学 二、结构2.1 受限玻尔兹曼机(RBM࿰…...
MyBatis:使用注解让数据库操作更简单
目录 一、简介 二、配置 三、基于注解的基本使用 四、测试 总结 一、简介 在Java开发中,数据库操作是一个常见而重要的任务。为了方便地执行SQL语句,获取结果集,处理异常等,我们通常需要使用JDBC(Java Database …...
网络优化方案/惠州百度关键词优化
花了几个小时终于把Sublime的配置搞定了,能够在里面写vex和Python,同时另外设置了Python对houdini模块的以及其他扩展包的自动填充功能。 这里简单讲一下安装sublime,因为这个不是重点,所以只介绍他的基本步奏了,本来就…...
有没有做试题的网站/市场营销案例150例
目标: Canny边缘检测的概念OpenCV的功能:cv.Canny()理论 Canny边缘检测是一种流行的边缘检测算法,它是由John F. Canny开发的。 1. 这是一个多阶段算法,我们将了解其中的每个阶段。 2. 降噪 由于边缘检测易受图像中的噪声影响,因此第一步是使用5x5高斯滤波器去除图像中…...
做企业网站设/公司网站制作模板
我在我的测试床系统上执行AJAX调用时遇到问题。网站上有错误的SSL证书的Jquery Ajax它没有域的有效SSL证书,而是使用生产系统使用的SSL证书,因为它的设置完全相同。我猜测这是因为SSL证书不好,我的ajax请求被迫使用HTTP而不是HTTPS。我可以确…...
响水做网站的价格/seo优化价格
对象的序列化主要解决的是对象状态的保存问题。这里所说的“对象状态”,其实就是指某一时刻对象所拥有的各个字段值的集合。 序列化最主要的作用有:1、在进程下次启动时读取上次保存的对象的信息 2、在不同的AppDomain或进程之间传递数据 3、在分布式应用…...
平谷区住房城乡建设委官方网站/餐饮营销引流都有什么方法
一、准备工作 Eureka通过运行多个实例,使其更具有高可用性。事实上,这是它默认的熟性,你需要做的就是给对等的实例一个合法的关联serviceurl 二、改造工作 在eureka-server工程中resources文件夹下,创建配置文件application-pe…...
可以用来做简单的网络验证的网站/国际形势最新消息
方法区知识概括栈 堆 方法区的交互关系方法区的理解设置方法区大小与 OOM方法区的内部结构方法区演进细节方法区的垃圾回收运行时数据区总结栈 堆 方法区的交互关系 从线程共享与否的角度来看: ThreadLocal:如何保证多个线程在并发环境下的安全性&…...