Spring笔记(3)

Spring笔记(3)

一、JDBC Template基本使用

1.开发步骤

1.1直接使用template

  1. 导入spring-jdbc和spring-tx坐标

    <!--    JDBC-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.0.3.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>5.0.3.RELEASE</version>
        </dependency>
        <!--  druid-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.0.9</version>
        </dependency>
        <!--      c3po-->
        <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
        </dependency>
    <!--    mysql -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.23</version>
        </dependency>
      </dependencies>
    
  2. 创建数据库表和实体

  3. 创建JDBCTemplate对象

  4. 执行数据库操作

    /**
     * 测试JDBCTemplate开发步骤
     */
    @Test
    public void jdbcTest() throws PropertyVetoException {
        //创建数据源 c3p0
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/account");
        dataSource.setUser("root");
        dataSource.setPassword("gyb20010204");
    
        //创建template
        JdbcTemplate template = new JdbcTemplate();
        //设置数据源
        template.setDataSource(dataSource);
        //执行操作
        int rows = template.update("insert into account values(?,?)", "tom", 200);
        System.out.println(rows);
    }
    

1.2使用Spring容器注入template

  1. 注入bean对象

  2. 依赖注入数据源

    <!--    注入数据源对象-->
        <bean id ="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/account"/>
            <property name="user" value="root"/>
            <property name="password" value="gyb20010204"/>
        </bean>
    <!--    注入jdbc模板对象-->
        <bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
    <!--        依赖注入数据源-->
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
  3. 测试

    @Test
    public void jdbcSpringTest(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        JdbcTemplate template = app.getBean(JdbcTemplate.class);
        int rows = template.update("insert into account values(?,?)", "jack", 300);
        System.out.println(rows);
    }
    

2.CRUD操作

增,删,改:update

int rows = template.update("insert into account values(?,?)", "jack", 300);

查:query(结果为list集合)

	List<Account> accountList = template.query(sql, new BeanPropertyRowMapper<Account>(Account.class));

queryForObject(结果为 对象)

	Account account = template.queryForObject(sql, new BeanPropertyRowMapper<Account>(Account.class));

queryForObject(结果为数字)

	Integer integer = template.queryForObject("select count(*) from account", Integer.class);

二、Spring的事务控制

1.编程事务控制相关对象

管理+定义 = 状态

1.1 PlatformTransactionManager 事务平台管理器 接口(需要配置)

实现根据不同的dao层技术来实现

​ ①、TransactionStatus getTransaction(TransactionDefinition definition) ,事务管理器 通过TransactionDefinition,获得“事务状 态”,从而管理事务。

​ ②、void commit(TransactionStatus status) 根据状态提交

​ ③、void rollback(TransactionStatus status) 根据状态回滚

1.2.TransactionDefinition 事务定义 接口(需要配合)

  • ​ 设置事务隔离级别
  • ​ 设置事务传播行为

​ Spring中的7个事务传播行为:

—- 如果A调用B 假设A.., 则….
PROPAGATION_REQUIRED 支持当前事务,假设当前没有事务。就新建一个事务
PROPAGATION_SUPPORTS 支持当前事务,假设当前没有事务,就以非事务方式运行
PROPAGATION_MANDATORY 支持当前事务,假设当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW 新建事务,假设当前存在事务。把当前事务挂起
PROPAGATION_NOT_SUPPORTED 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起
PROPAGATION_NEVER 以非事务方式运行,假设当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
超时时间
是否只读

1.3.TransactionStatus 事务状态(被动 不需要配置)

名称 说明
void flush() 刷新事务
boolean hasSavepoint() 获取是否存在保存点
boolean isCompleted() 获取事务是否完成
boolean isNewTransaction() 获取是否是新事务
boolean isRollbackOnly() 获取是否回滚
void setRollbackOnly() 设置事务回滚

2.基于XML的声明式事务控制

2.1作用

业务代码事务控制通过 事务配置 的方式进行松耦合

2.3方法

​ 采用AOP的思想:切点(业务)

通知(事务控制)

​ 将业务进行增强,从而达成事务配置,并且松耦合

2.4步骤

  1. 创建目标对象,编写切入点

  2. 在applicationContext中配置[平台事务管理器](#1.1 PlatformTransactionManager 事务平台管理器 接口(需要配置)),其中配置数据源(上一章中的平台事务管理器)

    <!--    平台事务管理器-->
        <bean id="transactionManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
  3. 在applicationContext中加入tx命名空间

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
  4. 编写事务的增强,将平台事务管理器配入(上一章中的[事务定义](#1.2.TransactionDefinition 事务定义 接口(需要配合)))

    <!--    通知,事务的增强-->
        <tx:advice id="txAdvice" transaction-manager="transactionManger">
    <!--        配置事物的属性信息-->
            <tx:attributes>
                <tx:method name="trans" isolation="DEFAULT"/>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
    
  5. 编写AOP配置(配入切点(事务)配入增强(事务增强))

    <!--    配置织入-->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* Service.Impl.*.*(..))"></aop:advisor>
    </aop:config>

3.基于注解的声明式事务控制

注意:

  1. 使用@Transactional在需要进行事务控制的或者方法上修饰,注解也可配入事务定义信息
  2. 注解使用在类上,那么该类下的所有方法都是用同一套注解参数配置
  3. xml配置文件中要开启事务注解驱动注解扫描
<tx:annotation-driven/>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115199.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dsp调音软件通用吗_交叉火力dsp调音数据下载

    dsp调音软件通用吗_交叉火力dsp调音数据下载18。为什么在CCS下编译工具工作不正常?在CCS下有部分客户会碰到编译工具工作不正常,常见错误为:1)autoexec.bat的路径“outofmemory”。修改autoexec.bat,清除无用的PATH路径。2)编译的输出文件(OUT文件)写保护,无法覆盖。删除或修改输出文件的属性。3)Windows有问题。重新安装windows。4)Windows下有程序对CCS有影响。建议用一…

    2025年9月27日
    9
  • 公网IP、私网IP、动态IP、静态IP

    公网IP、私网IP、动态IP、静态IPIP地址这个词我们经常听到,它具体是个什么东西这里就不谈了,建议去看一下本系列文章的《IP地址和MAC地址简介》一文。本文主要来区分一下公网IP、私网IP、动态IP、静态IP这四个概念。先说公网IP和私网IP。我们都听过IP地址,但对公网IP和私网IP可能就比较挠头了。把IP的问题放在一边,我们先说一下什么是公网,什么是私网。公网又名广域网、外网,指的就是我们平时说的互联网。私网又名内网、局域网,指的是路由器或交换机下创建的局部互联网络。网络的功能说的简单些就是使多台计算机实现互联,可以互相传输数据。广

    2022年6月7日
    31
  • Matlab fitrsvm自带支持向量回归[通俗易懂]

    Matlab fitrsvm自带支持向量回归[通俗易懂]简介fitrsvm在中低维预测变量数据集上训练或交叉验证支持向量机(SVM)回归模型。fitrsvm支持使用内核函数映射预测变量数据,并支持通过二次编程实现目标函数最小化。要在高维数据集(即包含许多预测变量的数据集)上训练线性SVM回归模型,请改用fitrlinear。用法Mdl=fitrsvm(Tbl,ResponseVarName)返回使用表Tbl中的自变量值和表中对应变量名…

    2022年5月26日
    41
  • 精通Python爬虫框架Scrapy_php爬虫框架哪个好用

    精通Python爬虫框架Scrapy_php爬虫框架哪个好用文章目录一、Scrapy框架原理1、Scrapy特点2、Scrapy安装3、Scrapy架构图4、Scrapy五大组件5、Scrapy工作流程二、Scrapy创建项目三、Scrapy配置文件详解1、项目完成步骤2.3.2爬虫文件:baidu.py详解3、settings.py详解4、run.py文件详解5、items.py详解四、案例1、抓取一页数据1.1创建项目和爬虫文件1.2items.py文件1.3写爬虫:guazi.py1.4管道:pipelines.py文件1.5全局配置:setti

    2022年10月21日
    4
  • python开发mbus程序_关于MBUS MSG指令

    python开发mbus程序_关于MBUS MSG指令在MBUSMSG指令里有一个错误位,我看了手册上说1-8的低位,其中0是无错误,那Q0.0有输出到底是对还是不对,还有Q0.2是不用的意思,它是一直为1的吗?我现在程序测试过程中,发现Q0.1和Q0.2都有输出,不知道是什么错误啊图片说明:1,佳答案1、有关MBUS_MSG指令错误代码:Error错误代码:只有在Done位为1时,错误代码才有效0=无错误1=响应校验错误2…

    2022年10月16日
    3
  • 用c语言编写2048小游戏_2048小游戏c语言课程设计

    用c语言编写2048小游戏_2048小游戏c语言课程设计C语言实现简单的控制台2048小游戏。

    2022年8月1日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号