文章目錄
Spring配置JdbcTemplate的兩種方式
- 在dao中定義JdbcTemplate的方式:可用xml配置也可以註解配置
- dao繼承JdbcDaoSupport的方式:只能用XML配置,註解不了。
在dao中定義JdbcTemplate的方式的方式,在持久層每個實現類中要重複寫注入JdbcTemplate的代碼。而dao繼承JdbcDaoSupport的方式,JdbcDaoSupport類已經提供了set注入的方法,就可以不用寫注入JdbcTemplate的set方法了。
(一).在dao中定義JdbcTemplate的方式
1.xml配置實現
引入依賴
<!--Spring包的依賴-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--Spring對JDBC數據訪問進行封裝的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--聲明式事務所需包
爲JDBC、Hibernate、JDO、JPA、Beans等提供的一致的聲明式和編程式事務管理支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--數據庫驅動包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--這裏使用spring內置數據源,不用C3P0或者Druid
spring內置數據源在spring-jdbc-5.0.2.REEASE.jar包,已引入
-->
<!--測試包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
用戶持久層接口與實現類
//用戶持久層接口
public interface UserDao {
//增加數據
void add(User user);
//根據id查詢用戶
User getById(Integer id);
}
//用戶持久層接口實現類
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
//類中提供需要注入成員的set方法
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void add(User user) {
jdbcTemplate.update("insert into user(id,username,birthday,sex,address) values (?,?,?,?,?)", user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
}
public User getById(Integer id) {
return jdbcTemplate.queryForObject("select * from user where id=?", new BeanPropertyRowMapper<User>(User.class), id);
}
}
用戶業務層接口與實現類
//用戶業務層接口
public interface UserService {
//增加數據
void add(User user);
//根據id查詢用戶
User getById(Integer id);
}
//用戶業務層接口實現類
public class UserServiceImpl implements UserService {
private UserDao userDao;
//提供set注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(User user) {
userDao.add(user);
}
public User getById(Integer id) {
User user = userDao.getById(id);
return user;
}
}
Spring配置文件中配置
Spring配置文件中配置加載配置文件的三種方式
將數據庫連接的信息配置到屬性配置文件中
- jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/spring
uname=root
pwd=root
①創建Bean對象加載解析配置文件
- Spring配置文件
<!--配置UserServiceImpl 讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
<bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
<!-- 通過配置文件給bean中的屬性傳值:set注入-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
<!--set注入-->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--set注入-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--【 創建Bean對象加載解析配置文件 】-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!--指定要加載的配置配置文件-->
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!--配置spring內置數據源,如使用C3P0或者Druid則配置對應數據源 引入外部屬性配置文件後,才能用${}-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--set注入-->
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${uname}"></property>
<property name="password" value="${pwd}"></property>
</bean>
②配置文件解析器
- Spring配置文件
<!--配置UserServiceImpl 讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
<bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
<!-- 通過配置文件給bean中的屬性傳值:set注入-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
<!--set注入-->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--set注入-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--【配置文件解析器】 如果是多個文件,用逗號隔開。
①注意: (弊端)如果配置了多個解析器,只能識別第一個解析器的數據。
所以多個配置屬性配置文件的情況下可與 <context:property-override location="jdbc_config.properties" /> 搭配使用
② 與<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean> 作用相同
-->
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${uname}"></property>
<property name="password" value="${pwd}"></property>
</bean>
③加載解析配置文件,並將配置文件數據自動注入到指定的Bean中
多個配置屬性配置文件的情況下可與配置文件解析器方式
搭配使用
在類路徑下添加一個屬性配置文件jdbc_config.properties
- jdbc_config.properties
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://127.0.0.1:3306/spring
dataSource.username=root
dataSource.password=root
#前綴 dataSource 是指定Bean的id,給該Bean注入指定屬性信息
- Spring配置文件
<!--配置UserServiceImpl 讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
<bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
<!-- 通過配置文件給bean中的屬性傳值:set注入-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
<!--set注入-->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--【配置文件解析器】,與 <context:property-override location="jdbc_config.properties" />搭配使用 供JdbcTemplate選擇引用-->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--配置數據源-->
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${uname}"></property>
<property name="password" value="${pwd}"></property>
</bean>
<!--【解析配置文件,並自動注入數據到指定Bean中】 dataSource-->
<context:property-override location="jdbc_config.properties" />
<!--配置數據源
屬性配置文件(jdbc_config.properties)中前綴 dataSource 是指定Bean的id,給該Bean注入指定屬性信息。
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" />
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--set注入數據源 引用dataSource1數據源-->
<property name="dataSource" ref="dataSource1"></property>
</bean>
使用Spring測試框架 測試
- SpringJdbcTemplateTest
@RunWith(SpringJUnit4ClassRunner.class)////1.使用@RunWith註解替換原有運行器
@ContextConfiguration(locations= {"classpath:beans.xml"})//2.使用@ContextConfiguration指定spring配置文件的位置
public class SpringJdbcTemplateTest {
@Autowired//3.使用@Autowired給測試類中的變量注入數據
private UserService userService;
@Test
public void getByIdTest(){
User user = userService.getById(3);
System.out.println(user);
}
}
2.註解配置實現
(二).dao繼承JdbcDaoSupport的方式,避免重複編碼
- 持久層接口實現類繼承JdbcDaoSupport
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
public void add(User user) {
getJdbcTemplate().update("insert into user(id,username,birthday,sex,address) values (?,?,?,?,?)", user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
}
public User getById(Integer id) {
return getJdbcTemplate().queryForObject("select * from user where id=?", new BeanPropertyRowMapper<User>(User.class), id);
}
}
JdbcDaoSupport 類
- Spring配置文件
<!--配置UserServiceImpl 讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
<bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
<!--通過配置文件給bean中的屬性傳值:set注入-->
<property name="userDao" ref="userDao"></property>
</bean>
<!--解析配置文件,並自動注入數據到指定Bean(數據源)中 -->
<context:property-override location="jdbc_config.properties" />
<!--配置數據源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" />
<!--配置UserDaoImpl 繼承JdbcDaoSupport的方式這裏需要注入數據源 -->
<bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
<!--set注入數據源-->
<property name="dataSource" ref="dataSource"></property>
</bean>