Spring03:JdbcTemplate
作者:互联网
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,sql,new,dataSource 来源: https://www.cnblogs.com/fremontxutheultimate/p/14801525.html