【Spring】【JdbcTemplate】【事务处理】【学习笔记】Spring开学很好学1.2

还不上网课😭😭😭,老师们也太敬业了😭😭😭😭😭,他们真的好温柔,我真的要哭死了😭😭😭,能在这么好的学校学习😭😭😭,我是多么的荣幸🤗

JdbcTemplate

Spring框架JDBC进行封装,使用JdbcTemplate方便实现对数据库操作

1、前置需要

1、导包🤤🤤🤤🤤🤤

在这里插入图片描述

2、在spring配置文件配置数据库连接池

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="url" value="jdbc:mysql:///db03"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

3、配置JdbcTemplate对象,注入DateSource

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
    </bean>

2、CRUD

使用JdbcTemplate对象

2.1、添加、删除、修改

update()方法

第一个参数 : sql 语句

第二个参数 : 可变参数,设置sql语句值

// 添加
String sql = "insert into t_user value(?,?,?)";
Object args[] = {user.getUserID(),user.getUsername(),user.getUstatus()};
int update = jdbcTemplate.update(sql, args);


// 删除
String sql = "delete from t_user where uid = ?";
Object args[] = {id};
int update = jdbcTemplate.update(sql, args);

// 修改
String sql = "update t_user set username=?,ustatus=? where uid = ?";
Object args[] = {user.getUsername,user.getUstatus};
int update = jdbcTemplate.update(sql, args);

题外话,接口不会被扫描,刚刚👴试了

<context:component-scan base-package="com.jzlf"></context:component-scan>

2.2、查询

2.2.1、返回某个值

queryForObject(String sql,Class<T> requiredType)方法

第一个参数 : sql语句

第二个参数 : 返会类型Class

String sql = "select count(*) from t_user";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
2.2.2、返回对象

queryForObject(String sql,RowMapper<T> rowMapper,Object… args)方法

第一个参数 : sql 语句

第二个参数 : RowMapper 是接口,针对返回不同类型数据,使用这个接口里实现类完成数据封装

第三个参数 sql 语句值

String sql = "select * from t_user where uid = ?";
User user = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),id);
2.2.3、返回集合

query(String sql,RowMapper<T> rowMapper,Object… args)方法

第一个参数 : sql 语句

第二个参数 : RowMapper 是接口,针对返回不同类型数据,使用这个接口里实现类完成数据封装

第三个参数 sql 语句值

String sql = "select * from t_user";
List<User> userList = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class));

3、批量操作

batchUpdate(String sql,List<Object[] > batchArgs)

第一个参数 : sql 语句

第二个参数 : List集合,添加多条记录数据

// 批量添加
String sql = "insert into t_user values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);	// List<Object[]> batchArgs

// 批量修改
String sql = "update t_user set username = ?,ustatus = ? where uid = ?";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);	// List<Object[]> batchArgs

// 批量删除
String sql = "delete from t_user where uid = ?";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);	// List<Object[]> batchArgs

题外话:JdbcTemplate自动注入的时候出现空指针异常,是因为不能通过new实例化,只能通过IOC容器获得bean

事务处理

事务添加到Service层

Spring 进行声明式事务管理,底层使用AOP原理

Spring 事务管理API

提供了一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

在这里插入图片描述

1、注解声明式事务管理

需要

1、创建事务管理器 2、引入名称空间tx 3、开启事务注解 4、添加事务注解

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
@Service
@Transactional
public class AccountServiceImpl {

@Transactional

这个注解可以用在上,也可以用在方法

  • 加到上,这个类的所有方法都会加上事务
  • 加到方法上,这个方法加上事务

2、声明事务管理参数配置

2.1、propagation

事务传播行为

事务解释
REQUIRED如果add()方法本身有事务,调用update()方法之后,update使用当前add方法里面事务。如果add()方法本身没有事务,调用update方法之后,创建事务
REQUIRED_NEW使用add方法调用update方法,如果add无论是否有事务,都创建新的事务
SUPPORTS如果有事务在运行,当前方法就是在这个事务内运行,否则它可以不运行在事务中
NOT_SUPPORTES当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
MANDATORY当前的方法必须在事务内部,如果没有正在运行的事务,就抛异常
NEVER当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常
NESTED如果事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就开启一个新的事务,并在它自己的事务内运行
@Transactional
public void add(){
    update();
}
public void add()
@Transactional(propagation = Propagation.REQUIRED)

2.2、ioslation

隔离级别脏读不可重复读幻读
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重复读)
SERIALIZABLE(串行化)
@Transactional(isolation = Isolation.REPEATABLE_READ)

2.3、其他参数

参数作用
timeout(超时时间)事务需要在一定时间内进行提交,不交就回滚,默认是-1,设置以秒为单位
readOnly(是否只读)readOnly默认是false,表示可以CRUD
rollbackFor(回滚)设置出哪些异常进行事务回滚
noRollbackFor(不回滚)设置出哪些异常不进行事务回滚

3、XML声明事务管理

1、创建事务管理器 2、配置通知 3、配置切入点和切面

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txadvice">
    <tx:attributes>
        <tx:method name="trade" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <!-- 切入点 -->
    <aop:pointcut id="pt" expression="execution(* com.jzlf.service.AccountServiceImpl.*(..))"/>
    <!-- 切面 -->
    <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

4、完全注解声明式事务管理

@Configuration
@ComponentScan(basePackages = "com.jzlf")
@EnableTransactionManagement    // 开启事务
public class TxConfig {
    // 创建数据库连接池
    @Bean
    public DruidDataSource getDruidDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///db03");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }
    @Bean
    public JdbcTemplate getJdbcTemplate(DruidDataSource dataSource){
        // 到ioc容器中更具类型找到dataSource
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        // 注入dataSource
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

    @Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DruidDataSource dataSource){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }
}

强校有我,厦工放心🙋‍♂️🙋‍♂️🙋‍♂️

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值