Динамический запрос sql java

Динамический SQL-запрос в Java

Или существует какой-либо способ динамического удаления или изменения строки после предложения WHERE.

3 ответа

Вы должны создать свой запрос динамически, в начале метода проверки id является null или равным 0 . Чтобы было проще, вы можете использовать трюк в where where с 1=1 так что предложение where может быть включено все время в запросе.

public void executeMyQuery( Connection con, Integer id) < String query = "SELECT *FROM STUDENT WHERE 1=1"; if(id != null)< query += "AND ps = con.prepareStatement(query); if(id != null)< ps.setInt(1, id); >ps.executeQuery();> 

В вашей программе могут быть два параметра PreparedStatements — один без WHERE > и другой с ним.

Кроме того, вы должны сохранить свои PreparedStatements и повторно использовать, чтобы лучше хранить их как поле и т.д.

И тогда, когда вам нужно получить данные, вызовите либо первый подготовленный оператор, либо второй.

Я бы использовал две String но одну PreparedStatement , нет необходимости создавать две, если одна не будет использоваться;)

Майкл Дз близок к решению в своем ответе, но в коде есть проблема: он называет setInt не существующим подготовленнымСтатом.

Попробуйте что-то вроде этого:

public void executeMyQuery( Connection con, int Id) < StringBuffer sql = new StringBuffer(); sql.append("Select * FROM STUDENT"); if(Id >-1) < sql.append(" Where >preparedStatement ps = con.prepareStatement(sql.toString()); if(ID > -1) < ps.setInt(1, Id); >ps.executeQuery(); // You might want to catch the result of the query as well > 

Источник

Динамический SQL-запрос с Java

Я пишу программу, которая получает записи из базы данных. Я хотел бы создать динамический запрос на основе трех переменных (studentID, firstName и/или lastname). Вот мой код Java, который возвращает записи:

result = statement.executeQuery("SELECT * FROM student " + "WHERE (studentID = " + getStudentId() + " AND " + getStudentId() + " <> 0)" + " OR (firstName = '" + getFirstName() + "' AND '" + getFirstName() + "' IS NOT NULL)" + " OR (lastName = '" + getLastName() + "' AND '" + getLastName() + "' IS NOT NULL)"); 

Я бы хотел, чтобы поиск возвращал результаты, которые являются неопределенными по конкретным, в зависимости от того, какие переменные присутствуют. В настоящее время, если studentID является единственным предоставленным полем, он возвращает эту единственную запись или если studentID отсутствует, но firstName is, он возвращает все записи firstName (то же самое для lastName, если присутствует только переменная). Что не работает, если я предоставляю firstName и lastName, он возвращает все записи с именем firstName независимо от последнего имени записи и всех записей с lastName независимо от имени. Пример firstName = «Bill» и lastName = «Jackson»:

1 Bill Hader 2 Steve Jackson 3 Bill Jackson 4 Bill Stewart 5 Denise Jackson 6 Wendy Jackson 7 Bill Matthews 

То, что я пытаюсь понять, заключается в том, что я предоставляю конкретные критерии, такие как firstName и lastName, как получить одну конкретную запись, содержащую как имя, так и фамилию, которые были указаны.

Источник

Русские Блоги

Затем создайте класс отдела, чтобы получить данные контента отдела базы данных, следующим образом:

package cm.hezy; public class Department < private int departmentId; private String departmentName; private int location_id; public int getDepartmentId() < return departmentId; >public void setDepartmentId(int departmentId) < this.departmentId = departmentId; >public String getDepartmentName() < return departmentName; >public void setDepartmentName(String departmentName) < this.departmentName = departmentName; >public int getLocation_id() < return location_id; >public void setLocation_id(int location_id) < this.location_id = location_id; >> 

третий шаг

public List select(Department dept) < // Создать соединение, подготовку, объект ResultSet Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; // Создать объект списка Listl = new ArrayList(); try < // Получить объект соединения conn conn = JdbcUtil.getConnection(); // gensql () Динамически генерируйте кодовые блочные вызовы, в зависимости от конкретного метода ниже String sql = genSQl(dept); // Получите объект PrectiveStatement STMT stmt = conn.prepareStatement(sql); // Выполните оператор, генерируйте результаты rs = stmt.executeQuery(); // цикл добавляется в список while(rs.next())< Department d = new Department(); d.setDepartmentId(rs.getInt(1)); d.setDepartmentName(rs.getString(2)); d.setLocation_id(rs.getInt(3)); l.add(d); >> catch (SQLException e) < e.printStackTrace(); >finally < // выключить все программы JdbcUtil.closeAll(stmt, conn, rs); >// возвращение в список return l; > 
 private String genSQl(Department dept) < // Динамическое строковое сшивание StringBuffer, прошивая строки через свой метод добавления // начальная строка - это запрашивать все. Чтобы предотвратить ненормальное StringBuffer sb = new StringBuffer("select * from departments where 1=1 "); // Если данный департамент_ид больше 0, это означает, что пользователь дает данные, поэтому добавьте "и Depart_id =?" После 1 = 1 это означает, что условие идентификатора, данное пользователем, то есть dept.getDepartmentId () Таким образом, метод заключается в следующем if(dept.getDepartmentId()>0) < sb.append(" and department_id = ").append(dept.getDepartmentId()); >// Нравится Сирия, но если это тип строки, следует отметить, что добавление «» следует добавлять с обеих сторон глубины. if(dept.getDepartmentName()!=null&&dept.getDepartmentName().length()>0) < sb.append(" and department_name = ' ").append(dept.getDepartmentName()).append("'"); >// то же самое, что добавление идентификатора if(dept.getLocation_id()>0) < sb.append(" and location_id = ").append(dept.getLocation_id()); >// наконец -то вернуть строку return sb.toString(); > 

Четвертый шаг — вызов в основном методе

 public static void main(String[] args) < JdbcAdvanced ad = new JdbcAdvanced(); Department dept = new Department(); // Запрос от идентификатора отдела Zhongtianjie как 1 dept.setDepartmentId(1); Listlist = ad.select(dept); for(Department d:list) < // запрос вывода консоли System.out.println(d.getDepartmentId()+d.getDepartmentName()+d.getLocation_id()); >> 

Визуализации

Один: запрос все данные
// Пожалуйста, отмените этот код
// Консольный эффект
 // Эффект таблицы баз данных
 2. Данные из отдела запросов как 1

Интеллектуальная рекомендация

В OpenSSL появилась новая уязвимость, затрагивающая 33% серверов HTTPS.

Стандарты набора персонала Unicorn Enterprise Heavy для Python-инженеров 2019 >>> Недавно исследователь обнаружил новую уязвимость в системе безопасности OpenSSL. Эта уязвимость окажет огромн.

05: Вывод, чтобы сохранить 12-значный номер плавающей запятой

05: Вывод, чтобы сохранить 12-значный номер плавающей запятой.

Источник

iBATIS – динамический SQL

Динамический SQL – очень мощная функция iBATIS. Иногда вам нужно изменить критерий предложения WHERE в зависимости от состояния вашего объекта параметра. В таких ситуациях iBATIS предоставляет набор динамических тегов SQL, которые можно использовать в отображаемых операторах для повышения возможности повторного использования и гибкости SQL.

Вся логика помещена в файл .XML с использованием некоторых дополнительных тегов. Ниже приведен пример, в котором оператор SELECT будет работать двумя способами:

  • Если вы передадите идентификатор, он вернет все записи, соответствующие этому идентификатору.
  • В противном случае он вернет все записи, в которых идентификатор сотрудника имеет значение NULL.
xml version="1.0" encoding="UTF-8"?>   namespace="Employee">  id="findByID" resultClass="Employee"> SELECT * FROM EMPLOYEE  prepend="WHERE ">  property="id"> id IS NULL   property="id">    

Вы можете проверить условие, используя тег следующим образом. Здесь условие будет добавлено, только если переданное свойство не пусто.

Если вам нужен запрос, в котором мы можем выбрать идентификатор и / или имя сотрудника, ваш оператор SELECT будет выглядеть следующим образом:

.  .

Пример динамического SQL

В следующем примере показано, как написать оператор SELECT с помощью динамического SQL. Учтите, у нас есть следующая таблица EMPLOYEE в MySQL:

CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) );

Давайте предположим, что эта таблица имеет только одну запись следующим образом –

mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Zara | Ali | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec)

Сотрудник POJO класса

Чтобы выполнить операцию чтения, давайте создадим класс Employee в Employee.java следующим образом:

public class Employee < private int id; private String first_name; private String last_name; private int salary; /* Define constructors for the Employee class. */ public Employee() <>public Employee(String fname, String lname, int salary) < this.first_name = fname; this.last_name = lname; this.salary = salary; >/* Here are the method definitions */ public int getId() < return id; >public String getFirstName() < return first_name; >public String getLastName() < return last_name; >public int getSalary() < return salary; >> /* End of Employee */

Файл Employee.xml

Чтобы определить оператор отображения SQL с помощью iBATIS, мы добавили бы следующий измененный тег в Employee.xml, а внутри этого определения тега мы бы определили «id», который будет использоваться в IbatisReadDy.java для выполнения запроса Dynamic SQL SELECT в база данных.

Вышеуказанное выражение SELECT будет работать двумя способами:

  • Если вы передаете идентификатор, он возвращает записи, соответствующие этому идентификатору. В противном случае он возвращает все записи.

Если вы передаете идентификатор, он возвращает записи, соответствующие этому идентификатору. В противном случае он возвращает все записи.

Файл IbatisReadDy.java

Этот файл имеет логику прикладного уровня для чтения условных записей из таблицы Employee –

import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import java.io.*; import java.sql.SQLException; import java.util.*; public class IbatisReadDy < public static void main(String[] args) throws IOException,SQLException< Reader rd=Resources.getResourceAsReader("SqlMapConfig.xml"); SqlMapClient smc=SqlMapClientBuilder.buildSqlMapClient(rd); /* This would read all records from the Employee table.*/ System.out.println("Going to read records. "); Employee rec = new Employee(); rec.setId(1); List ems = (List) smc.queryForList("Employee.findByID", rec); Employee em = null; for (Employee e : ems) < System.out.print(" " + e.getId()); System.out.print(" " + e.getFirstName()); System.out.print(" " + e.getLastName()); System.out.print(" " + e.getSalary()); em = e; System.out.println(""); >System.out.println("Records Read Successfully "); > >

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisReadDy.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisReadDy, чтобы запустить программу.

Вы получите следующий результат, и запись будет считана из таблицы EMPLOYEE.

Going to read records. 1 Zara Ali 5000 Record Reads Successfully

Попробуйте приведенный выше пример, передав null как smc.queryForList (“Employee.findByID”, null) .

iBATIS OGNL Выражения

iBATIS предоставляет мощные выражения на основе OGNL для устранения большинства других элементов.

  • если заявление
  • выбрать, когда, в противном случае заявление
  • где заявление
  • оператор foreach

Заявление if

Наиболее распространенная вещь, которую нужно сделать в динамическом SQL, это условно включить часть предложения where. Например –

  

Этот оператор предоставляет необязательный тип текстового поиска. Если вы не укажете название, все активные блоги будут возвращены. Но если вы передадите заголовок, он будет искать заголовок с заданным аналогичным условием.

Вы можете включить несколько, если следующие условия –

  

Выбор, когда и в противном случае Заявления

iBATIS предлагает элемент выбора, который похож на оператор переключения Java. Это помогает выбрать только один случай среди множества вариантов.

В следующем примере поиск будет выполняться только по заголовку, если он указан, и только по автору, если он указан. Если ни один из них не предоставлен, он возвращает только избранные блоги –

  

Где заявление

Взгляните на наши предыдущие примеры, чтобы увидеть, что произойдет, если не будет выполнено ни одно из условий. В итоге вы получите SQL, который выглядит так:

Это не получится, но у iBATIS есть простое решение с одним простым изменением, все работает отлично –

Источник

Читайте также:  Код мессенджера на html
Оцените статью