JDBCTemplate是Spring官方提供的一组操作数据库的api,是spring官方对于jdbc轻量级的封装
1.导入核心依赖
spring核心依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.2.18.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>5.2.18.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.2.18.RELEASEversion>
dependency>
mysql驱动
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.28version>
dependency>
阿里巴巴德鲁伊数据库连接池
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.3version>
dependency>
2.编写spring核心配置文件applicationContext.xml
<context:component-scan base-package="com.raoqi" />
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
bean>
3.编写service层和dao层,在dao层中注入jdbc模板
@Service
public class StudentService {
//注入dao
@Autowired
private StudentDao studentDao;
}
@Repository
public class StudentDaoImpl {
//注入jdbc模板
@Autowired
private JdbcTemplate jdbcTemplate;
}
4.使用jdbcTemplate执行具体操作
//DML操作
int jdbctemplate.update(String sql,Object ...)//给定sql语句和参数返回sql语句影响的行数
//DQL操作
返回基本数据类型和字符串
jdbcTemplate.queryForObject(sql,XXX.class)//返回什么数据类型就写xxx.class
返回单个对象
jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<XXX>(XXX.class),查询语句参数...)//将查询到数据封装到指定的bean对象中
返回集合对象
jdbcTemplate.query(sql, new BeanPropertyRowMapper<Student>(Student.class));//查询集合元素
批量DML
jdbcTemplate.batchUpdate(sql,List<Object[]>)//使用sql语句+参数数组集合来执行批量操作 返回值是
批量int[] 数组是每一次操作的影响列数
编程式事务处理是指在代码中使用try catch把操作包起来如果正常执行就执行commit发生异常就在catch中回滚。
缺点:每一次事务处理都要写提交和关闭比较麻烦,所以spring底层采用了声明式事务
声明式事务:
采用xml配置或者注解的方式来声明事务,底层采用aop的思想在事务之前使用前置通知让事务不提交
在后置通知中提交事务,异常通知中回滚事务
DataSourceTransactionMannger // MyBatis和JDBCTemplate使用的事务管理器
HibernateTransactionMannger//Hibernate使用的事务管理器
步骤:
1.在spring配置文件中进行配置
<!-- 配置事务管理器-->
<bean id="DataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务注解驱动开启-->
<tx:annotation-driven transaction-manager="DataSourceTransactionManager" />
2.在需要添加事务的类或者方法上添加@Transactional注解
传播行为 propgation
值 Propagation.xxxxx
reqirued :事务A中调用事务B事务B会加入事务A
reqirued_new :事务A中调用事务B 事务B和事务不影响,事务A失败了事务B照样能提交
isolation 隔离级别
值:
Propagation
timeout
提交超时时间,超过这个时间就进行回滚
默认值是-1 单位是秒 值是数值型
readOnly 是否只读
默认值是fasle //如果为true就只能读 不能增删改
robackFor 设置哪些异常进行回滚
noRobackFor//不回滚
<tx:advice id="事务通知的id">
<tx:attributes>
<tx:method name="匹配被开启的事务" isolation="隔离级别" propagation="传播行为"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut id="切点id" expression="表达式"/>
<aop:advisor advice-ref="事务通知的id" pointcut-ref="切点"/>
aop:config>
1.Spring配置类中加上@EnableTransactionManagement开启事务注解模式
2.在配置类中写方法用@Bean加到配置类方法上可以把这个方法返回值对象放入IOC容器中,效果和在xml中配置Bean是一样的,如果在方法给形参就是自动根据类型注入
3.使用这种方式把数据库连接池注入到事务管理器和JDBC模板中