0. Spring Container的整体结构
主要内容:
1. Spring配置导入属性文件
2. Spring整合JDBC处理数据库业务
3. 使用JDBCTemplate组件简化数据操作
1. Spring配置导入属性文件
方法1:
方法2:(推荐使用)
<!--配置加载属性文件到spring上下文中-->
<context:property-placeholder
location="classpath*:com/xzit/model/conf/dbconfig.properties"
file-encoding="utf-8"
order="1"
ignore-resource-not-found="false"
ignore-unresolvable="false"/>
2. Spring整合JDBC处理数据库业务
- 配置数据源
- 配置数据库事务管理对象并注入被管理的数据源
- 配置jdbcTemplate模板并注入数据源
- 配置事务处理属性通知并管理事务管理对象
- 配置事务拦截切入点关联事务处理通知
我这里的例子使用的是mysql数据库
1)配置数据源
配置apacheDBCP数据源
<!--配置DBCP数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="url" value="${jdbc_url}"/>
<property name="driverClassName" value="${jdbc_driver}"/>
<property name="username" value="${jdbc_user}"/>
<property name="password" value="${jdbc_password}"/>
</bean>
2)配置数据库数据管理组件
配置JDBC事务管理组件管理数据库事务,并注入依赖的数据源
<!--配置jdbc数据库事务管理组件并注入依赖的数据源-->
<bean id="jdbcTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
3)配置JDBCTemplate模板
JDBCTemplate模板组件提供了简化数据增删改查操作的有用方法
<!--配置jdbcTemplate并注入其必须依赖的数据源-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
<property name="queryTimeout" value="10"/>
<property name="fetchSize" value="20"/>
</bean>
4)配置事务属性通知
事务属性描述了如何处理事务操作,通常使用<tx:advice>命名空间进行配置并关联事务管理对象
<!--配置数据库事务属性通知,定义什么签名的方法如何使用事务-->
<tx:advice id="txAdvice" transaction-manager="jdbcTransactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"
no-rollback-for="java.lang.Exception"/>
<tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT"
no-rollback-for="java.lang.Exception"/>
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT"
no-rollback-for="java.lang.Exception"/>
<tx:method name="modify*" propagation="REQUIRED" isolation="DEFAULT"
no-rollback-for="java.lang.Exception"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT"
no-rollback-for="java.lang.Exception"/>
<tx:method name="remove*" propagation="REQUIRED" isolation="DEFAULT"
no-rollback-for="java.lang.Exception"/>
<tx:method name="find*" propagation="NOT_SUPPORTED" read-only="true"/>
<tx:method name="select*" propagation="NOT_SUPPORTED" read-only="true"/>
<tx:method name="query*" propagation="NOT_SUPPORTED" read-only="true"/>
</tx:attributes>
</tx:advice>
5)配置事务拦截接入点关联事务属性
事务AOP拦截设置描述哪些url下的哪些组件哪些方法被切入并应用数据库事务处理。
<!--配置AOP拦截切入点并关联事务属性通知-->
<aop:config>
<aop:pointcut id="txMethodsPointcut"
expression="execution(* com.xzit.model.*.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txMethodsPointcut"/>
</aop:config>
3. 使用JDBCTemplate组件简化数据操作
JdbcTemplate是Spring框架提供的执行数据库操作的组件,通常在DAO组件类中注入JdbcTemplate组件对象利用其提供的相关方法实现简化数据操作的业务。
3.1 JDBCTemplate常用方法
使用的时候可以去查询官方的API
1) 常用更新方法
- int update(String sql) 执行给定的sql语句返回被影响数据库表行数结果
- int update(String sql, Object args) 执行给定的sql语句并使用args作为sql参数返回被影响数据库行数结果
示例:
@Autowired
private BasicDataSource ds; //自动依赖注入
@Resource(name = "jdbcTemplate")
private JdbcTemplate jt; //按名称查找
@Override
public void addStudent(Student student) throws Exception {
System.out.println("添加用户到数据库");
String sql = "insert into student (name, sex, address) value (?,?,?)";
jt.update(sql,student.getName(), student.getSex(), student.getAddress());
}
2) 常用的查询方法
- void query(String sql, RowCallbackHandler rch)
- T query(String sql, ResultSetExtractor<T> rse)
- List<T> query(String sql, RowMapper<T> rm)
- T queryForObject(String sql, Class<T> cls)
- Map queryForMap(String sql)
- List<Map> queryForList(String sql)
下面举几个查询方法的例子
首先必不可少的要在数据库要建立相应的表,然后建立相应的实体类,然后来实践一下查询方法~
- List<T> query(String sql, RowMapper<T> rm)
public List<Department> queryDepList() throws Exception {
String sql = "select id, name, code, newDate, descs from department";
List<Department> depList = null;
depList = jt.query(sql, new RowMapper<Department>() {
@Override
public Department mapRow(ResultSet resultSet, int i) throws SQLException {
Department department = new Department();
department.setId(resultSet.getString("id"));
department.setName(resultSet.getString("name"));
department.setCode(resultSet.getString("code"));
department.setNewDate(resultSet.getDate("newDate"));
department.setDescs(resultSet.getString("descs"));
return department;
}
});
return depList;
}
如果没有建立实体类的话,可以用Map进行匹配
- List<Map> queryForList(String sql)
public List<Map<String, Object>> findDepToMapList() throws Exception {
String sql = "select id, name from department";
return jt.queryForList(sql);
}
- List<T> query(String sql, Class<T> cls)
public List<Employee> queryEmpList() throws Exception {
String sql = "select * from emp";
List<Employee> empList = new ArrayList<>();
empList = jt.query(sql, new BeanPropertyRowMapper<>(Employee.class));
return empList;
}
- T queryForObject(String sql, Class<T> cls)
public Employee findEmpById(String id) throws Exception {
String sql = "select id,name, gender, birth, address, " +
"phone,email from emp where id = '" + id + "' ";
Employee employee = jt.queryForObject(sql, new BeanPropertyRowMapper<>(Employee.class));
return employee;
}