算是对Spring的一个阶段性总结吧,注解、依赖注入、JDBC、事务等重点基本都涉及到了,值得记录一下。
首先是最重要的xml配置文件。虽然使用了注解方式,不过还是需要在XML中设置一些东西。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 注册注释解析处理器 -->
<!-- <context:annotation-config/> -->
<!-- 下面component-scan 包含了上述annotation-config的功能,故可以不加 -->
<!-- 启用Spring自动扫描 -->
<context:component-scan base-package="niit.spring"/>
<!-- 获取配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 1.配置JDBC数据源,数据从上配置文件获取 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
<!-- 2.配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 3.配置JDBC事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 4.采用@Transaction注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
其中JDBC连接信息使用了properties格式的配置文件,与xml一起放置在src目录下。
然后就是Dao层实现类:
package niit.spring.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import niit.spring.dao.EmployeeDao;
import niit.spring.model.EmployeePO;
//Repository用于标注Dao层组件
@Repository("employeeDao")
public class EmployeeDaoImpl implements EmployeeDao{
@Resource
private JdbcTemplate jdbcTemplate;//声明JDBC模板
public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void insert(EmployeePO po) {
// TODO Auto-generated method stub
jdbcTemplate.update(
"insert into emp values(?,?,?)", //SQL语句
new Object[]{po.getEid(), po.getEname(), po.getEsal()}, //查询参数数组
new int[]{java.sql.Types.INTEGER, java.sql.Types.VARCHAR, java.sql.Types.DOUBLE}); //查询参数SQL数据类型数组
}
@Override
public List<EmployeePO> queryAll() {
// 值得一提的是,JDBCTemplate提供的query()方法返回一个对象数组,而queryForObject()则会返回单个对象,
// 无论使用哪一种,EmployeeRowMapper对象都同样new一次即可,JDBCTemplate会自动按照需要进行单次或多次调用mapRow().
return jdbcTemplate.query("select * from emp", new EmployeeRowMapper());
}
//内部类,实现了RowMapper接口以方便进行重用
private class EmployeeRowMapper implements RowMapper<EmployeePO>{
@Override
public EmployeePO mapRow(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
EmployeePO po = new EmployeePO();
po.setEid(arg0.getInt("eid"));
po.setEname(arg0.getString("ename"));
po.setEsal(arg0.getDouble("esal"));
return po;
}
}
}
Service层实现类。事务便是在本层使用
package niit.spring.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import niit.spring.dao.EmployeeDao;
import niit.spring.model.EmployeePO;
import niit.spring.service.EmployeeService;
@Service("employeeService")
@Transactional(readOnly=true)//注解方式设置事务、在类的级别上设置只读事务
public class EmployeeServiceImpl implements EmployeeService{
@Resource
private EmployeeDao employeeDao;
public void setEmployeeDao(EmployeeDao employeeDao){
this.employeeDao = employeeDao;
}
@Override//声明事务方法,事务方法注解优先级高于类注解,设置属性会覆盖类注解。propagation设置该方法需要在事务条件下运行;isolation设置事务隔离级别为默认
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT)
public void add(EmployeePO po) {
employeeDao.insert(po);
//int i = 1/0; //事务测试
}
@Override//NOT_SUPPORTED声明该方法不需要事务,若该方法在一个事务中被调用,则事务会被暂时挂起直至该方法运行结束
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public List<EmployeePO> getAll() {
return employeeDao.queryAll();
}
}
测试类就不贴了。初始化Spring容器调用Serviece对象即可。