Как PreparedStatement Java работает?

Предоставляя .hash средство получения свойств, вы можете создать именно то поведение, которое вам нужно. Фактическое значение hash будет «скрыто» как ._hash, что является обычной практикой в ​​Python:

class File:
    def __init__(self, filename, content):
         self.filename = filename
         self.content = content
         self._hash = None

    @property
    def hash(self):
          if self._hash is None:
              # do some hashing here
              self._hash = 'some hash'
          return self._hash


f = File('myfile', 'some content')
print(f.hash)

Конечно, у вас могут быть и другие условия, когда вам нужно пересчитать хеш это не должно быть if self._hash is None. И вы также можете просто сбросить хэш, когда он должен быть пересчитан. Например, возможно, ваш хэш изменяется при изменении .content:

class File:
    def __init__(self, filename, content):
         self.filename = filename
         self._content = content
         self._hash = None

    @property
    def hash(self):
          if self._hash is None:
              # do some hashing here
              self._hash = f'some hash based on {self._content}'
          return self._hash


    @property
    def content(self):
          return self.content

    @content.setter
    def content(self, value):
          self._content = value
          self._hash = None


f = File('myfile', 'some content')
print(f.hash)
f.content = 'changed content'
print(f.hash)
5
задан Stefan van den Akker 13 October 2016 в 07:29
поделиться

4 ответа

Если у Вас есть использование переменных'?'

int temp = 75;
PreparedStatement pstmt = con.prepareStatement(
    "UPDATE test SET num = ?, due = now() ");
pstmt.setInt(1, temp); 
pstmt.executeUpdate():

Производит sql statment, который похож:

UPDATE test SET num = 75, due = now();
9
ответ дан 18 December 2019 в 07:57
поделиться

Вы не должны использовать заполнителей в PreparedStatement. Что-то как:

PreparedStatement stmt = con.prepareStatement("select sysdate from dual");

работал бы просто великолепно. Однако Вы не можете использовать заполнителя и затем связать вызов функции с ним. Что-то вроде этого не может использоваться для вызывания sysdate функции:

PreparedStatement stmt = con.prepareStatement("select ? from dual");
stmt.setSomethingOrOther(1, "sysdate");
0
ответ дан 18 December 2019 в 07:57
поделиться

Если у Вас есть переменная, которая прибывает из ввода данных пользователем, важно, чтобы Вы использовали? вместо того, чтобы связывать строки. Пользователи могли бы ввести строку злонамеренно, и если Вы отбрасываете строку прямо в SQL, это может выполнить команду, которую Вы не предназначали.

Я понимаю, что этот злоупотребляется, но это говорит это отлично:

Little Bobby Tables

11
ответ дан 18 December 2019 в 07:57
поделиться

Если Вы называете созданными в функциях Вашего SQL-сервера, затем используют PreparedStatement.

Если Вы называете хранимые процедуры, которые были загружены на Ваш SQL-сервер, затем используют CallableStatement.

Используйте вопросительные знаки в качестве заполнителей для параметров функции/процедуры, что Вы - передающие и функциональные возвращаемые значения, которые Вы получаете.

0
ответ дан 18 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: