中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

零基礎(chǔ)網(wǎng)站建設(shè)教程seo的基本步驟是什么

零基礎(chǔ)網(wǎng)站建設(shè)教程,seo的基本步驟是什么,怎樣重新下載wordpress,自動(dòng)化的網(wǎng)站建設(shè)文章目錄 介紹org.apache.ibatis.jdbc.SQLSQL類使用示例SelectProvider搭配動(dòng)態(tài)SQLAbstractSQL類源碼分析 介紹 當(dāng)我們需要使用Statement對(duì)象執(zhí)行SQL時(shí),SQL語句會(huì)嵌入Java代碼中。SQL語句比較復(fù)雜時(shí),我們可能會(huì)在代碼中對(duì)SQL語句進(jìn)行拼接,查…

文章目錄

  • 介紹
  • org.apache.ibatis.jdbc.SQL
  • SQL類使用示例
  • @SelectProvider搭配動(dòng)態(tài)SQL
  • AbstractSQL類源碼分析

介紹

當(dāng)我們需要使用Statement對(duì)象執(zhí)行SQL時(shí),SQL語句會(huì)嵌入Java代碼中。SQL語句比較復(fù)雜時(shí),我們可能會(huì)在代碼中對(duì)SQL語句進(jìn)行拼接,查詢條件不固定時(shí),還需要根據(jù)不同條件拼接不同的SQL語句。在MyBatis中已經(jīng)為我們提供了這類開發(fā)工具類。
MyBatis 中的 AbstractSQL 類是 MyBatis 提供的一個(gè)用于構(gòu)建動(dòng)態(tài) SQL 語句的工具類。它的主要用途是幫助開發(fā)者更靈活、優(yōu)雅地拼接復(fù)雜的 SQL 語句,尤其是在需要根據(jù)條件生成不同的 SQL 語句時(shí),可以減少手動(dòng)拼接 SQL 字符串的繁瑣工作,并提高代碼的可讀性和維護(hù)性。
在日常開發(fā)中,尤其是當(dāng)涉及到復(fù)雜查詢、更新、插入時(shí),AbstractSQL 可以用于生成動(dòng)態(tài) SQL。其用途主要包括以下幾個(gè)方面:

動(dòng)態(tài)條件查詢:根據(jù)不同的條件拼接 SELECT 語句。
動(dòng)態(tài)插入:根據(jù)傳入的實(shí)體類生成不同的 INSERT 語句。
動(dòng)態(tài)更新:根據(jù)條件生成 UPDATE 語句,只更新有值的字段。
動(dòng)態(tài)刪除:根據(jù)條件拼接 DELETE 語句。
AbstractSQL 的核心思想是通過鏈?zhǔn)秸{(diào)用的方式構(gòu)建 SQL 語句,這類似于構(gòu)建器模式(Builder Pattern)。

org.apache.ibatis.jdbc.SQL

public class SQL extends AbstractSQL<SQL> {@Overridepublic SQL getSelf() {return this;}
}

SQL類繼承了AbstractSQL,在日常開發(fā)中一般使用SQL類。

SQL類使用示例

【動(dòng)態(tài)構(gòu)建 SELECT 查詢】

  @Testpublic void testSelectSQL() {String orgSql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" +"FROM PERSON P, ACCOUNT A\n" +"INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" +"INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" +"WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" +"OR (P.LAST_NAME like ?)\n" +"GROUP BY P.ID\n" +"HAVING (P.LAST_NAME like ?) \n" +"OR (P.FIRST_NAME like ?)\n" +"ORDER BY P.ID, P.FULL_NAME";String newSql = new SQL() {{SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");FROM("PERSON P");FROM("ACCOUNT A");INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");WHERE("P.ID = A.ID");WHERE("P.FIRST_NAME like ?");OR();WHERE("P.LAST_NAME like ?");GROUP_BY("P.ID");HAVING("P.LAST_NAME like ?");OR();HAVING("P.FIRST_NAME like ?");ORDER_BY("P.ID");ORDER_BY("P.FULL_NAME");}}.toString();assertEquals(orgSql, newSql);}
// 匿名內(nèi)部類風(fēng)格
public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}// Builder / Fluent 風(fēng)格
public String insertPersonSql() {String sql = new SQL().INSERT_INTO("PERSON").VALUES("ID, FIRST_NAME", "#{id}, #{firstName}").VALUES("LAST_NAME", "#{lastName}").toString();return sql;
}// 動(dòng)態(tài)條件(注意參數(shù)需要使用 final 修飾,以便匿名內(nèi)部類對(duì)它們進(jìn)行訪問)
public String selectPersonLike(final String id, final String firstName, final String lastName) {return new SQL() {{SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");FROM("PERSON P");if (id != null) {WHERE("P.ID like #{id}");}if (firstName != null) {WHERE("P.FIRST_NAME like #{firstName}");}if (lastName != null) {WHERE("P.LAST_NAME like #{lastName}");}ORDER_BY("P.LAST_NAME");}}.toString();
}public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}public String insertPersonSql() {return new SQL() {{INSERT_INTO("PERSON");VALUES("ID, FIRST_NAME", "#{id}, #{firstName}");VALUES("LAST_NAME", "#{lastName}");}}.toString();
}public String updatePersonSql() {return new SQL() {{UPDATE("PERSON");SET("FIRST_NAME = #{firstName}");WHERE("ID = #{id}");}}.toString();
}

相關(guān)官方文檔:
https://mybatis.org/mybatis-3/zh_CN/statement-builders.html

@SelectProvider搭配動(dòng)態(tài)SQL

@SelectProvider 注解是 MyBatis 提供的一種動(dòng)態(tài) SQL 語句生成方式,用于將復(fù)雜的查詢邏輯封裝在 Java 方法中,而不是直接在 Mapper 接口的方法上書寫固定的 SQL 語句。通過 @SelectProvider 注解,MyBatis 可以根據(jù)實(shí)際情況動(dòng)態(tài)生成 SQL,這使得 SQL 語句更加靈活和可維護(hù)。
@SelectProvider 的基本語法

@SelectProvider(type = SQLProviderClass.class, method = "methodName")
List<ResultType> selectMethod(參數(shù));

type:指定提供 SQL 語句的類(通常稱為 Provider 類)。
method:指定 Provider 類中的方法名稱,該方法用于動(dòng)態(tài)生成 SQL。
selectMethod:Mapper 接口中的方法,最終會(huì)執(zhí)行 methodName 返回的 SQL 語句。

這個(gè)注解和@SELECT的區(qū)別在于@SelectProvider 注解可以中參數(shù)SQLProviderClass可以搭配SQL動(dòng)態(tài)語句類關(guān)聯(lián)SQL。

  @SelectProvider(type = UserSqlProvider.class, method = "buildSelectSql")List<Map<String, Object>> selectUsers(Map<String, Object> params);
public class UserSqlProvider {public String buildSelectSql(Map<String, Object> params) {return new SQL() {{SELECT("*");FROM("t_user");if (params.get("name") != null) {WHERE("name = #{name}");}if (params.get("age") != null) {WHERE("age = #{age}");}ORDER_BY("id DESC");}}.toString();}
}

測(cè)試類:

  /*** 測(cè)試@SelectProvider使用*/@Testpublic void test6() throws Exception {InputStream resource = Resources.getResourceAsStream(MybatisTest.class.getClassLoader(), "mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);Configuration configuration = sqlSessionFactory.getConfiguration();// 手動(dòng)注冊(cè)mapperconfiguration.addMapper(UserMapper.class);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String, Object> params = new HashMap<>();params.put("name", "zhangSan");params.put("age", 18);List<Map<String, Object>> res = mapper.selectUsers(params);System.out.println(res);}

在這里插入圖片描述

AbstractSQL類源碼分析

SQL繼承至AbstractSQL類,只重寫了該類的getSelf()方法,所有的功能由AbstractSQL類完成,AbstractSQL類中維護(hù)了一個(gè)SQLStatement內(nèi)部類的實(shí)例和一系列前面提到過的構(gòu)造SQL語句的方法,例如SELECT()、UPDATE()等方法。

  public enum StatementType {DELETE, INSERT, SELECT, UPDATE}
  StatementType statementType;List<String> sets = new ArrayList<>();List<String> select = new ArrayList<>();List<String> tables = new ArrayList<>();List<String> join = new ArrayList<>();List<String> innerJoin = new ArrayList<>();List<String> outerJoin = new ArrayList<>();List<String> leftOuterJoin = new ArrayList<>();List<String> rightOuterJoin = new ArrayList<>();List<String> where = new ArrayList<>();List<String> having = new ArrayList<>();List<String> groupBy = new ArrayList<>();List<String> orderBy = new ArrayList<>();List<String> lastList = new ArrayList<>();List<String> columns = new ArrayList<>();List<List<String>> valuesList = new ArrayList<>();boolean distinct;String offset;String limit;LimitingRowsStrategy limitingRowsStrategy = LimitingRowsStrategy.NOP;
 switch (statementType) {case DELETE:answer = deleteSQL(builder);break;case INSERT:answer = insertSQL(builder);break;case SELECT:answer = selectSQL(builder);break;case UPDATE:answer = updateSQL(builder);break;default:answer = null;}

SQLStatement內(nèi)部類用于描述一個(gè)SQL語句,該類中通過StatementType確定SQL語句的類型。SQLStatement類中還維護(hù)了一系列的ArrayList屬性,當(dāng)調(diào)用SELECT()、UPDATE()等方法時(shí),這些方法的參數(shù)內(nèi)容會(huì)記錄在這些ArrayList對(duì)象中。
AbstrastSQL類重寫了toString()方法,該方法中會(huì)調(diào)用SQLStatement對(duì)象的sql()方法生成SQL字符串。這里會(huì)根據(jù)不同的SQL類型進(jìn)行不同類型的SQL語句拼接。

   private String selectSQL(SafeAppendable builder) {if (distinct) {sqlClause(builder, "SELECT DISTINCT", select, "", "", ", ");} else {sqlClause(builder, "SELECT", select, "", "", ", ");}sqlClause(builder, "FROM", tables, "", "", ", ");joins(builder);sqlClause(builder, "WHERE", where, "(", ")", " AND ");sqlClause(builder, "GROUP BY", groupBy, "", "", ", ");sqlClause(builder, "HAVING", having, "(", ")", " AND ");sqlClause(builder, "ORDER BY", orderBy, "", "", ", ");limitingRowsStrategy.appendClause(builder, offset, limit);return builder.toString();}
  @Testpublic void testSelectSQL2() {String newSql = new SQL() {{SELECT("name,mobile_no,age");FROM("t_user A");INNER_JOIN("student B on B.name = A.name");WHERE("B.name like ?");OR();WHERE("A.ID = ?");ORDER_BY("A.ID DESC");}}.toString();System.out.println(newSql);}

在這里插入圖片描述

http://www.risenshineclean.com/news/51292.html

相關(guān)文章:

  • wordpress 登錄seo外包公司專家
  • 網(wǎng)站策劃內(nèi)容有哪些靠譜的代運(yùn)營(yíng)公司
  • 企業(yè)網(wǎng)站建設(shè)怎么選擇空間百度關(guān)鍵詞優(yōu)化平臺(tái)
  • 網(wǎng)址ip域名解析寧波seo推廣如何收費(fèi)
  • 手機(jī)怎樣做網(wǎng)站圖解品牌推廣軟文200字
  • 跟我一起做網(wǎng)站 下載seo搜索優(yōu)化技術(shù)
  • 網(wǎng)站工作室最牛餐飲營(yíng)銷手段
  • 自己做網(wǎng)站開店寧波網(wǎng)站建設(shè)推廣平臺(tái)
  • 安卓做視頻網(wǎng)站微信推廣軟件有哪些
  • 做投資網(wǎng)站深圳seo優(yōu)化公司哪家好
  • 哈爾濱網(wǎng)絡(luò)開發(fā)放心網(wǎng)站推廣優(yōu)化咨詢
  • 高校門戶網(wǎng)站建設(shè)問題seo網(wǎng)站關(guān)鍵詞優(yōu)化方式
  • 淘寶上有做網(wǎng)站的嗎某個(gè)網(wǎng)站seo分析實(shí)例
  • 外貿(mào)零售網(wǎng)站建設(shè)查關(guān)鍵詞排名網(wǎng)
  • 玉林市網(wǎng)站開發(fā)公司swot分析
  • 網(wǎng)站建設(shè)圖書百度客服中心人工在線咨詢
  • 改wordpress評(píng)論郵箱willfast優(yōu)化工具下載
  • 做網(wǎng)站外包工作怎么樣360應(yīng)用商店
  • 手機(jī)h5網(wǎng)站模板利于seo的建站系統(tǒng)有哪些
  • 廣東省住房和城鄉(xiāng)建設(shè)局網(wǎng)站投廣告的平臺(tái)有哪些
  • 注冊(cè)公司流程和費(fèi)用需要哪些條件酒店seo是什么意思
  • 網(wǎng)站引導(dǎo)頁動(dòng)畫濟(jì)南優(yōu)化網(wǎng)站關(guān)鍵詞
  • 原單手表網(wǎng)站域名解析在線查詢
  • 做類似美團(tuán)的網(wǎng)站得多少錢長(zhǎng)尾關(guān)鍵詞在線查詢
  • 網(wǎng)站語音轉(zhuǎn)寫怎么做seo知識(shí)分享
  • 深圳注冊(cè)公司需要什么條件中國(guó)seo網(wǎng)站
  • html網(wǎng)頁制作背景圖片seo 優(yōu)化顧問
  • 大連seo推廣優(yōu)化安卓aso關(guān)鍵詞優(yōu)化
  • iis怎么做網(wǎng)站站長(zhǎng)工具推薦網(wǎng)站
  • 代理域名網(wǎng)站的公司怎么知道網(wǎng)站有沒有被收錄