Using JdbcTemplate
Spring makes extensive use of the Template method design pattern (see Template Method Pattern). Our immediate focus will be on the JdbcTemplate
and related classes, specifically NamedParameterJdbcTemplate
. The template classes handle obtaining and releasing a connection for data access when one is needed.
The next example shows how to use NamedParameterJdbcTemplate
inside of a DAO (Data Access Object) class to retrieve a random city given a country code.
public class Ex2JdbcDao { /** * Data source reference which will be provided by Spring. */ private DataSource dataSource; /** * Our query to find a random city given a country code. Notice * the ':country' parameter toward the end. This is called a * named parameter. */ private String queryString = 'select Name from City ' + 'where CountryCode = :country order by rand() limit 1'; /** * Retrieve a random city using Spring JDBC access classes. */ public String getRandomCityByCountryCode(String cntryCode) { // A template that permits using queries with named parameters NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(dataSource); // A java.util.Map is used to provide values for the parameters Map params = new HashMap(); params.put('country', cntryCode); // We query for an Object and specify what class we are expecting return (String)template.queryForObject(queryString, params, String.class); } /** * A JavaBean setter-style method to allow Spring to inject the data source. * @param dataSource */ public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }
The focus in the above code is on the getRandomCityByCountryCode()
method. We pass a country code and use the NamedParameterJdbcTemplate
to query for a city. The country code is placed in a Map with the key 'country', which is the parameter is named in the SQL query.
To access this code, you need to configure it with Spring by providing a reference to the data source.
<bean id='dao' class='code.Ex2JdbcDao'> <property name='dataSource' ref='dataSource'/> </bean>
At this point, we can just grab a reference to the DAO from Spring and call getRandomCityByCountryCode()
.
// Create the application context ApplicationContext ctx = new ClassPathXmlApplicationContext('ex2appContext.xml'); // Obtain a reference to our DAO Ex2JdbcDao dao = (Ex2JdbcDao) ctx.getBean('dao'); String countryCode = 'USA'; // Find a few random cities in the US for(int i = 0; i < 4; ++i) System.out.printf('A random city in %s is %s%n', countryCode, dao.getRandomCityByCountryCode(countryCode));
This example shows how to use Spring's JDBC classes to completely abstract away the use of traditional JDBC classes including Connection
and PreparedStatement
.