Spring JDBC最佳实践(3)

fmms 13年前
     spring jdbc包提供了JdbcTemplate和它的两个兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate,我们可以先从JdbcTemplate入手,领略一下这个类的便利和优雅。    <br /> 1、使用JdbcTemplate进行数据访问:    <br /> 初始化JdbcTemplate    <br /> 初始化JdbcTemplate很容易,只需要向它的构造方法传入它所使用的DataSource便可以。如果使用Jakarta Commons DBCP,那么初始化代码如下所示:    <br />    <pre class="brush:java; toolbar: true; auto-links: false;">  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);</pre>    <p></p>    <p>也可以通过无参的构造方法构造JdbcTemplate,然后通过setDataSource(DataSource dataSource)来设置其dataSource。<br /> 上述这种方法是通过编码的方式构造JdbcTemplate,如果应用程序使用spring的IOC容器,其初始化工作便可移植到容器的配置文件当中:<br /> </p>    <pre class="brush:xml; toolbar: true; auto-links: false;"> <!-- dataSource -->  <bean id="dataSource"   class="org.apache.commons.dbcp.BasicDataSource"    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>    <p></p> 之后,想把jdbcTemplate注入到哪个bean都可以,初始化好了JdbcTemplate以后,便可以大施拳脚了!    <p></p>    <p><b>使用JdbcTemplate查询数据:<br /> </b>JdbcTemplate针对数据查询提供了多个重载的模板方法,我们可以根据需要选用不同的模板方法。如果查询很简单,仅仅是传入相应的SQL或者是相关的参数,然后取得一个结果,那么我们可以用如下的一组便利的模板方法:<br /> </p>    <pre class="brush:java; toolbar: true; auto-links: false;">public int queryForInt(String sql)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public int queryForInt(String sql, Object[] args)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public int queryForInt(String sql, Object[] args)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public long queryForLong(String sql)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public long queryForLong(String sql, Object[] args)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public long queryForLong(String sql, Object[] args, int[] argTypes)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public Object queryForObject(String sql, Class requiredType)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public Object queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public Object queryForObject(String sql, Object[] args, Class requiredType)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public Object queryForObject(String sql, Object[] args, RowMapper rowMapper)</pre>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">public Object queryForObject(String sql, RowMapper rowMapper)</pre>    <p></p>    <span style="color:#e53333;"><b>注意:这些针对的resultset返回的必须是一行记录,否则会出错!</b></span>    <br />  如果查询的结果包含一列数字型的结果,或者使用了SQL函数,或者其它的单列的结果,那么便可以直接通过这组便利的模板方法进行查询:    <br />    <pre class="brush:java; toolbar: true; auto-links: false;">  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);</pre>    <p></p> queryForMap与其它的方法的不同之处在于它的查询的结果以java.util.Map的形式返回,Map的键对应查询的表的列的名字,Map的值对应键所在的列的值。    <p></p>