4、数据库操作

本文详细介绍了Spring框架下的JdbcTemplate使用方法及其实现CRUD操作的具体步骤,并通过示例代码展示了如何配置数据源、注入JdbcTemplate以及编写测试类。此外,还深入探讨了Spring事务管理的概念、实现方式及其在实际项目中的应用。
摘要由CSDN通过智能技术生成

该栏目会系统的介绍Spring的知识体系,共分为基础部分、源代码和综合实例等模块,有兴趣的小伙伴可以关注下,如有疑问可以多多评论



JdbcTemplate框架

1、概述

  • :小型的轻量级持久化层框架

2、实现CRUD

  • 流程
Created with Raphaël 2.2.0 开始 导入相关Jar包 配置文件配置信息数据源对象,加载驱动 设置数据库模版 调用jdbcTemplate对象提供的相关方法 编写测试类 结束
  • 用户操作类
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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值