您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Spring03:JdbcTemplate

bubuko 2022/1/25 19:05:11 java 字数 11522 阅读 764 来源 http://www.bubuko.com/infolist-5-1.html

Spring03 JdbcTemplate Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 1.数据库操作 引入相关 jar 包 配置文件配置数据库连接池 <bean id="dataSource" class="com.alibaba.druid.p ...

Spring03 JdbcTemplate

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

1.数据库操作

  • 引入相关 jar 包

  • 配置文件配置数据库连接池

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="jdbc:mysql:///book"/>
        <property name="username" value="fremont"/>
        <property name="password" value="root"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    </bean>
    
  • 配置 JdbcTemplate 对象,注入 DataSource

    <!-- JdbcTemplate 对象 --> 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     	<!--注入 dataSource-->
     	<property name="dataSource" ref="dataSource"></property>
    </bean>
    
  • 在 dao 注入 jdbcTemplate 对象

    @Autowired

    private JdbcTemplate jdbcTemplate;

  • 操作数据库:调用 JdbcTemplate 对象的方法

    /*update---增删改
    第一个参数:sql 语句
    第二个参数:可变参数,设置 sql 语句值
    */
    Integer update(String sql,Object... args);
    
    /*queryForObject---返回一个结果:某个字段或数值
    第一个参数:sql 语句
    第二个参数:返回类型 Class
    */
    T queryForObject(String sql,Class<T> requiredType);
    
    /*queryForObject---返回一个结果:封装一行,实体类
    第一个参数:sql 语句
    第二个参数:RowMapper接口,完成数据封装 new BeanPropertyRowMapper<T>(T.class)
    第三个参数:sql 语句值
    */
    T queryForObject(String sql,RowMapper<T> rowMapper,Object... args);
    
    /*query---返回集合
    第一个参数:sql 语句
    第二个参数:RowMapper接口,完成数据封装 new BeanPropertyRowMapper<T>(T.class)
    第三个参数:sql 语句值
    */
    List<T> query(String sql,RowMapper<T> rowMapper,Object... args);
    
    //batch---批量操作:操作表里面多条记录
    /*batchUpdate
    第一个参数:sql 语句
    第二个参数:List 参数数组的集合,处理多条记录数据
    */
    int[] batchUpdate(String sql,List<Object[]> batchArgs);
    

2.事务操作

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

事务四个特性(ACID)

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

搭建事务操作环境:

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

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

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

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

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

2.1 注解声明式

  • spring 配置文件配置事务管理器

    <!--创建事务管理器--> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     	<!--注入数据源-->
     	<property name="dataSource" ref="dataSource"></property>
    </bean>
    
  • 开启事务注解

    <!--引入名称空间 tx-->
    <beans    
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="...
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    	<!--开启事务注解-->
        <tx:annotation-driven transaction-manager="transactionManager">
        </tx:annotation-driven>    
    </beans>
    
  • 添加事务注解

    @Transactional:添加类上面,则类里面所有方法都添加事务

  • 参数配置:

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 日志

  • Spring 5.0 框架自带通用的日志封装
  • Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j2
  • Spring5 框架整合 Log4j2

引入 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

原文:https://www.cnblogs.com/fremontxutheultimate/p/14801525.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶