该栏目会系统的介绍Spring的知识体系,共分为基础部分、源代码和综合实例等模块,有兴趣的小伙伴可以关注下,如有疑问可以多多评论
JdbcTemplate框架
1、概述
- :小型的轻量级持久化层框架
2、实现CRUD
流程
用户操作类
public class UserDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void add() {
// 定义模版
String innertSql = "INSERT INTO users VALUE(?,?,?,?)";
// 调用jdbcTemplate更新功能
int row = jdbcTemplate.update(innertSql, "1009", "nearJC", 18, "深圳");
System.out.println(row);
}
}
用户服务类
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(){
userDao.add();
}
}
测试类
public class TestDemo {
@Test
public void addTest(){
ApplicationContext context =
new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
userService.add();
}
}
配置文件
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置dataSource对象 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"></property>
<property name="user" value="root"></property>
<property name="password" value="123123"></property>
</bean>
<!-- 配置jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入dataSource对象 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置userDao对象 -->
<bean id="userDao" class="cn.itcast.dao.UserDao">
<!-- 注入jdbcTemplate对象 -->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!-- 配置userService对象 -->
<bean id="userService" class="cn.itcast.service.UserService">
<!-- 注入userDao对象 -->
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
事务
1、简介
概述
:是一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作,这样可以防止出现脏数据,防止数据库数据出现问题特性
:原子性、一致性、隔离性、持久性
2、事务管理器
-
概述
:用来管理事务 -
实现方式
类型 方式 JDBC 通过Connection对象进行事务管理,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中 Hibernate 通过Transaction进行事务管理,处理方法与JDBC中类似 Spring 使用TransactionMananger(事务管理器)进行管理,可以通过Spring的注入来完成此功能 -
传播行为
:当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行传播行为 含义 REQUIRED 表示当前方法必须运行在事务中。如果当前事务存在 ,方法将会在该事务中运行。否则,会开启一个新的事务 REQUIRED_NEW 表示当前方法必须运行在它自己的事务中。它会启动一个新的事务。如果当前事务存在,在该方法执行期间,当前事务会被挂起 SUPPORTS 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行 NOT_SUPPORTED 表示该方法不需要运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起 MANDATORY 表示该方法 必须
在事务中运行,如果当前事务不存在,则会抛出一个异常NEVER 表示当前方法 不应该
在事务上下文中运行,如果当前事务不存在,则会抛出一个异常NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按REQUIRED属性执行 -
无隔离级别产生的一些问题
- 脏读:一个事务读取到了另一个事务未提交的数据操作结果
- 不可重复读:一个事务对同一行数据重复读取两次,但是却得到了不同的结果
- 幻读:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数
-
隔离级别
脏读 不可重复读 幻读 未提交读取(Read Uncommitted) 有 有 有 已提交读取(Read Committed) 无 有 有 可重复读取(Repeatable Read) 无 无 有 序列化(Serializable) 无 无 无
3、事务管理机制
编程式事务管理
声明式事务管理
:包括配置文件方式、注解方式
4、案例(注解方式)
数据操作层
public class OrderDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 数据库少钱
*/
public void lessMoney() {
String sql = "UPDATE account SET salary=salary-? WHERE username=?";
jdbcTemplate.update(sql, 1000, "小王");
}
/**
* 数据库多钱
*/
public void moreMoney() {
String sql = "UPDATE account SET salary=salary+? WHERE username=?";
jdbcTemplate.update(sql, 1000, "小马");
}
}
业务层
@Transactional
public class OrderService {
private OrderDao orderDao;
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
/**
* 业务逻辑层,转帐
*/
public void accountMoney(){
orderDao.lessMoney();
orderDao.moreMoney();
}
}
测试类
public class TestDemo01 {
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
OrderService service = (OrderService)context.getBean("orderService");
service.accountMoney();
}
}
配置文件
<?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:aop="http://www.springframework.org/schema/aop"
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/beans/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb1"></property>
<property name="user" value="root"></property>
<property name="password" value="123123"></property>
</bean>
<!-- ------------------------------使用注解的方式配置事务----------------------------------------- -->
<!-- 第一步:配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入DataSource对象 -->
<property name="dataSource" class="dataSource"></property>
</bean>
<!-- 第二步:开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 第三步:在事务方法所在类中加入注解 -->
<!-- ------------------------------------------------------------------------->
<!-- 配置对象 -->
<bean id="orderDao" class="cn.itcast.dao.OrderDao">
<!-- 注入JdbcTemplate对象 -->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="orderService" class="cn.itcast.service.OrderService">
<!-- 注入OrderDao对象 -->
<property name="orderDao" ref="orderDao"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入DataSource对象 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>