Injection Dependency (DI) - это один из шаблонов проектирования, который использует основную функцию OOP - отношения в одном объекте с другим объектом. Хотя наследование наследует один объект для создания более сложного и конкретного другого объекта, отношения или ассоциации просто создают указатель на другой объект из одного объекта с использованием атрибута. Мощность DI сочетается с другими функциями ООП, как и интерфейсы и скрывающий код. Предположим, у нас есть клиент (подписчик) в библиотеке, который может занять только одну книгу для простоты.
Интерфейс книги:
package com.deepam.hidden;
public interface BookInterface {
public BookInterface setHeight(int height);
public BookInterface setPages(int pages);
public int getHeight();
public int getPages();
public String toString();
}
Далее у нас может быть много видов книги; один из типов - фикция:
package com.deepam.hidden;
public class FictionBook implements BookInterface {
int height = 0; // height in cm
int pages = 0; // number of pages
/** constructor */
public FictionBook() {
// TODO Auto-generated constructor stub
}
@Override
public FictionBook setHeight(int height) {
this.height = height;
return this;
}
@Override
public FictionBook setPages(int pages) {
this.pages = pages;
return this;
}
@Override
public int getHeight() {
// TODO Auto-generated method stub
return height;
}
@Override
public int getPages() {
// TODO Auto-generated method stub
return pages;
}
@Override
public String toString(){
return ("height: " + height + ", " + "pages: " + pages);
}
}
Теперь абонент может иметь связь с книгой:
package com.deepam.hidden;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Subscriber {
BookInterface book;
/** constructor*/
public Subscriber() {
// TODO Auto-generated constructor stub
}
// injection I
public void setBook(BookInterface book) {
this.book = book;
}
// injection II
public BookInterface setBook(String bookName) {
try {
Class<?> cl = Class.forName(bookName);
Constructor<?> constructor = cl.getConstructor(); // use it for parameters in constructor
BookInterface book = (BookInterface) constructor.newInstance();
//book = (BookInterface) Class.forName(bookName).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return book;
}
public BookInterface getBook() {
return book;
}
public static void main(String[] args) {
}
}
Все три класса могут быть скрыты для собственной реализации. Теперь мы можем использовать этот код для DI:
package com.deepam.implement;
import com.deepam.hidden.Subscriber;
import com.deepam.hidden.FictionBook;
public class CallHiddenImplBook {
public CallHiddenImplBook() {
// TODO Auto-generated constructor stub
}
public void doIt() {
Subscriber ab = new Subscriber();
// injection I
FictionBook bookI = new FictionBook();
bookI.setHeight(30); // cm
bookI.setPages(250);
ab.setBook(bookI); // inject
System.out.println("injection I " + ab.getBook().toString());
// injection II
FictionBook bookII = ((FictionBook) ab.setBook("com.deepam.hidden.FictionBook")).setHeight(5).setPages(108); // inject and set
System.out.println("injection II " + ab.getBook().toString());
}
public static void main(String[] args) {
CallHiddenImplBook kh = new CallHiddenImplBook();
kh.doIt();
}
}
Существует множество способов использования инъекции зависимостей. Можно объединить его с Singleton и т. Д., Но все же в базовом это только ассоциация, реализуемая путем создания атрибута типа объекта внутри другого объекта. Полезность только и только в функции, этот код, который мы должны писать снова и снова, всегда готов и сделан для нас вперед. Вот почему DI так тесно связан с Inversion of Control (IoC), что означает, что наша программа передает управляющий другой запущенный модуль, который делает инъекции компонентов в наш код. (Каждый объект, который можно вставить, может быть подписан или рассматриваться как Bean.) Например, весной это делается путем создания и инициализации контейнера ApplicationContext , что делает это для нас. Мы просто в нашем коде создаем контекст и вызываем инициализацию bean-компонентов. В этот момент инъекция была сделана автоматически.
Я понимаю, что вы должны выбрать id
из posts
, чтобы:
либо имели соответствующую запись в cdlr_post_meta
с [ 114] и meta_value <> 1
или не имеют записи cdlr_post_meta
с meta_key = 'statusCDLR'
A Стратегия для достижения этой цели заключается в использовании LEFT JOIN
для поиска записи в cdlr_post_meta
с помощью meta_key = 'statusCDLR'
, а затем реализации остальной логики в предложении WHERE
(если нет соответствующей записи, столбцы pm
все NULL
).
SELECT p.ID
FROM cdlr_posts p
LEFT JOIN cdlr_postmeta pm
ON pm.post_id = p.ID AND pm.meta_key = '_statusCDLR'
WHERE
p.post_type = 'shop_order'
AND ( pm.post_id IS NULL OR pm.meta_value <> 1 )
GROUP BY p.ID
PS - Общие замечания относительно вашего sql:
При смешивании OR
и AND
с, вы должны заключать тестовые выражения в скобки, чтобы избежать в вопросы приоритета (AND
имеет более высокий приоритет, чем OR
).
Вы должны использовать явные JOIN
вместо неявных.