目录
(3)配置JdbcTemplate对象,注入dataSource
(4)创建service和dao类,在dao中注入JdbcTemplate对象,开启注解扫描
1.使用JdbcTemplate的准备工作
(1)引入相关的jar包
(2)在xml文件中配置数据库连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/user_db"></property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
(3)配置JdbcTemplate对象,注入dataSource
<!-- JdbcTemplate 对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
(4)创建service和dao类,在dao中注入JdbcTemplate对象,开启注解扫描
<!--开启组件扫描-->
<context:component-scan base-package="com.hzj"></context:component-scan>
@Repository
public class BookDaoImpl implements BookDao {
//注入 JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
2.使用JdbcTemplate操作数据库
(1)创建数据库实体类
public class Book {
private String userId;
private String username;
private String ustatus;
}
(2)使用update方法进行数据库的增删改操作
@Repository
public class BookDaoImpl implements BookDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//添加操作
@Override
public void add(Book book) {
String sql="insert into t_book value (?,?,?)";
int update = jdbcTemplate.update(sql, book.getUserId(), book.getUsername(), book.getUstatus());
System.out.println(update);
}
//修改操作
@Override
public void updateBook(Book book) {
String sql="update t_book set username=?,ustatus=? where userId=?";
Object[] args={book.getUsername(),book.getUstatus(),book.getUserId()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}
//删除操作
@Override
public void delete(String id) {
String sql="delete from t_book where userId=?";
int update = jdbcTemplate.update(sql, id);
System.out.println(update);
}
}
(3)查询返回单个值
@Override
public int selectCount() {
String sql="select count(*) from t_book";
Integer count= jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
(4)查询返回对象
@Override
public Book queryOne(String id) {
String sql="select * from t_book where userId= ? ";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
}
(5)查询返回集合
@Override
public List<Book> queryAll() {
String sql="select * from t_book";
List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return bookList;
}
3.JdbcTemplate批量操作数据库
(1)批量添加
@Override
public void batchAddBook(List<Object[]> batchArgs) {
String sql="insert into t_book values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
(2)批量修改
public void batchUpdateBook(List<Object[]> batchArgs) {
String sql="update t_book set username=?,ustatus=? where userId=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
(3)批量删除
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
String sql="delete from t_book where userId=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
测试方法
//批量添加
List<Object[]> batchArgs=new ArrayList<>();
Object[] o1={"3","java","a"};
Object[] o2={"4","d++","b"};
Object[] o3={"5","mysql","c"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchAddBook(batchArgs);*/
//批量修改
List<Object[]> batchArgs=new ArrayList<>();
Object[] o1={"java3","a","3"};
Object[] o2={"c++","b","4"};
Object[] o3={"mysql_hzj","c","5"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchUpdate(batchArgs);
//批量删除
List<Object[]> batchArgs=new ArrayList<>();
Object[] o1={"3"};
Object[] o2={"4"};
batchArgs.add(o1);
batchArgs.add(o2);
bookService.batchDeleteBook(batchArgs);
3.事务操作
事务是数据库操作的最基本单元,属于逻辑上的一组操作,要么都成功,如果有一个环节出现异常,则该事务的所有操作都失败
3.1事务的四个特性(ACID)
- 原子性:事务中的操作要么都做,要么都不做
- 一致性:事务从数据库的一个一致性状态转变到另一个一致性状态
- 隔离性:一个事务的执行不能被其他事务干扰
- 持久性:也称永久性,指一个事务一旦提交,它对数据库中的数据改变就应该是永久性的
3.2Spring事务管理
-
编程式事务管理
- 开启事务,将事务提交改为手动
- 进行业务操作(对数据库的操作)
- 没有发生异常,提交事务
- 出现异常,事务回滚
-
声明式事务管理
第一种:基于注解方式的事务管理
(1)在Spring配置文件中配置事务管理器
<!--创建事务管理器-->
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
(2)在Spring配置文件,引入tx名称空间和开启事务注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="TransactionManager"></tx:annotation-driven>
(3)在service类上面(或者service类里面的某个方法上面)添加事务注解@Transactional
@Service
@Transactional(readOnly = false,timeout = -1,propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
//添加事务注解
//这个注解添加到类上,这个类所有方法都添加事务
//把这个注解添加到方法上,则单独为这个方法添加事务
public class UserService {
参数说明:
(1)propagation:事务传播行为
(2)Ioslation:事务隔离级别
隔离性即多事务操作之间不会产生影响,不考虑隔离性会出现以下三个问题
- 脏读:一个未提交的事务读取到另一个未提交事务的数据
- 不可重复读:一个未提交的事务读取到另一个刚提交事务的修改数据
- 幻读(虚读):一个未提交事务读取到另一个提交事务的添加数据
(3)timeout:超时时间
事务要在一定的时间内进行提交,超时不提交进行事务回滚
默认值为-1,即没有超时限制,设置时间后以秒为单位
(4)readOnly:是否只读
readOnly默认值为false,表示可以进行增删改查操作
当设置readOnly的为true时,只能进行查询操作
(5)rollbackFor:设置哪些异常进行事务回滚
(6)noRollbackFor:设置哪些异常不进行事务回滚
第二种基于xml配置文件方式的事务管理
在Spring配置文件中进行配置
<!--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="accountMoney" propagation="REQUIRED"/>
<!--<tx:method name="account*"/>-->
</tx:attributes>
</tx:advice>
<!--3 配置切入点和切面-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(*
com.atguigu.spring5.service.UserService.*(..))"/>
<!--配置切面-->
<aop:advisor
第三种完全注解声明式事务管理
创建配置类,用于替代xml文件
@Configuration //配置类
@ComponentScan(basePackages = "com.hzj") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///user_db");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//创建JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}