本文大多數內容轉自“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>