栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring:JdbcTemplate、声明式事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring:JdbcTemplate、声明式事务

目录

JdbcTemplate

常用API

示例代码

声明式事务

声明式事务与编程式事务的区别

基于xml实现

抽象类JdbcDaoSupport

基于注解实现


JdbcTemplate

一个简单、轻薄的Jdbc的封装工具。

常用API
  • JdbcTemplate jdbcTemplate= new JdbcTemplate(DataSource dataSource);    构造方法
  • update("sql",Object args...)    增删改操作
  • query("sql',new BeanPropertyRowMapper<>(),Object args...)    查询所有(返回的是list)
  • queryForObject("sql",BeanPropertyRowMapper<>(),Object arg);     查询单个数据(可以将一组数据封装成对象,也可以使用聚合函数查询)

示例代码

配置文件



    
    
        
        
        
        
    
    
    
        
    

测试代码

@Test
    public void t9(){
//        获取容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-jdbc.xml");
//        从容器中获取Bean对象
        JdbcTemplate jdbctemplate = context.getBean("jdbctemplate", JdbcTemplate.class);
//        jdbctemplate的使用
//        增加数据
        jdbctemplate.update("insert into user5 values (?,?)","Bob",789);
//        删除数据
        jdbctemplate.update("delete from user5 where name=?","tom");
//        修改数据(更新数据)
        jdbctemplate.update("update user5 set name=?,money=? where name=?","tony",2000,"tony");
//        查询所有
        List query = jdbctemplate.query("select * from user5", new BeanPropertyRowMapper<>(user.class));
        System.out.println(query);
//        查询单个数据(方法一)
        List bob = jdbctemplate.query("select * from user5 where name=?", new BeanPropertyRowMapper<>(user.class), "Bob");
        System.out.println(bob.get(0));
//        查询单个数据(方法二)
        user bob1 = jdbctemplate.queryForObject("select * from user5 where name=?", new BeanPropertyRowMapper<>(user.class), "Bob");
        System.out.println(bob1);
//        使用聚合函数
        Long integer = jdbctemplate.queryForObject("select count(*) from user5",Long.class);
        System.out.println(integer);

    }

声明式事务

声明式事务与编程式事务的区别

编程式事务:代码冗余严重,例如每个方法都需要做同样的增强,那需要对每个方法编程

声明式事务:抽取共同内容,例如每个方法都需要做同样的增强,只需要将增强的代码写一次即可,实现了系统层和业务逻辑层的解耦

基于xml实现

步骤:

  • 配置事务管理器
  • 配置事务通知
  • 配置AOP





    
        
        
        
        
    

    
        
    

    
        
    

    
        
    
    
    

    
        
    
    

    

        
            
        
    

    
        

        
    
    

注意:

配置事务的属性

需要修改的方法:

需要查询的方法:

属性:

  • read-only:是否只读
  • isolation:指定事务的隔离级别,默认使用数据库的默认隔离级别
  • propagation:事务的传播行为
    • REQUIRED(默认值):如果当前没有事务,就创建一个新的事务,如果已经存在一个事务就加到这个事务中
    • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
  • timeout:设置超时时间
  • rollback-for:用于指定一个异常,当执行时产生该异常,事务回滚;没有默认值,任何异常都回滚
  • no-rollback-for:用于指定一个异常,当执行时产生该异常,事务不回滚;没有默认值,任何异常都回滚

抽象类JdbcDaoSupport

持久层实现类基础该抽象类,直接调用getJdbcTemplate方法,来获取JdbcTemplate对象

节省了以下代码

 private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

注意:该方法只能使用在基于xml实现的声明式事务中

示例代码

public class daoimpl extends JdbcDaoSupport implements Idao {

    @Override
    public void update(user user) {
       getJdbcTemplate().update("update user5 set name=?,money=? where name=?",user.getName(),user.getMoney(),user.getName());

    }

    @Override
    public user getByName(String name) {
        user user = getJdbcTemplate().queryForObject("select * from user5 where name=?", new BeanPropertyRowMapper<>(user.class), name);
        return user;
    }
}

配置文件:给其注入数据源即可


       

基于注解实现

注解名称

含义
@Transactional配置该类对事务的通知
@EnableTransactionManagement

 开启事务注解(加在配置类上)

应用场景:纯注解配置时使用

步骤

  • 配置事务管理器
  • 开启事务注解
  • 对需要使用事务的类上 加上该注解

示例代码

配置文件





    

    
        
        
        
        
    

    
        
    


    
        
    

    

类上使用注解

@Transactional(readonly = false ,propagation = Propagation.REQUIRED)
@Component("service")
public class serviceeimpl implements Iservice {

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397051.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号