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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章