spring對dao層的支持(datasource的作用)

本文大多數內容轉自“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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章