16 Nisan 2020 Perşembe

SpringData Jdbc NamedParameterJdbcTemplate Sınıfı

Giriş
Parametre olarak :id gibi isimler kullanabilmeyi sağlar. Şöyle yaparız.
String TEMP_INSERT = "INSERT INTO test(x) VALUES (:x)";
Parametre Alanı
JDBCTemplate ile parametre alanı için "?" kullanılırken NamedParameterJdbcTemplate ile ":myfield" şeklinde isim verilen parametre alanları kullanılıyor.
Bazı örnekler şöyle
"INSERT INTO USERS(name, address, email)values(:name,:address,:email)"
"select * from users where record_id = :id"

constructor - DataSource
XML ile tanımlarken şöyle yaparız.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="url" value="jdbc:dburl" />
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
  <property name="username" value="username" /> 
  <property name="password" value="passworf" />
  <property name="removeAbandoned" value="true" />
  <property name="initialSize" value="30" />    
  <property name="maxActive" value="100" />
</bean>

<!-- DAO Bean which is causing issue -->
<bean id="nmdParameter" class="org.springframeowrk....NamedParameterJDBCTemplate"
 scope="singleton">
  <constructor-args ref="dataSource" />    
</bean>
Şöyle yaparız.
DataSource dataSource = ...;
NamedParameterJdbcTemplate jdbc =new NamedParameterJdbcTemplate(dataSource);
batchUpdate metodu
Örnek
Şöyle yaparız.
String insertSQL = "INSERT INTO invoices VALUES (:id, :exactIssueTime, 
:finalIssueTime, :issuer, :groupID)";
SqlParameterSource[] sqlParams = SqlParameterSourceUtils.createBatch(
  invoices.toArray());

int[] insertCounts = namedJdbcTemplate.batchUpdate(insertSQL, sqlParams);
Örnek
Şöyle yaparız.
String TEMP_INSERT = "INSERT INTO test(x) VALUES (:x)";

NamedParameterJdbcTemplate namedParameterJdbcTemplate = ...;

public int batchTestInsert(SqlParameterSource[] parameters) {
  return Arrays.stream(
            namedParameterJdbcTemplate.batchUpdate(TEMP_INSERT, parameters)
        ).sum();
}
query metodu
Örnek ver

queryForObject metodu - Map
Tek bir sonuç nesnesi döner.

Örnek
Şöyle yaparız.
String firstName = ...;

String sql = "select count(*) from T_ACTOR where first_name = :first_name";

Map<String, String> namedParameters = Collections.singletonMap("first_name",
  firstName);

int i = namedJdbcTemplate.queryForObject(sql, namedParameters,  Integer.class);
Örnek
Şöyle yaparız.
Integer count = namedParameterJdbcTemplate.queryForObject("SELECT COUNT(1) FROM test",
 new HashMap<String, Object>, Integer.class);
 //I pass empty HashMap since query doesn't need parameters
queryForObject metodu - SqlParameterSource
Java'da Generics kullanılmaya başlamadan önce bu metod kullanılırdı. Bu overload metodu kullanmamak lazım. Bu metod yerine Map alan overload halini kullanmak daha iyi.
Örnek
Şöyle yaparız.
public void isRecordExists(Date date){
  String sqlQuery=" select * from Dual where created_date=:date";
  
  MapSqlParameterSource parameters = new MapSqlParameterSource();
  parameters.addValue("date", date);
  namedParameterJdbcTemplate.queryForObject(sqlQuery, parameters, Integer.class);

}
Örnek
Şöyle yaparız.
String firstName = ...;

String sql = "select count(*) from T_ACTOR where first_name = :first_name";

SqlParameterSource namedParameters = new MapSqlParameterSource("first_name",
  firstName);

int i = namedJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
update metodu
Örnek ver


Hiç yorum yok:

Yorum Gönder