JavaWeb学习之Spring框架(二)

spring整合JDBC

spring提供了很多模板整合Dao技术

spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术

   JDBCTemplate----JDBC模板技术

 与DButils中的QueryRunner非常相似

package com.jdbcdemo;

import java.beans.PropertyVetoException;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCDemo {
	@Test
       public  void  method() throws PropertyVetoException{
    	   //创建连接池对象
    	   ComboPooledDataSource  dataSource =new ComboPooledDataSource();
    	   dataSource.setDriverClass("com.mysql.jdbc.Driver");
    	   dataSource.setJdbcUrl("jdbc:mysql:///spring_demo?characterEncoding=utf-8");
    	   dataSource.setUser("root");
    	   dataSource.setPassword("123456");
    	   //创建JDBC模板对象
    	   JdbcTemplate  jdbcTemplate=new JdbcTemplate();
    	   jdbcTemplate.setDataSource(dataSource);
    	   //书写sql语句并执行
    	   String  sql="insert  into  s_user(name)  values('李四')";
    	   jdbcTemplate.update(sql);
       }
}

步骤:导包:4个基础包+2个日志包+spring-test、spring-aop、junit4类库+c3p0连接池、spring-tx事务

           准备数据库

            书写Dao层

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.domain.User;

public class UserDao extends JdbcDaoSupport {
	// private JdbcTemplate jdbcTemplate;
	//
	// public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
	// this.jdbcTemplate = jdbcTemplate;
	// }

	public void save(User user) {
		String sql = "insert  into   s_user(name) values(?)";
		getJdbcTemplate().update(sql, user.getName());
	}

	public void update(User user) {
		String sql = "update  s_user  set  name=? where id=?";
		getJdbcTemplate().update(sql, user.getName(), user.getId());
	}

	public void delete(Integer id) {
		String sql = "delete  from s_user  where id=?";
		getJdbcTemplate().update(sql, id);
	}

	// 单个对象查询
	public User findById(Integer id) {
		String sql = "select  * from  s_user where id=?";
		return getJdbcTemplate().queryForObject(sql, new RowMapper<User>() {

			public User mapRow(ResultSet rs, int arg1) throws SQLException {
				// TODO Auto-generated method stub
				User user = new User();
				user.setId(rs.getInt("id"));
				user.setName(rs.getString("name"));
				return user;
			}
		}, id);
	}

	// 查询单个值
	public int getCount() {
		String sql = "select  count(*) from s_user";
		return getJdbcTemplate().queryForObject(sql, Integer.class);
	}

	// 查询List<User>
	public List<User> getAll() {
		String sql = "select  *  from  s_user";
		return getJdbcTemplate().query(sql, new RowMapper<User>() {

			public User mapRow(ResultSet rs, int arg1) throws SQLException {
				// TODO Auto-generated method stub
				User user = new User();
				user.setId(rs.getInt("id"));
				user.setName(rs.getString("name"));
				return user;
			}
		});
	}
}

  spring配置

        

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
   <!-- datasource -->
   <context:property-placeholder location="classpath:db.properties"/>
   <bean name="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"></property>
   </bean>
   <bean  name="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass"  value="${jdbc.driverClass}"></property>
      <property name="jdbcUrl"  value="${jdbc.jdbcUrl}"></property>
      <property name="user"  value="${jdbc.user}"></property>
      <property name="password"  value="${jdbc.password}"></property>
   </bean>
   <!-- jdbcTemplate -->
  <!--  <bean  name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource" ref="dataSource"></property>
  </bean>-->
  <!-- UserDao -->
  <bean  name="userDao"  class="com.dao.UserDao">
     <property name="dataSource"  ref="dataSource"></property>
  </bean>
    <!-- AccountDao -->
  <bean name="accountDao"  class="com.dao.AccountDao">
       <property name="dataSource"  ref="dataSource"></property>
  </bean>
  <bean name="accountService"  class="com.service.AccountService">
       <property name="accountDao"  ref="accountDao"></property>
  </bean>
  <!-- 注解配置事务 -->
  <tx:annotation-driven/>
  <!-- XML配置事务 -->
  <!--  <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
          <tx:method name="transfer"  isolation="REPEATABLE_READ"  propagation="REQUIRED"  read-only="false"/>
      </tx:attributes>
  </tx:advice>
  <aop:config>
       <aop:pointcut expression="execution(* com.service.*Service.*(..))" id="txpc"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txpc"/>
  </aop:config>-->
</beans>

        测试

package com.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.dao.UserDao;
import com.domain.User;
import com.service.AccountService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo {
	// 引用注入
	@Autowired // 自动装配
	@Qualifier("userDao") // 使用Qualifier注解告诉spring容器自动装配哪个名称的对象
	private UserDao userDao;
	@Autowired // 自动装配
	@Qualifier("accountService")
	private AccountService accountService;

	@Test
	public void method1() {
		User user = new User();
		user.setName("qwerty");
		userDao.save(user);
	}

	@Test
	public void method2() {
		accountService.transfer(1, 2, 2000d);
	}
}

进阶内容

JDBCDaoSupport

 

  读取外部的properties配置

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///spring_demo?characterEncoding=utf-8
jdbc.user=root
jdbc.password=123456

spring中的aop事务

  事务:事务特性:acid

                  事务并发问题:脏读、不可重复读、幻读

                  事务的隔离级别:1 读未提交  2 读已提交  4 可重复读  8  串行化

      spring封装了事务管理代码

             事务操作:打开事务、提交事务、回滚事务

             事务操作对象:因为在不同平台,操作事务的代码各不相同,spring提供了一个接口

             PlatformTransactionManager接口:DataSourceTransactionManager

                                                                           HibernateTransitionmanager

                              注:在spring中玩事务管理,最为核心的对象就是TransactionManager

             spring管理事务的属性介绍:事务的隔离级别:1 读未提交  2 读已提交  4 可重复读  8  串行化

                                                           是否只读:true  只读   false  可操作

                                                            事务的传播行为

spring管理事务的方式

     XML配置(aop)

     注解配置(aop)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
   <!-- datasource -->
   <context:property-placeholder location="classpath:db.properties"/>
   <bean name="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"></property>
   </bean>
   <bean  name="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass"  value="${jdbc.driverClass}"></property>
      <property name="jdbcUrl"  value="${jdbc.jdbcUrl}"></property>
      <property name="user"  value="${jdbc.user}"></property>
      <property name="password"  value="${jdbc.password}"></property>
   </bean>
   <!-- jdbcTemplate -->
  <!--  <bean  name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource" ref="dataSource"></property>
  </bean>-->
  <!-- UserDao -->
  <bean  name="userDao"  class="com.dao.UserDao">
     <property name="dataSource"  ref="dataSource"></property>
  </bean>
    <!-- AccountDao -->
  <bean name="accountDao"  class="com.dao.AccountDao">
       <property name="dataSource"  ref="dataSource"></property>
  </bean>
  <bean name="accountService"  class="com.service.AccountService">
       <property name="accountDao"  ref="accountDao"></property>
  </bean>
  <!-- 注解配置事务 -->
  <tx:annotation-driven/>
  <!-- XML配置事务 -->
  <!--  <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
          <tx:method name="transfer"  isolation="REPEATABLE_READ"  propagation="REQUIRED"  read-only="false"/>
      </tx:attributes>
  </tx:advice>
  <aop:config>
       <aop:pointcut expression="execution(* com.service.*Service.*(..))" id="txpc"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txpc"/>
  </aop:config>-->
</beans>

  

  

原文地址:https://www.cnblogs.com/Java-125/p/9187664.html