Spring JdbcTemplateの例のクエリ
ここでは、JdbcTemplateの `query()`メソッドを使用してデータベースからデータを照会または抽出する方法を示すいくつかの例を示します。
1.単一行のクエリ
ここでは、データベースから単一の行レコードをクエリまたは抽出し、それをモデルクラスに変換する2つの方法があります。
1.1カスタムRowMapper
一般的に、必要に応じてカスタムRowMapperを作成するために、RowMapperインターフェースを実装することが常に推奨されます。
package com.mkyong.customer.model; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper; public class CustomerRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Customer customer = new Customer(); customer.setCustId(rs.getInt("CUST__ID")); customer.setName(rs.getString("NAME")); customer.setAge(rs.getInt("AGE")); return customer; } }
`queryForObject()`メソッドに渡すと、返された結果はカスタムの `mapRow()`メソッドを呼び出して値を適切に一致させます。
public Customer findByCustomerId(int custId){ String sql = "SELECT ** FROM CUSTOMER WHERE CUST__ID = ?"; Customer customer = (Customer)getJdbcTemplate().queryForObject( sql, new Object[]{ custId }, new CustomerRowMapper()); return customer; }
1.2 BeanPropertyRowMapper
Spring 2.5には、BeanPropertyRowMapperという便利なRowMapper実装が付属しています。この実装では、行の列の値を名前に一致させてプロパティにマップできます。プロパティと列の名前が同じであることを確認してください(例:プロパティ ‘custId’は列名 ‘CUSTID’または下線 ‘CUST__ID’と一致します)。
public Customer findByCustomerId2(int custId){ String sql = "SELECT ** FROM CUSTOMER WHERE CUST__ID = ?"; Customer customer = (Customer)getJdbcTemplate().queryForObject( sql, new Object[]{ custId }, new BeanPropertyRowMapper(Customer.class)); return customer; }
2.複数の行のクエリ
今度は、データベースから複数の行を照会または抽出し、それをリストに変換します。
2.1手動でマップする
複数の戻り行では、 `queryForList()`メソッドでRowMapperがサポートされていないため、手動でマップする必要があります。
public List<Customer> findAll(){ String sql = "SELECT ** FROM CUSTOMER"; List<Customer> customers = new ArrayList<Customer>(); List<Map> rows = getJdbcTemplate().queryForList(sql); for (Map row : rows) { Customer customer = new Customer(); customer.setCustId((Long)(row.get("CUST__ID"))); customer.setName((String)row.get("NAME")); customer.setAge((Integer)row.get("AGE")); customers.add(customer); } return customers; }
2.2 BeanPropertyRowMapper
最も簡単な解決策はBeanPropertyRowMapperクラスを使用することです。
public List<Customer> findAll(){ String sql = "SELECT ** FROM CUSTOMER"; List<Customer> customers = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(Customer.class)); return customers; }
3.単一の値を照会する
この例では、データベースから単一の列の値を照会または抽出する方法を示します。
3.1単一の列名
これは、単一の列名をStringとして照会する方法を示しています。
public String findCustomerNameById(int custId){ String sql = "SELECT NAME FROM CUSTOMER WHERE CUST__ID = ?"; String name = (String)getJdbcTemplate().queryForObject( sql, new Object[]{ custId }, String.class); return name; }
3.2行の総数
データベースから合計行数を照会する方法を示しています。
public int findTotalCustomer(){ String sql = "SELECT COUNT(** ) FROM CUSTOMER"; int total = getJdbcTemplate().queryForInt(sql); return total; }
それを実行します
package com.mkyong.common; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.mkyong.customer.dao.CustomerDAO; import com.mkyong.customer.model.Customer; public class JdbcTemplateApp { public static void main( String[]args ) { ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Customer.xml"); CustomerDAO customerDAO = (CustomerDAO) context.getBean("customerDAO"); Customer customerA = customerDAO.findByCustomerId(1); System.out.println("Customer A : " + customerA); Customer customerB = customerDAO.findByCustomerId2(1); System.out.println("Customer B : " + customerB); List<Customer> customerAs = customerDAO.findAll(); for(Customer cust: customerAs){ System.out.println("Customer As : " + customerAs); } List<Customer> customerBs = customerDAO.findAll2(); for(Customer cust: customerBs){ System.out.println("Customer Bs : " + customerBs); } String customerName = customerDAO.findCustomerNameById(1); System.out.println("Customer Name : " + customerName); int total = customerDAO.findTotalCustomer(); System.out.println("Total : " + total); } }
結論
JdbcTemplateクラスには、多くの便利なオーバーロードされたクエリメソッドが付属しています。
既に独自のカスタマイズクエリメソッドを作成する前に、既存のクエリメソッドを参照することをお勧めします。