1.JdbcTemplate
1.1JdbcTemplate完成对数据表的查询操作
查询:
* 查询一个pojo对象:queryForObject
* 查询一个单值 : queryForObject
* 查询一个pojo对象列表:query方法
public double getMinSalary() {
String sql="SELECT MIN(salary) FROM employee";
Double salary = jdbcTemplate.queryForObject(sql, Double.class);
return salary;
}
public List<Employee> getEmployees(){
String sql="SELECT emp_id eid,emp_name ename,salary FROM employee";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<Employee>(Employee.class);
List<Employee> list = jdbcTemplate.query(sql, rowMapper);
return list;
}
public Employee getEmployeeByEid(Integer eid) {
String sql="SELECT emp_id eid,emp_name ename,salary FROM employee WHERE emp_id= ?";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<Employee>(Employee.class);
Employee emp = jdbcTemplate.queryForObject(sql, rowMapper, eid);
return emp;
}
2.事务
如果在一个功能单元【方法】里面涉及到对数据库的多次增删改操作,而且希望这多次操作要么同时成功,要么同时失败,就要使用事务。
2.1编程式事务
Connection conn = JdbcUtils.getConnection(); //获取数据库连接
try{
conn.setAutoCommit(false); //2.开启事务
//3.写业务逻辑
Conn.commit(); //4.提交事务
}catch(Exception ex){
Conn.rollback(); //5.回滚事务
}finally{
Conn.close(); //6.释放连接
}
2.2声明式事务
2.2.1基于注解的声明式事务
第一步:导入jar包
第二步:在spring的配置文件中配置数据源事务管理器及开启基于注解的事务支持
<!-- 配置扫描包 -->
<context:component-scan base-package="com.offcn"/>
<!-- 1. 加载properties配置文件信息 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.userName}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
</bean>
<!-- 3.配置JdbcTemplate -->
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 4.配置数据源事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 5.开启基于注解的事务支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
第三步:在service层的方法上加@Transactional注解
2.2.2声明式事务的五大属性
事务的四大特性:
- 原子性
- 一致性
- 隔离性
- 持久性
声明式事务的五大属性:
- Propagation【传播机制】: 表示一个带有事务的方法A运行在另一个带有事务的方法B的内部的时候,内层方法A是使用自己的事务还是使用外层方法B的事务。
Required【默认值】:如果外层方法有事务,就用外层方法的事务,如果外层方法没有事务,就用内层方法自己的事务。
Requires_new:无论外层方法有没有事务,内层方法都用自己的事务。
Supports:如果外层方法有事务,就用外层方法的事务,如果外层方法没有事务,自己也不用事务了。 - Isolation【隔离级别】:数据表并发访问的时候会用到。
Read_uncommited:读未提交
Read_commited:读已提交(oracle数据库默认的隔离级别)
Repeatable_read:可重复读(mysql数据库默认的隔离级别)
Serializable:串行化读
从上到下,并发度依次降低,但是安全性依次增强! - rollbackFor【回滚属性】:事务默认遇到运行时异常的时候才会回滚,如果是编译时异常,默认是不会回滚的。
编译时异常:rollbackFor
运行时异常:norollbackFor - timeout【超时属性】:事务在操作过程中,必定会占用着数据库资源,如果某个事务长时间占用数据库资源,势必影响其它其他事务的执行,所以为了防止某个事务长时间占用着数据库资源,我们给事务设置了超时属性,当这个事务在指定的时间之内如果没有完成对应的操作,我们就回滚事务。
- readOnly【只读属性】:用来加快查询效率的