在我的上个博客中对Spring的JDBC模板类进行了源码分析。我们在使用时只需要使用JdbcTemplate类就能完成数据库操作。下面我们看一个例子:
1、DAO实现类
package com.dao.jdbc; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import com.dao.UserDao; import com.domain.User; public class UserDaoImpl implements UserDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public int getMatchCount(String userName, String password) { String sqlStr = " SELECT count(*) FROM t_user " + " WHERE user_name =? and password=? "; return jdbcTemplate.queryForInt(sqlStr, new Object[] { userName, password }); } public User findUserByUserName(final String userName) { String sqlStr = " SELECT user_id,user_name,credits " + " FROM t_user WHERE user_name =? "; final User user = new User(); jdbcTemplate.query(sqlStr, new Object[] { userName }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { user.setUserId(rs.getInt("user_id")); user.setUserName(userName); user.setCredits(rs.getInt("credits")); } }); return user; } public void updateLoginInfo(User user) { String sqlStr = " UPDATE t_user SET last_visit=?,last_ip=?,credits=? " + " WHERE user_id =?"; jdbcTemplate.update(sqlStr, new Object[] { user.getLastVisit(), user.getLastIp(),user.getCredits(),user.getUserId()}); } }
从上面我们可以看出,我们在进行数据库操作时只需要JdbcTemplate类就可以完成所有操作。在DAO的实现类中并没有看到数据库连接、关闭等操作。只是根据具体的CRUD操作用面向对象的方式来传递查询参数和返回领域对象DO。
然而,我们的Spring中DAO是怎样来反问数据库的呢?
实际上在讲JdbcTemplate实现机制时我就讲到:JdbcTemplate实现了接口JdbcOperations的所有的数据库操作方法,同时它继承了JdbcAccessor类。JdbcAccessor可以从DataSource中获取相应的属性。所以JdbcTemplate就是从一个DataSource中获取或返回连接。而我们具体的DAO实现类中都有一个JdbcTemplate属性和一个setJdbcTemplate();
所以,我们要想DAO获取数据库连接,就必须事先声明一个数据源。
2、数据源声明
<beans> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/sampledb" /> <property name="username" value="root" /> <property name="password" value="admin" /> </bean> ... </beans>
注:这里使用Jakarta的DBCP开源数据库实现方案定义一个数据源。并设置了数据库连接的相关属性。
3、接下来,我们需要配置所使用的JDBC模板类并设置模板类所使用的数据源
<!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ><ref bean="dataSource"/> </property> </bean>
注:其中的<ref bean="dataSource"/> 中的dataSource即前面定义的数据源Bean ID。
4、为DAO分配模板类:将模板类传入DAO实现类的setJdbcTemplate()
<!-- 配置dao --> <bean id="loginLogDao" class="com.dao.jdbc.LoginLogDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <bean id="userDao" class="com.dao.jdbc.UserDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean>
为每一个DAO都要配置一个关联的JdbcTemplate Bean。
注:其中的ref="jdbcTemplate"中的jdbcTemplate为JDBC模板类配置中的Bean ID。
5、当然,可以将这些配置全部放在一个Spring配置文件中。Spring配置文件的基本结构如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <bean>...<bean> ... </beans>
前面的数据源配置、JDBC模板类配置、DAO配置分别对应于Spring配置文件中的一个bean标记。