spring的jdbcTemplate,c3p0,事务管理

简介:

1  spring的jdbcTemplate操作: 

(1): 实现crud操作

-->增加,修改,删除,调用模板update方法

-->查询某个值的时候,调用queryForObject方法

----自己实现类封装数据

-->查询对象,调用queryForObject方法

-->查询list集合,调用query方法

2 spring配置连接池

(1)配置c3p0连接池

(2)dao注入jdbcTemplate操作

 3 spring事务管理

(1)事务概念

(2)spring进行事务管理api

   (3)基于xml配置和注解方式实现事务管理

 

 

Spring的jdbcTemplate操作

1 spring框架一站式框架

1)针对javaee三层,每一层都有解决技术

2)在dao层,使用 jdbcTemplate

 

2 spring对不同的持久化层技术都进行封装

 

1jdbcTemplatejdbc进行封装

 

3 jdbcTemplate使用和dbutils使用很相似,都数据库进行crud操作

 

增加

1 导入jdbcTemplate使用的jar

 

2 创建对象,设置数据库信息

3 创建jdbcTemplate对象,设置数据源

4 调用jdbcTemplate对象里面的方法实现操作

 

修改

 

删除

 

查询

1 使用jdbcTemplate实现查询操作

 

2 查询具体实现

第一个 查询返回某一个值

1)第一个参数是sql语句

2)第二个参数 返回类型的class

 

Jdbc实现

 

第二个 查询返回对象

第一个参数是sql语句

第二个参数是 RowMapper,是接口,类似于dbutils里面接口

第三个参数是 可变参数

 

 

第三个 查询返回list集合

  1. sql语句
  2. RowMapper接口,自己写类实现数据封装
  3. 可变参数

 

Spring配置连接池和dao使用jdbcTemplate

1 spring配置c3p0连接池

第一步 导入jar

第二步 创建spring配置文件,配置连接池

1)把代码在配置文件中进行配置

 

2 dao使用jdbcTemplate

1)创建servicedao,配置servicedao对象,在service注入dao对象

2)创建jdbcTemplate对象,把模板对象注入到dao里面

3)在jdbcTemplate对象里面注入dataSource

jdbcTemplate测试代码

JdbcTemplateDemo1: 

public class JdbcTemplateDemo1 {
	
	private static DriverManagerDataSource dataSource;
	private static JdbcTemplate jdbcTemplate;
	static {
		dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql:///test");
		dataSource.setUsername("root");
		dataSource.setPassword("123");
		jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	@Test
	public void add() {
		String sql = "insert user values(?,?)";
		int row = jdbcTemplate.update(sql, "liu", "123");
		System.out.println(row);
	}
	
	@Test
	public void delete() {
		String sql = "delete from user where username = ?";
		int row = jdbcTemplate.update(sql,"he");
		System.out.println(row);
	}
	
	@Test
	public void update() {
		String sql = "update user set username=? where username=?";
		int row = jdbcTemplate.update(sql,"wei","liu");
		System.out.println(row);
	}
	


}

JdbcTemplateDemo2:

public class JdbcTemplateDemo2 {
	
	private static DriverManagerDataSource dataSource;
	private static JdbcTemplate jdbcTemplate;
	static {
		dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql:///test");
		dataSource.setUsername("root");
		dataSource.setPassword("123");
		jdbcTemplate = new JdbcTemplate(dataSource);
		
	}
	/**
	 * 查询数量
	 */
	@Test
	public void query1() {
		String sql = "select count(1) from user";
		int row = jdbcTemplate.queryForObject(sql, Integer.class);
		System.out.println(row);
	}
	/**
	 * 查询单个
	 */
	@Test
	public void query2() {
		String sql = "select * from user where username=?";
		User user =  jdbcTemplate.queryForObject(sql, new MyRowMapper(), "Ling");
		System.out.println(user);
	}
	
	/**
	 * 查询集合
	 */
	@Test
	public void query3() {
		String sql = "select * from user";
		List<User> lists=  jdbcTemplate.query(sql, new MyRowMapper());
		System.out.println(lists);
	}
	
	/**
	 * 原生实现jdbc的查询
	 */
	@Test
	public void testJDBC() {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		//加载驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			connection = DriverManager.getConnection("jdbc:mysql:///test","root","123");
			//编写sql语句
			String sql = "select * from user where username=?";
			//预编译sql
			preparedStatement = connection.prepareStatement(sql);
			//设置参数值
			preparedStatement.setString(1, "Ling");
			//执行sql
			resultSet = preparedStatement.executeQuery();
			//遍历结果集
			while(resultSet.next()) {
				//得到返回结果集
				String username = resultSet.getString("username");
				String password = resultSet.getString("password");
				User user = new User();
				user.setUsername(username);
				user.setPassword(password);
				System.out.println(user);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			try {
				resultSet.close();
				preparedStatement.close();
				connection.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	


}


class MyRowMapper implements RowMapper<User> {

	@Override
	public User mapRow(ResultSet rs, int rowNum) throws SQLException {
		String username = rs.getString("username");
		String password = rs.getString("password");
		
		User user = new User();
		user.setUsername(username);
		user.setPassword(password);
		return user;
	}
	
}

 

Spring  c3p0配置连接池:

配置文件:

<!-- 配置c3p0连接池 -->
	<!-- javax.sql.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:///test"></property>
		<property name="user" value="root"></property>
		<property name="password" value="123"></property>
	</bean>

 

Spring  事务管理:

配置文件详细代码:

<?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/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">
	
	<!-- 以上是所有的约束配置 -->
	
	<!-- 配置注解包 -->
	<context:component-scan base-package="cn.tx.*"></context:component-scan>
	
	<!-- 配置c3p0连接池 -->
	<!-- javax.sql.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:///test"></property>
		<property name="user" value="root"></property>
		<property name="password" value="123"></property>
	</bean>
	
	<!-- 创建jdbcTemplate对象,注入dataSource -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 实例化UserService对象  用于测试 -->
	<bean id="useService" class="cn.tx.service.UserService"></bean>
	
	<bean id="userDao" class="cn.tx.dao.UserDao"></bean>
	
	<!-- 第一步配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 第二步 开启事务注解 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
	

</beans>

项目结果目录:

User:

public class User {
	private String usrname;
	private String password;
	private String salary;
	public String getUsrname() {
		return usrname;
	}
	public void setUsrname(String usrname) {
		this.usrname = usrname;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSalary() {
		return salary;
	}
	public void setSalary(String salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "User [usrname=" + usrname + ", password=" + password + ", salary=" + salary + "]";
	}
	
	
	
}

UserDao:

package cn.tx.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class UserDao {
	
	@Autowired
	private JdbcTemplate jdbcTemplate;
	/**
	 * 加钱
	 */
	public void addSalary() {
		String sql = "update account set salary = salary+? where username=?";
		jdbcTemplate.update(sql, "1000","小王");
	}
	
	public void decressSalary() {
		String sql = "update account set salary = salary+? where username=?";
		jdbcTemplate.update(sql, "-1000","小五");
	}
}

UserService:

package cn.tx.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import cn.tx.dao.UserDao;

@Transactional
public class UserService {
	
	@Autowired
	private UserDao userDao;
	/**
	 * 转账的业务方法
	 */
	public void tranferAccount() {
		//多钱的方法
		userDao.addSalary();
		//当方法业务中,出现异常的时候  会导致转账业务出现异常
		int sum  = 3 / 0;
		//少钱的方法
		userDao.decressSalary();
	}
}

test:

package cn.tx.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.tx.service.UserService;

public class TestTx {
	
	@Test
	public void testUserService() {
		ApplicationContext context = new ClassPathXmlApplicationContext("all_schema_application.xml");
	 	UserService useService =  (UserService) context.getBean("useService");
	 	useService.tranferAccount();
	}
}

github:

https://github.com/2402zmybie/spring_jdbctemplate
https://github.com/2402zmybie/spring_tx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值