其他分享
首页 > 其他分享> > Spring03:JdbcTemplate

Spring03:JdbcTemplate

作者:互联网

Spring03 JdbcTemplate

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

1.数据库操作

2.事务操作

事务是数据库操作最基本单元,逻辑上一组操作要么都成功,如果有一个失败所有操作都失败

事务四个特性(ACID)

搭建事务操作环境:

service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource

事务添加到 Service 层:编程式事务管理、声明式事务管理

声明式事务基于注解/基于 xml 配置

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

事务管理 API:提供接口事务管理器,不同的框架提供不同的实现类

2.1 注解声明式

propagation:事务传播行为---一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行

若有A、B方法,A中调用了B

传播属性 描述
REQUIRED 使用方法A时,开启事务A,当调用B时不开启新事务B,而是加入事务A
REQUIRES_NEW 调用B时新建事务B,暂停事务A
SUPPORTS 当前存在事务,则加入该事务;不存在事务,则以非事务方式继续运行
NOT_SUPPORTED 非事务方式运行,如果当前存在事务,则暂停当前事务
MANDATORY 必须运行于事务中,当前存在事务,则加入事务,否则抛出异常
NEVER 非事务方式运行,如果当前存在事务,则抛出异常
NESTED 不存在事务,则新建一个事务;已存在事务,则新建自己的事务

ioslation:事务隔离级别

​ 读问题:

​ 脏读:一个未提交事务读取到另一个未提交事务的数据

​ 不可重复读:一个未提交事务读取到另一提交事务修改数据

​ 虚(幻)读:一个未提交事务读取到另一提交事务添加数据

​ 设置事务隔离级别

级别 脏读 不可重复读 幻读
READ_UNCOMMITED 读未提交
READ_COMMITTED 读已提交
REPEATABLE_READ 可重复读
SERIALIZABLE 串行化

timeout:超时不提交进行回滚

​ 默认值是 -1 ,设置时间以秒单位

readOnly:是否只读:默认值 false,表示可以查询可改;true,只能查询

rollbackFor:设置出现哪些异常进行事务回滚

noRollbackFor:设置出现哪些异常不进行事务回滚

2.2 XML声明式

配置事务管理器、通知、切入点和切面

<!--1 创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--注入数据源-->    
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!--2 配置通知-->    
<tx:advice id="txadvice">
    <!--配置事务参数-->
    <tx:attributes>
        <!--指定哪种规则的方法上面添加事务-->
    	<tx:method name="add" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>
<!--3 配置切入点和切面-->    
<aop:config>
    <!--配置切入点-->
	<aop:pointcut id="pt" expression="execution(* com.fremont.spring.service.UserService.*(..))"/>
    <!--配置切面-->
	<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

2.3 完全注解声明式

创建配置类,使用配置类替代 xml 配置文件

@Configuration//配置类
@ComponentScan(basePackages = "com.fremont")//组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {

    //创建数据库连接池
    @Bean
    public DruidDataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///book");
        dataSource.setUsername("root");
        dataSource.setPassword("fremont");
        return dataSource;
    }

    //创建 JdbcTemplate 对象
    @Bean
    public JdbcTemplate getTemplate(DataSource dataSource) {
        //到 ioc 容器中根据类型找到 dataSource
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //注入 dataSource
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

    //创建事务管理器
    @Bean
    public DataSourceTransactionManager
    getDSTManager(DataSource dataSource) {
        DataSourceTransactionManager transactionManager = new
                DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }

}

3.Spring5新特性

Spring5 框架的代码基于 Java8,运行时兼容 JDK9

3.1 日志

引入 jar 包

创建 log4j2.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,可以看到log4j2内部各种详细输出-->
<configuration status="INFO">
    <!--先定义所有的appender-->
    <appenders>
        <!--输出日志信息到控制台-->
        <console target="SYSTEM_OUT" name="Console">
            <!--控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </console>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <!--root:用于指定项目的根日志,如果没有单独指定Logger,则会使用root作为默认的日志输出-->
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

3.2 @Nullable 注解

@Nullable 注解:表示方法返回可以为空,属性值可以为空,参数值可以为空

3.3 函数式风格

函数式风格创建对象 GenericApplicationContext

//1 创建 GenericApplicationContext 对象
 GenericApplicationContext context = new GenericApplicationContext();
//2 调用 context 的方法对象注册
context.refresh();
context.registerBean("user1",User.class,() -> new User());
//3 获取在 spring 注册的对象
User user = (User)context.getBean("user1");

3.4 整合 JUnit5

JUnit4:

@RunWith(SpringJUnit4ClassRunner.class) //单元测试框架

@ContextConfiguration("classpath:bean1.xml") //加载配置文件

JUnit5:

@ExtendWith(SpringExtension.class)

@ContextConfiguration("classpath:bean1.xml")

复合注解:

@SpringJUnitConfig(locations = "classpath:bean1.xml")

3.5 Webflux

标签:事务,Spring03,参数,JdbcTemplate,sql,new,dataSource
来源: https://www.cnblogs.com/fremontxutheultimate/p/14801525.html