Mybatis | 動態SQL

目錄:

    • 動態SQL中的 “元素” :
      • \<if>元素
      • \<choose>、\<when>、\<otherwise>元素
      • \<where>、\<trim>元素
      • \<set>元素
      • \<foreach>元素
      • \<bind>元素

在這里插入圖片描述

作者簡介 :一只大皮卡丘,計算機專業學生,正在努力學習、努力敲代碼中! 讓我們一起繼續努力學習!

該文章參考學習教材為:
《Java EE企業級應用開發教程 (Spring + Spring MVC +MyBatis)》 黑馬程序員 / 編著
文章以課本知識點 + 代碼為主線,結合自己看書學習過程中的理解和感悟 ,最終成就了該文章

文章用于本人學習使用 , 同時希望能幫助大家。
歡迎大家點贊👍 收藏? 關注💖哦!!!

(侵權可聯系我,進行刪除,如果雷同,純屬巧合)


  • 在使用 JDBC其他類似的框架進行數據庫開發時,通常都要根據需求去手動拼裝SQL,這是一個非常麻煩且痛苦的工作,而 MyBatis提供的對SQL語句動態組裝的功能,能很好地解決這一麻煩工作。

動態SQL中的 “元素” :

  • 動態SQLMyBatis強大特性之一MyBatis3 采用了功能強大的基于 OGNL的表達式完成動態SQL
    消除之前版本中需要了解大多數元素,使用不到原來一半元素就能完成所需工作

  • MyBatis動態SQL 中的 主要元素 (用在 “映射文件” 中),如下表所示 :

    元素說明
    <if>判斷語句,用于單條件分支判斷
    <choose> ( <when>、<otherwise> )相當于Java中的switch…case…default語句,用于多條件分支判斷
    <where>、<trim>、 <set>輔助元素,用于處理一些SQL拼裝特殊字符問題
    <foreach>循環語句,常用于 in語句列舉條件
    <bind>OGNL表達式中創建一個變量,并將其綁定到上下文,常用于模糊查詢的sql中。

<if>元素

  • 在MyBatis中,<if>元素最常用判斷語句,它類似于Java中的 if語句,主要用于實現某些簡單條件選擇。在實際開發中, 我們可能會通過多個條件來精確地查詢某個數據<if>元素要結合其的 test屬性一起使用。使用 <if>元素時,只要test屬性中表達式為true,就會執行元素中條件語句

    例如,要查找某個客戶的信息, 可以通過姓名職業來查找客戶,也可以不填寫職業直接通過姓名查找客戶,還可以都不填寫而查詢出所有客戶,此時姓名和職業就是非必須條件 ( 可能通過這兩個條件來查詢,也可能取其中之一來進行查詢,如果此時還要程序員通過代碼來判斷就會顯得很麻煩,可通過動態SQL的 if元素 來根據實際情況來進行 “查詢”)。類似于這種情,在 MyBatis 中就可以通過 <if>元素來實現

  • <if>元素進行 “動態SQL 操作例子如 :
    Customer.java

    //使用注解來為該POJO類設置在 mybatis-config.xml配置文件中使用的 "別名"
    @Alias(value = "customer") // Alias : 設置別名
    public class Customer { // "顧客"類 --"持久化"類private Integer id; //主鍵private String username; //客戶名稱private String jobs; //職業private String phone; //電話public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getJobs() {return jobs;}public void setJobs(String jobs) {this.jobs = jobs;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Customer{" +"id=" + id +", username='" + username + '\'' +", jobs='" + jobs + '\'' +", phone='" + phone + '\'' +'}';}
    }
    

    mybatis-config.xml :(配置文件)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration><!--Mybatis的配置文件: mybatis-config.xml : 為全局配置文件,配置了“運行環境的信息”,主要內容是 : 數據庫的連接 (其屬于Mybatis操作步驟的第一步 : 讀取Mybatis-config.xml配置文件的"先行要準備好的內容")--><!--  1.配置環境,默認環境id為mysql  --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><!--  用于指定MyBatis獲取數據庫連接的方式。“POOLED”代表的是連接池。 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--  2.配置Mapper文件的位置 : mybatis.config.xml配置文件要讀取映射文件: 即讀取mapper.xml文件   --><!--  因為按照"Mybatis框架的執行流程圖 : 加載了mybatis-config.xml配置文件之后,是要加載"映射文件"的,所以  --><!--  讀取"映射文件"  --><mappers><mapper resource="CustomerMapper.xml"/></mappers></configuration>
    

    CustomerMapper.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"><!--  namespace的命名空間 -->
    <mapper namespace="CustomerMapper"><!--  使用resultMap解決 “屬性名” 和 “字段名”不一致的,使得數據能成功映射到POJO類中  --><resultMap id="resultMap_Customer" type="Customer"><id property="id" column="t_id"/><result property="username" column="t_username"/><result property="jobs" column="t_jobs"/><result property="phone" column="t_phone"/></resultMap><!-- 動態SQL,解決實際開發中“查詢”條件不確定,讓程序自行判斷是否要將其加入到“查詢SQL語句”中的情況  --><!--   if元素使用  --><!--  test="username != null and username != '' 對username屬性進行 “非空判斷”  --><select id="findCustomerByNameAndJob" parameterType="com.myh.po.Customer" resultMap="resultMap_Customer">select * from t_customer where 1=1<if test="username != null and username != ''">and t_username like concat('%',#{username},'%')</if><if test="jobs != null and jobs !=''">and t_jobs = #{jobs}</if></select></mapper>
    

    動態SQLTest.java : (測試類 )

    ![外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=Typora%2F%E7%9F%A5%E8%AF%86%E7%82%B9%E5%9B%BE%E7%89%87%2FMybatis%2F%E5%8A%A8%E6%80%81SQL%2F%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.jpg&pos_id=img-uEcUK4Sw-1709389766682)public class 動態SQLTest {/*** 根據客戶姓名和職業組合條件查詢客戶信息列表*/@Test //單元測試public void findCustomerByNameAndJobsTest() throws IOException {//1.讀取mybatis-config.xml配置文件 (通過"輸入流"來讀取)String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根據配置文件(通過SqlSessionFactoryBuilder對象 )創建"會話工廠"對象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.獲得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//創建Customer對象,組合封裝組合查詢的條件Customer customer = new Customer();customer.setUsername("小明");//執行SqlSession的selectList()方法List<Customer> customers = sqlSession.selectList("CustomerMapper.findCustomerByNameAndJob", customer);//輸出查詢結果for (Customer customer1 : customers) {System.out.println(customer1);}//管邊SqlSessionsqlSession.close();}
    }
    

    控制臺運行結果
    在這里插入圖片描述

    上圖可以看出,傳遞的只有一個參數 username=‘小明’,另一個屬性沒傳遞參數,此時”映射文件“中進行了動態SQL動態的根據參數查詢數據庫中數據

<choose>、<when>、<otherwise>元素

  • 在使用 <if>元素時,只要test屬性中表達式為true,就會執行元素中條件語句但是在實際應用中,有時只需要從多個選項中選擇一個去執行

  • 例如下面的場景:
    當客戶名稱不為空,則只根據客戶名稱進行客戶篩選;
    當客戶名稱為空,而客戶職業不為空,則只根據客戶職業進行客戶篩選
    當客戶名稱和客戶職業都為空,則要求查詢出所有電話不為空客戶信息。”
    此種情況下,使用 <if>元素進行處理是非常不合適的。如果使用的是Java語言,這種情況顯然更適合使用 switch…case…default語句來處理。針對以上這種情況 / 這種開發需求,MyBatis 中可以使用 <choose>、<when>、 <otherwise> 元素進行處理

  • 例子如

    CustomerMapper.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"><!--  namespace的命名空間 -->
    <mapper namespace="CustomerMapper"><!--  使用resultMap解決 “屬性名” 和 “字段名”不一致的,使得數據能成功映射到POJO類中  --><resultMap id="resultMap_Customer" type="com.myh.po.Customer"><id property="id" column="t_id"/><result property="username" column="t_username"/><result property="jobs" column="t_jobs"/><result property="phone" column="t_phone"/></resultMap><!--  <choose> <when> <otherwise> 元素的使用 (動態SQL)  --><!--  <choose> <when> <otherwise> 分別代表 Java中的 switch case default (功能也是相同的,前面的獲取了,后面的就不再獲取了)  --><select id="findCustomerByNameAndJob2" parameterType="com.myh.po.Customer" resultMap="resultMap_Customer">select * from t_customer where 1=1<choose><when test="username != null and username != ''">and t_username like concat('%',#{username},'%')</when><when test="jobs != null and jobs != ''">and t_jobs = #{jobs}</when><otherwise>and t_phone is not null</otherwise></choose></select>
    </mapper>
    

    在上述代碼中,使用了 <choose>元素進行SQL拼接當第一個 <when>元素中的條件為真,則只動態組裝第一個<when>元素 內SQL片段否則就繼續向下 判斷第二個<when>元素中的條件是否為真,以此類推。當前面所<when>元素中的條件都不為真時,則只組裝<otherwise>元素內的SQL片段


    動態SQLTest.java

    public class 動態SQLTest {/*** 根據客戶姓名、職業和電話號碼進行類型于 switch、case、default式開發*/@Test //單元測試public void findCustomerByNameAndJobsTest2() throws IOException {//1.讀取mybatis-config.xml配置文件 (通過"輸入流"來讀取)String resource = "com/myh/動態SQL/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根據配置文件(通過SqlSessionFactoryBuilder對象 )創建"會話工廠"對象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.獲得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//創建Customer對象,組合封裝組合查詢的條件Customer customer = new Customer();customer.setJobs("學生");//執行SqlSession的selectList()方法List<Customer> customers = sqlSession.selectList("CustomerMapper.findCustomerByNameAndJob2", customer);//輸出查詢結果for (Customer customer1 : customers) {System.out.println(customer1);}//管邊SqlSessionsqlSession.close();}
    }
    

    控制臺輸出結果1
    在這里插入圖片描述

    上述的輸出結果是 :只有一個jobs參數 : 學生。所以按照switchcasedefault,被“映射文件”中的第二個<when>元素攔截,所以有以上結果。


    控制臺輸出結果2
    customer.setJobs(“學生”);語句注釋掉,則會按照第三個條件 :查詢出所有電話不為空客戶信息。相當于用default / <otherwise> 元素中的sql語句查詢數據庫。 輸出內容如下所示 :

    在這里插入圖片描述

<where>、<trim>元素

  • 在前兩個元素的案例中,映射文件中編寫的SQL后面都加入了"where 1=1”的條件,那么到底為什么要這么寫呢?如果將where 后“1=1” 的條件去掉,那么MyBatis所拼接出來的SQL將會如下所示 :

    select * from t_customer where 1=1 and t_username like concat('%',?,'%')
    
  • 上面SQL中,where后直接跟的是and,這在運行時肯定會報SQL語法錯誤 ( 開發中,如果沒有where 1=1 ,直接用 if 和 choose元素 的話是會報錯的 ),而加入了條件“1=1”后,既保證了where后面的條件成立,又避免了where后面第一個詞是 and或者or之類的關鍵詞。那么在MyBatis 中,有沒有什么辦法不用加入“1=1”這樣的條件,也能使拼接后的SQL成立 呢?

    -----MyBatis 提供了 <where>元素處理這樣的問題。 ( 將 where 1 = 1刪除 , 用<where>元素進行替換)

        <!-- 用<where>元素來替代 where 1=1  --><select id="findCustomerByNameAndJob3" parameterType="com.myh.po.Customer" resultMap="resultMap_Customer">select * from t_customer<where><if test="username != null and username != ''">and t_username like concat('%',#{username},'%')</if><if test="jobs != null and jobs !=''">and t_jobs = #{jobs}</if></where></select>
    

    上述配置代碼中,使用 <where>元素對“where 1=1” 條件 進行了替換<where>元素自動判斷 組合條件下拼裝的SQL語句只有 <where>元素內的條件成立時,才會在拼接SQL中入where關鍵字否則將不會添加即使where之后的內容 有多余的“AND” 或 “OR”,<where>元素也會自動將它們去除

  • 除了使用 <where>元素外,還可以通過 <trim>元素定制需要的功能上述代碼還可以修改為如下形式

        <!-- <trim>元素  --><!--  prefix : 表示語句的前綴, prefix="where" : 用where來進行sql語句拼接 --><!--  prefixOverrides : 表示“要去除的特殊字符”, prefixOverrides="and" : 去除sql語句中的and --><select id="findCustomerByNameAndJob4" parameterType="com.myh.po.Customer" resultMap="resultMap_Customer">select * from t_customer<trim prefix="where" prefixOverrides="and"><if test="username != null and username != ''">and t_username like concat('%',#{username},'%')</if><if test="jobs != null and jobs !=''">and t_jobs = #{jobs}</if></trim></select>
    

    上述配置代碼中,同樣使用 <trm>元素"where1=1” 條件進行了替換,<trim>元素的作用去除一些特殊的字符串, 它的 prefix屬性代表的是語句的前綴 ( 這里使用where連接后面SQL片段 ) ,而 prefixoOverrides屬性代表的是需要去除的那些特殊字符串 ( 這里定義了要去除SQL中的and ),上面的寫法和使用 <where>元素基本是等效的。

<set>元素

  • Hibernate中,如果想要更新某一個對象, 就需要發送所有的字段給持久化對象,然而實際應用中,大多數情況下都是更新某一個幾個字段如果更新的每一條數據都要將其所有的屬性更新一遍,那么其執行效率非常差
    ( 而且實際開發中要修的內容是不定的,如果要預估所有的情況而提前設置好合適的set語句來修改數據庫,顯然是不合理的,這時可用動態SQL來解決,傳來什么數據則設置修改什么數據 )

  • 為了解決上述情況中問題,MyBatis中提供了 <set>元素來完成這一工作。<set>元素主要用于更新操作,其主要作用是在動態包含的SQL語句前輸出一個SET關鍵字,并將SQL語句最后一個多余的逗號去除 (根據傳入的“參數”的情況來動態的修改 數據庫中的“數據”,通過<set>元素中的<if>元素來動態判斷

     <!-- <set>元素 : 動態修改操作 --><!-- <set>元素會動態判斷去修改數據庫中的數據,同時會將多余的"逗號"去除掉 --><update id="updateCustomer" parameterType="com.myh.po.Customer">update t_customer<set><if test="username != null and username != ''">set t_username = #{username},</if><if test="jobs != null and jobs != ''">set t_jobs=#{jobs},</if><if test="phone != null and phone != ''">set t_phone=#{phone},</if></set>where id = #{id}</update>
    

    注意
    映射文件中使用 <set><if>元素組合進行update語句動態SQL組裝時如果 <set> 元素內包含的內容都為空,則會出現SQL語法錯誤。所以在使用 <set>元素進行字段信息更新時,要確保傳入的更新字段不能都為空

<foreach>元素

  • 在實際開發中,有時可能會遇到這樣的情況 : 假設在一個客戶表中有 1000條數據,現在需要將id值小于 100客戶信息全部查詢出來,這要怎么做呢? 有人也許會說,“我可以一條一條查出來”,那如果查詢200300甚至更多也一條條查嗎? 這顯然是不可取的。
    有的人會想到,可以在Java方法中使用循環,將查詢方法放在循環語句中,然后通過條件循環的方式查詢出所需的數據。這種查詢方式雖然可行,但每執行一次循環語句, 都需要向數據庫中發送一條查詢SQL,其查詢效率是非常低的此時我們可以通過SQL語句來執行這種查詢

  • MyBatis中已經提供了一種用于數組 和 集合循環遍歷方式,那就是使用 <foreach>元素,我們完全可以通過 <foreach>元素來解決上述類似的問題

  • <foreach>元素通常在構建IN條件語句時使用,其使用方式如下 :

 <!-- <foreach>元素使用 --><!-- <foreach>元素通常在構建IN條件語句中使用 -->
<select id="findCustomerByIds" parameterType="List" resultMap="resultMap_Customer">select * from t_customer where id in
<foreach item="id" index="index" collection="list" separator="," open="(" close=")">#{id}</foreach>
</select>
  • 假設上述 傳入的id集合中內容為 : 1,3,5 。那么上述代碼最后拼接的sql 語句 為 : select * from t_customer where id in (1,3,5)foreache元素中的各個屬性作用將在下面中講述。)
    ( 通過以上代碼可實現 <foreach> 元素對傳入的客戶編號集合進行了動態SQL組裝,最終成功批量查詢出了對應的客戶信息。)

  • 在上述“映射文件”代碼中,使用了 <foreach>元素傳入的集合進行遍歷并進行了動態SQL組裝。關于 <foreach>元素中使用的幾種屬性的描述具體如下:

屬性描述
item配置 循環中當前的 元素
如 : 傳入一個1,3,5id集合item分別代表其中的1,3,5
index配置 當前元素集合位置下標
collection配置 傳遞過來的 “參數類型” ( 首字母小寫 )。它可以是一個arraylist ( 或 collection)、Map 集合POJO包裝類數組集合類型屬性名等。
open遍歷所有元素” 之前“插入 / 配置” 的 “前綴”
close遍歷所有元素” 之后“插入 / 配置” 的 “后綴”
open 和 close配置的是 以什么符號將這些集合元素包裝起來
separator配置的是 各個元素間隔符

注意一
可迭代對象** (如列表集合等) 和任何的字典或者數組對象傳遞給 <foreach>作為集合參數。當使用 可迭代對象或者數組時,index 是當前迭代的次數,item 的值是本次迭代獲取的元素
當使用字典(或者Map.Entry對象的集合)時,index 是鍵,item 是值。


注意二
在使用 <foreach> 時最關鍵也是最容易出錯的就是collection 屬性該屬性是必須指定,而且在不同情況下,該屬性的值是不一樣的。主要有以下3種情況
(1) 如果傳入的是 單參數且參數類型是一個數組或者List 的時候,collection 屬性值分別為
arraylist ( 或collection )
(2) 如果傳入的
參數是多個的時候,就需要把它們封裝成一個Map了,當然單參數也可以
封裝
Map集合
,這時候==collection屬性值就為Map的鍵。
(3) 如果傳入的參數是
POJO包裝類的時候,collection屬性值就為該包裝類中需要進行遍歷
數組或集合屬性名
設置collction 屬性值的時候,必須按照實際情況配置否則程序就會出現異常


Test.java (測試類):

/*** 根據客戶端“編號”查詢客戶信息*/@Test //單元測試public void findCustomerById() throws IOException {//1.讀取mybatis-config.xml配置文件 (通過"輸入流"來讀取)String resource = "com/myh/動態SQL/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根據配置文件(通過SqlSessionFactoryBuilder對象 )創建"會話工廠"對象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.獲得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//創建List集合,封裝查詢idList<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(2);//執行SqlSession的查詢方法List<Customer> customers = sqlSession.selectList("CustomerMapper3.findCustomerByIds", ids);//傳入參數是List類型,所以collection="list"//打印輸出結果for (Customer customer = customers ) {System.out.println(customer);}//關閉SqlSession}

上面傳的 參數類型List類型,所以 “映射文件”中的collection的值為: list。同時集合中的id數據為 : 1,2映射文件” 會根據傳入的1,2來進行數據庫查詢

<bind>元素

  • 在進行 模糊查詢 編寫SQL語句的時候,如果使用 ${}" 進行 字符串拼接,則無法防上sql注入問題
    如果使用concat函數進行拼接,則只針對MySQL數據庫有效;如果使用的是Oracle數據庫,則要使用連接符號“ ||”。 這樣,映射文件中的SQL要根據不同的情況提供不同形式實現,這顯然是比較麻煩的,且不利于項目的移植。為此,MyBatis 提供了 <bind>元素來解決這一問題,我們完全不必使用數據庫語言,只要使用MyBatis的語言即可與所需參數連接

  • MyBatis的 <bind>元素 可以通過OGNL表達式來創建一個上下文變量, 其使用方式如下 :

    映射文件 中代碼 :

     <!-- <bind>元素的使用: 根據客戶名模糊查詢"客戶信息" --><select id="findCustomerByName" parameterType="List" resultMap="resultMap_Customer">-- _parameter.getUsername()也可直接寫入傳入的字段屬性名,即username<bind name="pattern_username" value="'%'+_parameter.getUsername()+'%'"/>select * from t_customer where username like #{pattern_username}</select>
    

    上述配置代碼中,使用 <bind>元素定義了一個namepattern_username 的變量,<bind>
    元素中value的屬性值就是拼接的查詢字符串,其中 _parameter.getUsername( )表示傳遞進來的
    參數 (也可以直接寫成對應的
    參數變量名
    ,如username )。在SQL語句中,直接引用 <bind>元
    name屬性值即可進行動態SQL組裝


    單元測試

    /*** <bind>元素的使用 : 根據客戶名模糊查詢客戶信息 (使用<bind>元素進行動態SQL組裝)*/@Test //單元測試public void findCustomerByNameTest() throws IOException {//1.讀取mybatis-config.xml配置文件 (通過"輸入流"來讀取)String resource = "com/myh/動態SQL/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根據配置文件(通過SqlSessionFactoryBuilder對象 )創建"會話工廠"對象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.獲得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();Customer customer = new Customer();customer.setUsername("明");//執行SqlSession的查詢方法,返回結果集List<Customer> customers = sqlSession.selectList("CustomerMapper3.findCustomerByName", customer);//輸出結果for (Customer customer1 : customers) {System.out.println(customer1);}}
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715195.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單細胞Seurat - 降維與細胞標記(4)

本系列持續更新Seurat單細胞分析教程&#xff0c;歡迎關注&#xff01; 非線形降維 Seurat 提供了幾種非線性降維技術&#xff0c;例如 tSNE 和 UMAP&#xff0c;來可視化和探索這些數據集。這些算法的目標是學習數據集中的底層結構&#xff0c;以便將相似的細胞放在低維空間中…

__vueParentComponent和__vue__獲取dom元素上的vue實例

vue2: 使用__vue__ const el document.querySelector(.xxx); const vueInstance el.__vue__;vue3: 使用 __vueParentComponent const el document.querySelector(.xxx); const vueInstance el.__vueParentComponent;

Python錯題集-4:NameError:(變量名錯誤)

1問題描述 Traceback (most recent call last): File "D:\pycharm\projects\1-可視化學習\8.3更改小提琴圖的中位數、均值、顏色等.py", line 8, in <module> violin_parts plt.violinplot(data, showmediansTrue, showmeansTrue) …

代碼隨想錄算法訓練營第四十四天 完全背包 、零錢兌換 II 、組合總和 Ⅳ

代碼隨想錄算法訓練營第四十四天 | 完全背包 、零錢兌換 II 、組合總和 Ⅳ 完全背包 題目鏈接&#xff1a;題目頁面 (kamacoder.com) 解釋一、01背包 一維 &#xff1a;為什么要倒序遍歷背包&#xff1f; 首先要明白二維數組的遞推過程&#xff0c;然后才能看懂二維變一維的…

【MATLAB源碼-第150期】基于matlab的開普勒優化算法(KOA)機器人柵格路徑規劃,輸出做短路徑圖和適應度曲線。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 開普勒優化算法&#xff08;Kepler Optimization Algorithm, KOA&#xff09;是一個虛構的、靈感來自天文學的優化算法&#xff0c;它借鑒了開普勒行星運動定律的概念來設計。在這個構想中&#xff0c;算法模仿行星圍繞太陽的…

項目風險:測試大佬結合實例告訴你如何應對!

項目有風險 今天下午15點&#xff0c;團隊成員D向他的主管Z反饋他測試的項目有風險&#xff1a;項目在測試周期內&#xff0c;但在用例評審時發現有一處功能邏輯有爭議&#xff0c;需要產品經理跟業務方確認&#xff0c;可能出現的情況有&#xff1a; 1 不變更需求&#xff0…

【技巧】SpringCloud Gateway實現多子域(單個應用開放多個端口)

0. 目錄 1. 需求背景2. 實現3. 額外 - 其它Servlet容器實現3.1 Undertow3.2 Tomcat 4. 相關 1. 需求背景 瀏覽器針對單個網站地址(ipport)存在“6個請求”限制&#xff1b;通過多子域配置可以突破這個限制&#xff0c;增加網站的響應效率&#xff0c;尤其是針對三維服務這類大…

【深入了解設計模式】組合設計模式

組合設計模式 組合模式是一種結構型設計模式&#xff0c;它允許你將對象組合成樹狀結構來表現“整體-部分”關系。組合模式使得客戶端可以統一對待單個對象和組合對象&#xff0c;從而使得代碼更加靈活和易于擴展。 概述 ? 對于這個圖片肯定會非常熟悉&#xff0c;上圖我們可…

Carla自動駕駛仿真九:車輛變道路徑規劃

文章目錄 前言一、關鍵函數二、完整代碼效果 前言 本文介紹一種在carla中比較簡單的變道路徑規劃方法&#xff0c;主要核心是調用carla的GlobalRoutePlanner模塊和PID控制模塊實現變道&#xff0c;大體的框架如下圖所示。 一、關鍵函數 1、get_spawn_point(),該函數根據指定r…

c語言字符串函數之strcpy函數,strnpy函數

strcpy函數 語法格式 strcpy(字符數組1,字符串2&#xff09; 它的作用是把字符串2復制到字符數組1里面 #include<stdio.h> #include<string.h> int main() {char c[]"河南";char d[]"安徽";char d[];printf("%s\n",strcpy(c,d));…

力扣hot100題解(python版41-43題)

41、二叉樹的層序遍歷 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3],[9,20],[15,7]]示例…

【C語言結構體】用戶自定義類型--結構體,結構體傳參,位段,聯合體和枚舉【圖文詳解】

歡迎來CILMY23的博客喔&#xff0c;本篇為【C語言結構體】用戶自定義類型--結構體&#xff0c;結構體傳參&#xff0c;位段&#xff0c;聯合體和枚舉【圖文詳解】&#xff0c;感謝觀看&#xff0c;支持的可以給個一鍵三連&#xff0c;點贊關注收藏。 前言 上一篇&#xff08;ht…

GO—函數

Go 語言支持普通函數、匿名函數和閉包&#xff0c;從設計上對函數進行了優化和改進&#xff0c;讓函數使用起來更加方便。 Go 語言的函數屬于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是說&#xff1a; 函數本身可以作為值進行傳遞。支持匿名函數和閉…

Leetcode.2369 檢查數組是否存在有效劃分

題目鏈接 Leetcode.2369 檢查數組是否存在有效劃分 rating : 1780 題目描述 給你一個下標從 0 0 0 開始的整數數組 n u m s nums nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為…

推薦6款SSH遠程連接工具

1、Xshell 介紹&#xff1a; xshell是一個非常強大的安全終端模擬軟件&#xff0c;它支持SSH1, SSH2, 以及Windows平臺的TELNET 協議。Xshell可以在Windows界面下用來訪問遠端不同系統下的服務器&#xff0c;從而比較好的達到遠程控制終端的目的。 業界最強大的SSH客戶機 官…

數據分析-Pandas數據的直方圖探查

數據分析-Pandas數據的直方圖探查 數據分析和處理中&#xff0c;難免會遇到各種數據&#xff0c;那么數據呈現怎樣的規律呢&#xff1f;不管金融數據&#xff0c;風控數據&#xff0c;營銷數據等等&#xff0c;莫不如此。如何通過圖示展示數據的規律&#xff1f; 數據表&…

農產品質量追溯系統—功能介紹(2)

儲藏管理 儲藏信息管理對需要儲藏的農產品,記錄儲藏的相關信息,如儲藏開始時間、存放倉庫、操作人員、儲藏原因等; 倉庫信息管理物流管理 物流公司管理對相關的物流公司信息進行登記,以便于管理和追溯; 車輛管理

我的秋招數據分析崗面經分享(京東,美團,阿里,拼多多,vivo,滴滴)

節前&#xff0c;我們社群組織了一場技術&面試討論會&#xff0c;邀請了一些互聯網大廠同學、參加社招和校招面試的同學&#xff0c;針對新手如何入門數據分析、機器學習算法、該如何備戰面試、面試常考點分享等熱門話題進行了深入的討論。 基于社群的討論&#xff0c;今天…

力扣爆刷第84天之hot100五連刷6-10

力扣爆刷第84天之hot100五連刷6-10 文章目錄 力扣爆刷第84天之hot100五連刷6-10一、15. 三數之和二、42. 接雨水三、3. 無重復字符的最長子串四、438. 找到字符串中所有字母異位詞五、560. 和為 K 的子數組 一、15. 三數之和 題目鏈接&#xff1a;https://leetcode.cn/problem…

JAVA學習筆記13(位運算)

1.位運算 1.1 原碼、反碼、補碼 ? *規則&#xff1a; ? 1.二進制的最高位是符號位&#xff1a;0表示正數&#xff0c;1表示負數 ? 2.正數的原碼&#xff0c;反碼&#xff0c;補碼都一樣&#xff08;三碼合一&#xff09; ? 3.負數的反碼 他的原碼符號位不變&#xff…