spring对dao层的支持(datasource的作用)

来源:互联网 发布:物业网络拓扑图 编辑:程序博客网 时间:2024/06/05 04:57

本文大多数内容转自“http://www.cnblogs.com/liunanjava/p/4412408.html”感谢原作者

在做一个项目时,持久层并没有使用spring jpa和hibernate结合,而是使用了spring原生的jdbctemplate。

因为spring原声的jdbc template效率更高

二、Spring注入数据源

2.1、 DataSource(数据源)

连接数据的方式称为“数据库”。比如JDBC,连接池或者JNDI

Spring通过依赖注入方式配置数据源

不同系统,数据源的管理更多是针对底层的行为,这些行为不应该影响业务。

更换数据只需修改Bean定义的内容,而不需要修改任何一行代码。

2.2、配置数据源

datasource bean有很多种实现类,具体视不同的数据库而改变datasource实现类。

jdbc的连接方式datasource 的spring实现类为org.springframework.jdbc.datasource.DriverManagerDataSource。

spring实现了不同的数据库连接实现类。即不同数据库的datasource实现类。

applicationContext.xml配置数据源由此可见spring的所有bean都是配置在spring.xml配置文件中的,datasource是最典型例子)

复制代码
<?xml version="1.0" encoding="UTF-8"?><beans    xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:p="http://www.springframework.org/schema/p"    xmlns:aop="http://www.springframework.org/schema/aop"    xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!--数据源  --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!--驱动  --><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/><!--URL  --><property name="url" value="jdbc:oracl:thin:@localhost:1521:orcl"/><!--连接的用户名  --><property name="username" value="accp"></property><!--连接的密码  --><property name="password" value="accp"></property></bean></beans>
复制代码

JDBC操作:

复制代码
package com.pb.jdbc.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import javax.sql.DataSource;import com.pb.entity.Person;import com.pb.jdbc.dao.PersonDao;public class PersonDaoImpl implements PersonDao {    private DataSource dataSource; //引入datasource bean    @Override    public Person findById(Integer id) {        Connection con = null;        PreparedStatement ps = null;        ResultSet rs = null;        Person p=null;        String sql="select * from person where id=?";        Object [] params={id};        //获取连接        try {            con=dataSource.getConnection();            ps=con.prepareStatement(sql);            if(params!=null){            for (int i = 0; i < params.length; i++) {                ps.setObject(i+1, params[i]);            }            }            rs=ps.executeQuery();            if(rs!=null){                p=new Person();                while(rs.next()){                    p.setId(rs.getInt("id"));                    p.setName(rs.getString("name"));                    p.setAge(rs.getInt("age"));                }            }            return p;        } catch (SQLException e) {            e.printStackTrace();        }finally{                            try {                    if(rs!=null)                    rs.close();                    if(ps!=null)                        ps.close();                    if(con!=null)                        con.close();                } catch (SQLException e) {                    e.printStackTrace();                }        }                        return null;    }    public void setDataSource(DataSource dataSource) {        this.dataSource = dataSource;    }}
复制代码

更新applicationContext.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?><beans    xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:p="http://www.springframework.org/schema/p"    xmlns:aop="http://www.springframework.org/schema/aop"    xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!--数据源  --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!--驱动  --><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/><!--URL  --><property name="url" value="jdbc:oracl:thin:@localhost:1521:orcl"/><!--连接的用户名  --><property name="username" value="accp"></property><!--连接的密码  --><property name="password" value="accp"></property></bean><!-- PersonDao接口实现类 --><bean id="personDaoImpl" class="com.pb.jdbc.dao.impl.PersonDaoImpl"><!-- 属性关联 --><property name="dataSource" ref="dataSource"/></bean></beans>
复制代码

三、JDBC Template

 为什么需要JDBCTemplate(JDBC模板)?

使用JDBC时,总是需要进行固定的步骤,比如Connection,Statement的获取、关闭,异常处理等。

JDBCTemplate作用:

Spring将JDBC常用的操作封装到JDBCTemplate中简化了使用JDBC的开发流程,开发人员不需要关心,获得连接和关闭连接

更改上面的代码

复制代码
package com.pb.jdbc.dao.impl;import java.math.BigDecimal;import java.util.List;import java.util.Map;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import com.pb.entity.Person;import com.pb.jdbc.dao.PersonDao;public class JdbcTemplatePersonDaoImpl implements PersonDao {    private JdbcTemplate jdbcTemplate;    //根据ID查找    @Override    public Person findById(Integer id) {        Person p=null;        //返回的是集合,但集合的每个元素都是一个map        String sql="select * from person where id=?";        //占位符        Object [] params={id};        //调用SQL和占位        List results=jdbcTemplate.queryForList(sql,params);        for (Object object : results) {            Map personMap=(Map) object;            //获取每个map的值            Long p_id=((BigDecimal) personMap.get("ID")).longValue();            String p_name=(String) personMap.get("NAME");            Integer p_age=((BigDecimal) personMap.get("AGE")).intValue();                        //声明            p=new Person();            p.setAge(p_age);            p.setId(p_id);            p.setName(p_name);        }                return p;    }    //通过设置数据获取JdbcTemplate的实例    public void setDataSource(DataSource dataSource) {        jdbcTemplate=new JdbcTemplate(dataSource);    }}
复制代码

四、JDBC Template

要使用Jdbctemplate 对象来完成jdbc 操作。通常情况下,有三种种方式得到JdbcTemplate 对象。 

  •       第一种方式:我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成JdbcTemplate 的实例化。也就是它是从外部“注入” DataSource   到DAO 中,然后 自己实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。 
  •       第二种方式: 在 Spring 的 IoC 容器中配置一个 JdbcTemplate 的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。 
  •       第三种方式: Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 类 , 这 个 类 中 定 义 了 JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建jdbcTemplate 的实例,所以我们自己编写的DAO 只需要继承JdbcDaoSupport 类, 然后注入DataSource 即可

第一种

复制代码
public class UserServiceImpl implements UserService {        private JdbcTemplate jdbcTemplate;            public JdbcTemplate getJdbcTemplate() {          return jdbcTemplate;      }                    //注入方法1         public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {          this.jdbcTemplate = jdbcTemplate;      }                   //其它方法这里省略……  } 
复制代码

application.xml   前提是已经配置了dataSource 2.2配置数据源

复制代码
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">          <property name = "dataSource" ref="dataSource">  </bean>  <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">       <property name="jdbcTemplate" ref="jdbcTemplate"/>  </bean>  
复制代码

第二种 通过数据库实例化JdbcTemplate

复制代码
public class UserServiceImpl implements UserService {            private JdbcTemplate jdbcTemplate;                    //注入方法2          public void setDataSource(DataSource dataSource) {                     this.jdbcTemplate = new JdbcTemplate(dataSource);          }                //其它方法省略……  }  
复制代码

applicationContext.xml

前提是已经配置了dataSource  2.2配置数据源

spring配置文件为:

<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">         <property name="dataSource" ref="dataSource"/>  </bean> 

第三种:

继承JdbcDaoSupport,其内部有个JdbcTemplate ,需要注入DataSource 属性来实例化。

复制代码
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {        @Override      public void save(User user) {          String sql = null;          this.getJdbcTemplate().update(sql);      }          //其它方法省略……  }  
复制代码

xml

<bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl">             <property name="dataSource" ref="dataSource"/>  </bean>