- 1、spring对DAO的支持
 - Java代码
 - public class AccountServiceImpl implements AccountService{
 - private AccountDao accountDao;
 - /** set方法注入 */
 - public void setAccountDao(AccountDao accountDao);
 - this.accountDao = accountDao;
 - }
 - public void insert(Account acc){
 - accountDao.insert(acc);
 - }
 - }
 - 从这个类的源代码可以看出,程序所依赖的是数据访问接口。因此,可以随时更换AccountDao的实现类。Spring的DAO框架正式基于这样的基本原理来将应用程序与底层数据存取技术解耦的。
 - 2、数据源的注入
 - 对数据库数据执行任何的存取操作,必须要有数据源,spring提供了javax.sql,DataSource注入,这样在需要更换数据源时只需要在spring配置文件中修改即可。而不需要修改程序代码。
 - 不同的应用系统可能使用不同的数据源。
 - 2.1、不带连接池的数据源
 - Xml代码
 - <!– 配置不带连接池的数据源 –>
 - <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
 - <property name=”driverClassName” value=”com.mysql.jdbc.Driver” />
 - <property name=”url” value=”jdbc:mysql:///spring” />
 - <property name=”username” value=”root” />
 - <property name=”password” value=”123>
 - </bean>
 - <bean id=”accountDao” class=”com.zxf.dao.AccountDaoImpl”>
 - <property name=”dataSource” ref=”dataSource” />
 - </bean>
 - <bean id=”accountService” class=”com.zxf.service.AccountService”>
 - <property name=”accountDao” ref=”accountDao”/>
 - </bean>
 - 2.2、集成第三方连接池技术的数据源
 - 第一种方式所获取的数据源是不带连接池的,不适合正式的商业使用。正式的商业应用需要使用带连接池的数据源,比较常见的第三方连接池有:DBCP和C3P0。
 - 要想使用第三方的连接池技术,首先需要在项目类路径下添加它的类库。
 - commons-dbcp.jar 和 commons-pool.jar.
 - Xml代码
 - <!– 配置DBCP的数据源 –>
 - <bean id=”dataSource2″
 - class=”org.apache.commons.dbcp.BasicDataSource”
 - destroy-method=”close”>
 - <property name=”driverClassName” value=”com.mysql.jdbc.Driver”/>
 - <property name=”url” value=”jdbc:mysql:///spring” />
 - <property name=”username” value=”root” />
 - <property name=”password” value=”123″ />
 - </bean>
 - <!– 配置C3P0的数据源 –>
 - <bean id=”dataSource3″
 - class=”com.mchange.v2.c3p0.ComboPooledDataSource”
 - destroy-method=”close”>
 - <property name=”driverClass” value=”com.mysql.jdbc.Driver” />
 - <property name=”jdbcUrl” value=”jdbc:mysql:///spring” />
 - <property name=”user” value=”root” />
 - <property name=”password” value=”123”/>
 - </bean>
 - 备注:若要使用分散配置设置数据库的连接的话,可以使用分散配置。在配置数据源的是代码前面配置一下的代码。
 - Xml代码
 - <!– 分散配置 –>
 - <context:property-placeholder location=”jdbc.properties”/>
 - 举例:
 - <!– 驱动程序 –>
 - <property name=”driverClass”>
 - <value>${jdbc.driverClass}</value>
 - </property>
 - <!– 连接的url地址 –>
 - <property name=”jdbcUrl”>
 - <value>${jdbc.url}</value>
 - </property>
 - <!– 连接的用户名 –>
 - <property name=”user”>
 - <value>${jdbc.user}</value>
 - </property>
 - <!– 连接的用户名的密码 –>
 - <property name=”password”>
 - <value>${jdbc.password}</value>
 - </property>
 - <!– 最大池数 –>
 - <property name=”maxPoolSize”>
 - <value>${c3p0.pool.max}</value>
 - </property>
 - <!– 最小池数 –>
 - <property name=”minPoolSize”>
 - <value>${c3p0.pool.min}</value>
 - </property>
 - <!– 默认的初始化的池数 –>
 - <property name=”initialPoolSize”>
 - <value>${c3p0.pool.init}</value>
 - </property>
 - Properties代码
 - 下面是jdbc.properties
 - jdbc.driverClass=com.mysql.jdbc.Driver
 - jdbc.url=jdbc\:mysql\://localhost\:3306/spring
 - jdbc.user=root
 - jdbc.password=123
 - c3p0.pool.max=10
 - c3p0.pool.min=3
 - c3p0.pool.init=5
 
- API的使用。
 - Java的代码
 - 包 com.zxf.domain;
 - 导入 java.util.Date的;
 - / **
 - * @作者z_xiaofei168
 - * /
 - 公共 类 帐户{
 - 私人 长的ID;
 - 私人 弦乐LOGINNAME;
 - 私人 弦乐密码;
 - 私人 弦乐电子邮件;
 - 私人 弦乐手机;
 - 私人 日期registedTime;
 - / /以下省略所以的设置和获取方法
 - }
 - 3.1 ,使用的JdbcTemplate类
 - Java的代码
 - 包 com.zxf.dao;
 - 进口 的java.util.List;
 - 导入 com.zxf.domain.Account;
 - / **账户的DAO接口* /
 - 公共 接口 AccountDao {
 - / **新增账户* /
 - 无效 创建(帐户ACC);
 - / **删除指定账户* /
 - 无效 删除(帐号ACC);
 - / **更新账户中* /
 - 无效 更新(帐户ACC);
 - / **查询指定ID的账户* /
 - findById帐户(隆ID);
 - / **查询所有账户* /
 - 列表<Account>的findAll();
 - }
 - 包 com.zxf.dao;
 - 进口 的java.sql.ResultSet;
 - 进口 的java.sql.SQLException;
 - 导入 的java.sql.Timestamp;
 - 导入 java.util.Date的;
 - 进口 的java.util.List;
 - 导入 了javax.sql.DataSource;
 - 进口 org.springframework.jdbc.core.JdbcTemplate;
 - 导入 org.springframework.jdbc.core.RowMapper;
 - 导入 com.zxf.domain.Account;
 - / **
 - * AccountDao实现类
 - *使用的JdbcTemplate来实现
 - * /
 - 公共 类实现 AccountDao的{
 - 私人 的JdbcTemplate的JdbcTemplate;
 - 公共 无效 的setDataSource(DataSource的数据源){
 - JdbcTemplate的= 新的 JdbcTemplate(数据源);
 - }
 - 公共 无效 创建(帐户ACC){
 - 弦乐的sql = “INSERT INTO帐户(登录名,密码,电子邮件,”
 - + “手机,registed_time)VALUES(????,NOW())” ;
 - Object []的paramValues = {acc.getPassword acc.getLoginname(),(),
 - acc.getEmail(),acc.getCellphone()};
 - jdbcTemplate.update(SQL,paramValues);
 - }
 - 公共 无效 删除(帐户ACC){
 - 字符串的sql = “DELETE WHERE ID =?”帐户;
 - paramValues对象[] = {acc.getId()};
 - jdbcTemplate.update(SQL,paramValues);
 - }
 - 公共 无效 更新(帐户ACC){
 - 弦乐的sql = “UPDATE帐户SET LOGINNAME的=?,密码=?,电子邮件=?”
 - + “手机=?WHERE ID =?” ;
 - Object []的paramValues = {acc.getPassword acc.getLoginname(),(),
 - acc.getCellphone acc.getEmail(),(),acc.getId()};
 - jdbcTemplate.update(SQL,paramValues);
 - }
 - @ SuppressWarnings (“未选中” )
 - 公共 列表<Account>的findAll(){
 - 字符串的sql = “SELECT * FROM帐户” ;
 - 返回 jdbcTemplate.query(SQL,: 新 AccountRowMapper());
 - }
 - 公共 帐户findById(长ID){
 - 字符串的sql = “SELECT * FROM帐户WHERE ID =?” ;
 - Object []的paramValues = {ID};
 - 返回 (帐户)的JdbcTemplate。
 - queryForObject(SQL,paramValues,: 新 AccountRowMapper());
 - }
 - / /把结果集封装成帐户对象的包装类
 - 私人 静态 最终 类 AccountRowMapper 实现 RowMapper的{
 - 公共的 对象mapRow(结果集RS, INT ROWNUM) 抛出 的SQLException {
 - 帐户ACC = 新 帐户();
 - acc.setId(rs.getLong(“ID” ));
 - acc.setLoginname(rs.getString(登录名“ ));
 - acc.setPassword(rs.getString( “ 密码” ));
 - acc.setEmail(rs.getString( “ 电子邮件” ));
 - acc.setCellphone(rs.getString( “ 手机” ));
 - 时间戳温度= rs.getTimestamp(“registed_time” );
 - (温度!= 0 ){
 - (新 acc.setRegistedTime的 日期(temp.getTime()));
 - }
 - 返回 ACC;
 - }
 - }
 - }
 - 3.2 ,使用NamedParameterJdbcTemplate类类
 - Java的代码
 - 包 com.zxf.dao;
 - 进口 的java.sql.ResultSet;
 - 进口 的java.sql.SQLException;
 - 导入 的java.sql.Timestamp;
 - 导入 java.util.Date的;
 - 导入 的java.util.HashMap;
 - 进口 的java.util.List;
 - 导入 的java.util.Map;
 - 导入 了javax.sql.DataSource;
 - 导入 org.springframework.jdbc.core.RowMapper;
 - 导入 org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
 - 导入 org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 - 进口 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 - 导入 org.springframework.jdbc.core.namedparam.SqlParameterSource;
 - 导入 com.zxf.domain.Account;
 - / **
 - *使用NamedParameterJdbcTemplate类来实现AccountDao接口
 - * /
 - 公共 类实现 AccountDao的{
 - / /带命名参数功能的JDBC模板类实例
 - 私人 NamedParameterJdbcTemplate类的JdbcTemplate;
 - 公共 无效 的setDataSource(DataSource的数据源){
 - 的JdbcTemplate = 新 NamedParameterJdbcTemplate类(数据源);
 - }
 - 公共 无效 创建(帐户ACC){
 - 弦乐的sql = “INSERT INTO帐户(登录名,密码,电子邮件,”
 - + “手机,registed_time)”
 - + “VALUES(登录名,密码,电子邮件,手机,NOW())” ;
 - / /使用一个Bean的对象的属性值作为命名参数的值
 - SqlParameterSource的namedParameters =
 - 新 组件属性SQL参数源(ACC);
 - 这jdbcTemplate.update(SQL,namedParameters);
 - }
 - 公共 无效 删除(帐户ACC){
 - 字符串的sql = “DELETE FROM帐户WHERE ID =:ID” ;
 - / /使用指定的值来代替命名参数
 - SqlParameterSource的namedParameters =
 - 新 MapSqlParameterSource(“ID” ,acc.getId());
 - 这jdbcTemplate.update(SQL,namedParameters);
 - }
 - 公共 无效 更新(帐户ACC){
 - 字符串的sql = “ 更新账户的SET LOGINNAME =:登录名。”
 - + “密码:密码,电子邮件:电子邮件,”
 - + 手机=手机WHERE ID =:ID“ ;
 - / /使用地图对象中的键/值对来代替多个命名参数的实际值
 - 地图<String, namedParameters对象> = 新 的HashMap <String,对象>();
 - namedParameters.put( “ 登录名” ,acc.getLoginname());
 - namedParameters.put( “ 密码” ,acc.getPassword());
 - namedParameters.put( “ 电子邮件” ,acc.getEmail());
 - namedParameters.put( “ 手机” ,acc.getCellphone());
 - namedParameters.put(“ID” ,acc.getId());
 - 这jdbcTemplate.update(SQL,namedParameters);
 - }
 - @ SuppressWarnings (“未选中” )
 - 公共 列表<Account>的findAll(){
 - 字符串的sql = “SELECT * FROM帐户” ;
 - / /通过getJdbcOperations()来访问只有在使用JdbcTemplate中拥有的功能
 - 返回 的JdbcTemplate
 - getJdbcOperations()
 - 查询(SQL,: 新 AccountRowMapper());
 - }
 - 公共 帐户findById(长ID){
 - 字符串的sql = “SELECT * FROM帐户WHERE ID =?” ;
 - / /使用指定的值来代替命名参数
 - SqlParameterSource的namedParameters =
 - 新 MapSqlParameterSource( “ 身份证” ,身份证);
 - 返回 (帐户)的JdbcTemplate
 - 查询(SQL,namedParameters 新 AccountRowMapper());
 - }
 - / /把结果集封装成帐户对象的包装类
 - 私人 静态 最终 类 AccountRowMapper 实现 RowMapper的{
 - 公共的 对象mapRow(结果集RS, INT ROWNUM) 抛出 的SQLException {
 - 帐户ACC = 新 帐户();
 - acc.setId(rs.getLong(“ID” ));
 - acc.setLoginname(rs.getString(登录名“ ));
 - acc.setPassword(rs.getString( “ 密码” ));
 - acc.setEmail(rs.getString( “ 电子邮件” ));
 - acc.setCellphone(rs.getString( “ 手机” ));
 - 时间戳温度= rs.getTimestamp(“registed_time” );
 - (温度!= 0 ){
 - (新 acc.setRegistedTime的 日期(temp.getTime()));
 - }
 - 返回 ACC;
 - }
 - }
 - }
 - 3.3 ,使用SimpleJdbcTemplate类类
 - Java的代码
 - 包 com.zxf.dao;
 - 进口 的java.sql.ResultSet;
 - 进口 的java.sql.SQLException;
 - 导入 的java.sql.Timestamp;
 - 导入 java.util.Date的;
 - 进口 的java.util.List;
 - 导入 了javax.sql.DataSource;
 - 导入 org.springframework.jdbc.core.simple.ParameterizedRowMapper;
 - 进口 org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
 - 导入 com.zxf.domain.Account;
 - / **
 - *使用SimplateJdbcTemplate来实现AccountDao接口
 - * /
 - 公共 类实现 AccountDao的{
 - 私人 SimpleJdbcTemplate类的JdbcTemplate;
 - 公共 无效 的setDataSource(DataSource的数据源){
 - 的JdbcTemplate = 新 SimpleJdbcTemplate类(数据源);
 - }
 - 公共 无效 创建(帐户ACC){
 - 弦乐的sql = “INSERT INTO帐户(登录名,密码,电子邮件,”
 - + “手机,registed_time)VALUES(????,NOW())” ;
 - 这jdbcTemplate.update(SQL acc.getLoginname()
 - acc.getPassword(),
 - acc.getEmail(),
 - acc.getCellphone());
 - }
 - 公共 无效 删除(帐户ACC){
 - 字符串的sql = “DELETE WHERE ID =?”帐户;
 - jdbcTemplate.update(SQL,acc.getId());
 - }
 - 公共 无效 更新(帐户ACC){
 - 弦乐的sql = “UPDATE帐户SET LOGINNAME的=?,密码=?,电子邮件=?”
 - + “手机=?WHERE ID =?” ;
 - 这jdbcTemplate.update(SQL acc.getLoginname()
 - acc.getPassword(),
 - acc.getEmail(),
 - acc.getCellphone(),
 - acc.getId());
 - }
 - 公共 列表<Account>的findAll(){
 - 字符串的sql = “SELECT * FROM帐户” ;
 - 返回 jdbcTemplate.query(SQL,: 新 AccountRowMapper());
 - }
 - 公共 帐户findById(长ID){
 - 字符串的sql = “SELECT * FROM帐户WHERE ID =?” ;
 - 返回 jdbcTemplate.queryForObject(SQL, 新 AccountRowMapper(),身份证);
 - }
 - / /把结果集封装成帐户对象的包装类
 - 私人 静态 最终 类 AccountRowMapper
 - 实现 ParameterizedRowMapper的<Account> {
 - 公众的 帐户方法mapRow(结果集RS, INT ROWNUM)
 - 抛出 SQLException异常{
 - 帐户ACC = 新 帐户();
 - acc.setId(rs.getLong(“ID” ));
 - acc.setLoginname(rs.getString(登录名“ ));
 - acc.setPassword(rs.getString( “ 密码” ));
 - acc.setEmail(rs.getString( “ 电子邮件” ));
 - acc.setCellphone(rs.getString( “ 手机” ));
 - 时间戳温度= rs.getTimestamp(“registed_time” );
 - (温度!= 0 ){
 - (新 acc.setRegistedTime的 日期(temp.getTime()));
 - }
 - 返回 ACC;
 - }
 - }
 - }
 - 包 com.zxf.service;
 - 进口 的java.util.List;
 - 导入 com.zxf.dao.AccountDao;
 - 导入 com.zxf.domain.Account;
 - / **
 - *帐户业务逻辑类
 - * @作者z_xiaofei168
 - * /
 - 公共 类 的AccountService {
 - 私人 AccountDao accountDao;
 - / / setter方法注入
 - 公共的 无效 setAccountDao(AccountDao accountDao){
 - accountDao = accountDao;
 - }
 - 公共 无效 创建(帐户ACC){
 - accountDao.create(ACC);
 - }
 - 公共 无效 删除(帐户ACC){
 - accountDao.delete(ACC);
 - }
 - 公共 无效 更新(帐户ACC){
 - accountDao.update(ACC);
 - }
 - 公共 帐户findById(长ID){
 - 返回 accountDao.findById(ID);
 - }
 - 公共 列表<Account>的findAll(){
 - 返回 accountDao.findAll();
 - }
 - }