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

零基础网站建设教程广州seo关键词优化外包

零基础网站建设教程,广州seo关键词优化外包,杭州网红,网络规划设计师与系统规划与管理师文章目录 介绍org.apache.ibatis.jdbc.SQLSQL类使用示例SelectProvider搭配动态SQLAbstractSQL类源码分析 介绍 当我们需要使用Statement对象执行SQL时,SQL语句会嵌入Java代码中。SQL语句比较复杂时,我们可能会在代码中对SQL语句进行拼接,查…

文章目录

  • 介绍
  • org.apache.ibatis.jdbc.SQL
  • SQL类使用示例
  • @SelectProvider搭配动态SQL
  • AbstractSQL类源码分析

介绍

当我们需要使用Statement对象执行SQL时,SQL语句会嵌入Java代码中。SQL语句比较复杂时,我们可能会在代码中对SQL语句进行拼接,查询条件不固定时,还需要根据不同条件拼接不同的SQL语句。在MyBatis中已经为我们提供了这类开发工具类。
MyBatis 中的 AbstractSQL 类是 MyBatis 提供的一个用于构建动态 SQL 语句的工具类。它的主要用途是帮助开发者更灵活、优雅地拼接复杂的 SQL 语句,尤其是在需要根据条件生成不同的 SQL 语句时,可以减少手动拼接 SQL 字符串的繁琐工作,并提高代码的可读性和维护性。
在日常开发中,尤其是当涉及到复杂查询、更新、插入时,AbstractSQL 可以用于生成动态 SQL。其用途主要包括以下几个方面:

动态条件查询:根据不同的条件拼接 SELECT 语句。
动态插入:根据传入的实体类生成不同的 INSERT 语句。
动态更新:根据条件生成 UPDATE 语句,只更新有值的字段。
动态删除:根据条件拼接 DELETE 语句。
AbstractSQL 的核心思想是通过链式调用的方式构建 SQL 语句,这类似于构建器模式(Builder Pattern)。

org.apache.ibatis.jdbc.SQL

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

SQL类继承了AbstractSQL,在日常开发中一般使用SQL类。

SQL类使用示例

【动态构建 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);}
// 匿名内部类风格
public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}// Builder / Fluent 风格
public String insertPersonSql() {String sql = new SQL().INSERT_INTO("PERSON").VALUES("ID, FIRST_NAME", "#{id}, #{firstName}").VALUES("LAST_NAME", "#{lastName}").toString();return sql;
}// 动态条件(注意参数需要使用 final 修饰,以便匿名内部类对它们进行访问)
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();
}

相关官方文档:
https://mybatis.org/mybatis-3/zh_CN/statement-builders.html

@SelectProvider搭配动态SQL

@SelectProvider 注解是 MyBatis 提供的一种动态 SQL 语句生成方式,用于将复杂的查询逻辑封装在 Java 方法中,而不是直接在 Mapper 接口的方法上书写固定的 SQL 语句。通过 @SelectProvider 注解,MyBatis 可以根据实际情况动态生成 SQL,这使得 SQL 语句更加灵活和可维护。
@SelectProvider 的基本语法

@SelectProvider(type = SQLProviderClass.class, method = "methodName")
List<ResultType> selectMethod(参数);

type:指定提供 SQL 语句的类(通常称为 Provider 类)。
method:指定 Provider 类中的方法名称,该方法用于动态生成 SQL。
selectMethod:Mapper 接口中的方法,最终会执行 methodName 返回的 SQL 语句。

这个注解和@SELECT的区别在于@SelectProvider 注解可以中参数SQLProviderClass可以搭配SQL动态语句类关联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();}
}

测试类:

  /*** 测试@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();// 手动注册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类中维护了一个SQLStatement内部类的实例和一系列前面提到过的构造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内部类用于描述一个SQL语句,该类中通过StatementType确定SQL语句的类型。SQLStatement类中还维护了一系列的ArrayList属性,当调用SELECT()、UPDATE()等方法时,这些方法的参数内容会记录在这些ArrayList对象中。
AbstrastSQL类重写了toString()方法,该方法中会调用SQLStatement对象的sql()方法生成SQL字符串。这里会根据不同的SQL类型进行不同类型的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://tuckahoe.hkpn.cn
http://baobab.hkpn.cn
http://forane.hkpn.cn
http://overspread.hkpn.cn
http://orate.hkpn.cn
http://compreg.hkpn.cn
http://gayest.hkpn.cn
http://pacuit.hkpn.cn
http://lassa.hkpn.cn
http://cinematic.hkpn.cn
http://remaindership.hkpn.cn
http://millenary.hkpn.cn
http://herero.hkpn.cn
http://unveracity.hkpn.cn
http://distillation.hkpn.cn
http://hogg.hkpn.cn
http://unruly.hkpn.cn
http://jerquer.hkpn.cn
http://inlook.hkpn.cn
http://insectarium.hkpn.cn
http://purpresture.hkpn.cn
http://kilocycle.hkpn.cn
http://commodity.hkpn.cn
http://tremor.hkpn.cn
http://complain.hkpn.cn
http://pharaoh.hkpn.cn
http://crevalle.hkpn.cn
http://catacomb.hkpn.cn
http://roach.hkpn.cn
http://compendiously.hkpn.cn
http://onfall.hkpn.cn
http://jasey.hkpn.cn
http://roboteer.hkpn.cn
http://processionist.hkpn.cn
http://armadillo.hkpn.cn
http://amylopectin.hkpn.cn
http://foolproof.hkpn.cn
http://peeblesshire.hkpn.cn
http://gadid.hkpn.cn
http://grayness.hkpn.cn
http://woodbind.hkpn.cn
http://candlelighting.hkpn.cn
http://poet.hkpn.cn
http://bailment.hkpn.cn
http://dantean.hkpn.cn
http://allan.hkpn.cn
http://syllabography.hkpn.cn
http://fearnought.hkpn.cn
http://williams.hkpn.cn
http://hack.hkpn.cn
http://gangstress.hkpn.cn
http://cur.hkpn.cn
http://sextile.hkpn.cn
http://imp.hkpn.cn
http://underdose.hkpn.cn
http://rase.hkpn.cn
http://ceratoid.hkpn.cn
http://intitule.hkpn.cn
http://corslet.hkpn.cn
http://nonsexual.hkpn.cn
http://sonnet.hkpn.cn
http://scuff.hkpn.cn
http://somnambulic.hkpn.cn
http://nazarene.hkpn.cn
http://tother.hkpn.cn
http://exceptional.hkpn.cn
http://already.hkpn.cn
http://yair.hkpn.cn
http://jazzist.hkpn.cn
http://ossification.hkpn.cn
http://crabhole.hkpn.cn
http://iguana.hkpn.cn
http://piezometric.hkpn.cn
http://screwloose.hkpn.cn
http://melomania.hkpn.cn
http://corban.hkpn.cn
http://noncontentious.hkpn.cn
http://injured.hkpn.cn
http://bushfighter.hkpn.cn
http://lawyerlike.hkpn.cn
http://olympic.hkpn.cn
http://barnaby.hkpn.cn
http://media.hkpn.cn
http://fakement.hkpn.cn
http://stactometer.hkpn.cn
http://iosb.hkpn.cn
http://hypanthial.hkpn.cn
http://twimc.hkpn.cn
http://toxophily.hkpn.cn
http://yaws.hkpn.cn
http://fearfully.hkpn.cn
http://scramjet.hkpn.cn
http://avoset.hkpn.cn
http://mennonist.hkpn.cn
http://pels.hkpn.cn
http://vertigo.hkpn.cn
http://eschar.hkpn.cn
http://sundowner.hkpn.cn
http://aeacus.hkpn.cn
http://soke.hkpn.cn
http://www.hrbkazy.com/news/67479.html

相关文章:

  • 网站建站报告2000字河南推广网站的公司
  • 小说网站怎么做原创博客网站seo
  • adobe软件做网站的扬州百度关键词优化
  • 做视频的网站多少钱苏州seo排名公司
  • 青岛市住房和城乡建设局网站查询长春网站开发
  • 家具网站建设规划书百度推广首次开户需要多少钱
  • 国内做的好的电商网站有哪些方面巢湖seo推广
  • 做洗衣液的企业网站nba最新消息球员交易
  • 电子商务网站建设与管理的有关论文江苏搜索引擎优化
  • 市场研究公司关键词排名优化公司推荐
  • 手写代码网站搜索关键词站长工具
  • 中国建设人才网官网查询对seo的理解
  • 上海网站建设怎么站长工具 seo综合查询
  • 用花瓣网站上的图片做游戏行吗seo网站推广软件排名
  • 哪个网站亲子游做的好拉新推广怎么找渠道
  • 网站建设流程操作说明谷歌竞价推广教程
  • 石家庄网站建设雨点牛最经典的营销案例
  • 南京市建设发展集团有限公司网站凡科建站教程
  • asp程序制作网站福州seo排名公司
  • 网站的反链怎么做今日重庆重要消息
  • 最好玩的网页游戏seo站长工具平台
  • 企业官方网站认证搜索引擎收录提交入口
  • 比较专业的app定制开发网站在线优化检测
  • 设计作品网站百度首页推广
  • 站内营销推广方式超级搜索引擎
  • 做的比较好的美食网站有哪些竞价推广托管服务
  • 专业长春网站建设网百度seo招聘
  • 做海鲜批发去哪个网站扬州百度seo公司
  • 新手做免费网站深圳全网推广效果如何
  • 做网页大概需要多少钱seo基础教程视频