Spring JDBC最佳實踐(3)
spring jdbc包提供了JdbcTemplate和它的兩個兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate,我們可以先從JdbcTemplate入手,領略一下這個類的便利和優雅。
1、使用JdbcTemplate進行數據訪問:
初始化JdbcTemplate
初始化JdbcTemplate很容易,只需要向它的構造方法傳入它所使用的DataSource便可以。如果使用Jakarta Commons DBCP,那么初始化代碼如下所示:
BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost/mysql?characterEncoding=gb2312"); dataSource.setUsername("***"); dataSource.setPassword("***"); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
也可以通過無參的構造方法構造JdbcTemplate,然后通過setDataSource(DataSource dataSource)來設置其dataSource。
上述這種方法是通過編碼的方式構造JdbcTemplate,如果應用程序使用spring的IOC容器,其初始化工作便可移植到容器的配置文件當中:
<!-- dataSource --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"之后,想把jdbcTemplate注入到哪個bean都可以,初始化好了JdbcTemplate以后,便可以大施拳腳了!destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url" value="jdbc:mysql://localhost:3306/oa?characterEncoding=gb2312" /> <property name="username" value="root" /> <property name="password" value="root" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="1000" /> <property name="defaultAutoCommit" value="true" /> <property name="removeAbandoned" value="true" /> </bean> <!-- jdbcTemplate --> <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean></pre>
使用JdbcTemplate查詢數據:
JdbcTemplate針對數據查詢提供了多個重載的模板方法,我們可以根據需要選用不同的模板方法。如果查詢很簡單,僅僅是傳入相應的SQL或者是相關的參數,然后取得一個結果,那么我們可以用如下的一組便利的模板方法:
public int queryForInt(String sql)public int queryForInt(String sql, Object[] args)public int queryForInt(String sql, Object[] args)public long queryForLong(String sql)public long queryForLong(String sql, Object[] args)public long queryForLong(String sql, Object[] args, int[] argTypes)public Object queryForObject(String sql, Class requiredType)public Object queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType)public Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper)public Object queryForObject(String sql, Object[] args, Class requiredType)public Object queryForObject(String sql, Object[] args, RowMapper rowMapper)public Object queryForObject(String sql, RowMapper rowMapper)注意:這些針對的resultset返回的必須是一行記錄,否則會出錯!
如果查詢的結果包含一列數字型的結果,或者使用了SQL函數,或者其它的單列的結果,那么便可以直接通過這組便利的模板方法進行查詢:
int postId = jdbcTemplate.queryForInt("SELECT POSTID FROM USERS WHERE USERNAME=?",new String[]{"jason"}); System.out.println(postId); long userCount = jdbcTemplate.queryForLong("SELECT COUNT(*) FROM USERS"); System.out.println(userCount); String nickname = (String)jdbcTemplate.queryForObject("SELECT USERNAME1 FROM USERS WHERE USERNAME='jason'", String.class); System.out.println(nickname); Map singleUser = jdbcTemplate.queryForMap("SELECT * FROM USERS WHERE USERNAME = 'jason'"); System.out.println(singleUser);queryForMap與其它的方法的不同之處在于它的查詢的結果以java.util.Map的形式返回,Map的鍵對應查詢的表的列的名字,Map的值對應鍵所在的列的值。
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!