还不上网课😭😭😭,老师们也太敬业了😭😭😭😭😭,他们真的好温柔,我真的要哭死了😭😭😭,能在这么好的学校学习😭😭😭,我是多么的荣幸🤗
文章目录
JdbcTemplate
Spring框架
对JDBC
进行封装,使用JdbcTemplate
方便实现对数据库操作
1、前置需要
1、导包🤤🤤🤤🤤🤤
2、在spring配置文件配置数据库连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="jdbc:mysql:///db03"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
3、配置JdbcTemplate对象,注入DateSource
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
2、CRUD
使用JdbcTemplate
对象
2.1、添加、删除、修改
update()方法
第一个参数
: sql 语句
第二个参数
: 可变参数,设置sql语句值
// 添加
String sql = "insert into t_user value(?,?,?)";
Object args[] = {user.getUserID(),user.getUsername(),user.getUstatus()};
int update = jdbcTemplate.update(sql, args);
// 删除
String sql = "delete from t_user where uid = ?";
Object args[] = {id};
int update = jdbcTemplate.update(sql, args);
// 修改
String sql = "update t_user set username=?,ustatus=? where uid = ?";
Object args[] = {user.getUsername,user.getUstatus};
int update = jdbcTemplate.update(sql, args);
题外话,接口不会被扫描,刚刚👴试了
<context:component-scan base-package="com.jzlf"></context:component-scan>
2.2、查询
2.2.1、返回某个值
queryForObject(String sql,Class<T> requiredType)方法
第一个参数
: sql语句
第二个参数
: 返会类型Class
String sql = "select count(*) from t_user";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
2.2.2、返回对象
queryForObject(String sql,RowMapper<T> rowMapper,Object… args)方法
第一个参数
: sql 语句
第二个参数
: RowMapper 是接口,针对返回不同类型数据,使用这个接口里实现类
完成数据封装
第三个参数
sql 语句值
String sql = "select * from t_user where uid = ?";
User user = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),id);
2.2.3、返回集合
query(String sql,RowMapper<T> rowMapper,Object… args)方法
第一个参数
: sql 语句
第二个参数
: RowMapper 是接口,针对返回不同类型数据,使用这个接口里实现类
完成数据封装
第三个参数
sql 语句值
String sql = "select * from t_user";
List<User> userList = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class));
3、批量操作
batchUpdate(String sql,List<Object[] > batchArgs)
第一个参数
: sql 语句
第二个参数
: List集合,添加多条记录数据
// 批量添加
String sql = "insert into t_user values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs); // List<Object[]> batchArgs
// 批量修改
String sql = "update t_user set username = ?,ustatus = ? where uid = ?";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs); // List<Object[]> batchArgs
// 批量删除
String sql = "delete from t_user where uid = ?";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs); // List<Object[]> batchArgs
题外话:JdbcTemplate自动注入的时候出现空指针异常,是因为不能通过new实例化,只能通过IOC容器获得bean
事务处理
事务添加到Service层
在Spring
进行声明式事务管理,底层使用AOP
原理
Spring 事务管理API
提供了一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
1、注解声明式事务管理
需要
1、创建事务管理器 2、引入名称空间tx 3、开启事务注解 4、添加事务注解
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
@Service
@Transactional
public class AccountServiceImpl {
@Transactional
这个注解可以用在类
上,也可以用在方法
上
- 加到
类
上,这个类的所有方法都会加上事务 - 加到
方法
上,这个方法加上事务
2、声明事务管理参数配置
2.1、propagation
事务传播行为
事务 | 解释 |
---|---|
REQUIRED | 如果add()方法本身有事务,调用update()方法之后,update使用当前add方法里面事务。如果add()方法本身没有事务,调用update方法之后,创建事务 |
REQUIRED_NEW | 使用add方法调用update方法,如果add无论是否有事务,都创建新的事务 |
SUPPORTS | 如果有事务在运行,当前方法就是在这个事务内运行,否则它可以不运行在事务中 |
NOT_SUPPORTES | 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起 |
MANDATORY | 当前的方法必须在事务内部,如果没有正在运行的事务,就抛异常 |
NEVER | 当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常 |
NESTED | 如果事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就开启一个新的事务,并在它自己的事务内运行 |
@Transactional
public void add(){
update();
}
public void add()
@Transactional(propagation = Propagation.REQUIRED)
2.2、ioslation
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED(读未提交) | 有 | 有 | 有 |
READ COMMITTED(读已提交) | 无 | 有 | 有 |
REPEATABLE READ(可重复读) | 无 | 无 | 有 |
SERIALIZABLE(串行化) | 无 | 无 | 无 |
@Transactional(isolation = Isolation.REPEATABLE_READ)
2.3、其他参数
参数 | 作用 |
---|---|
timeout(超时时间) | 事务需要在一定时间内进行提交,不交就回滚,默认是-1,设置以秒为单位 |
readOnly(是否只读) | readOnly默认是false,表示可以CRUD |
rollbackFor(回滚) | 设置出哪些异常进行事务回滚 |
noRollbackFor(不回滚) | 设置出哪些异常不进行事务回滚 |
3、XML声明事务管理
1、创建事务管理器 2、配置通知 3、配置切入点和切面
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txadvice">
<tx:attributes>
<tx:method name="trade" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 切入点 -->
<aop:pointcut id="pt" expression="execution(* com.jzlf.service.AccountServiceImpl.*(..))"/>
<!-- 切面 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>
4、完全注解声明式事务管理
@Configuration
@ComponentScan(basePackages = "com.jzlf")
@EnableTransactionManagement // 开启事务
public class TxConfig {
// 创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///db03");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public JdbcTemplate getJdbcTemplate(DruidDataSource dataSource){
// 到ioc容器中更具类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DruidDataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
强校有我,厦工放心🙋♂️🙋♂️🙋♂️