`
xiaoliang330
  • 浏览: 112731 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring 对jdbc的支持

阅读更多
我写了个小测试,熟悉一下spring对JDBC的支持与配置过程

实体类:
public class User {
	private int id;
	private String name;

//setter & getter
}


DAO层:
package com.xll.jdbc.dao;

import java.util.List;

import com.xll.jdbc.bean.User;

public interface UserDao {
	void save(User user);
	void delete(User user);
	User get(int id);
	List<User> getUsers();
}



DAO的实现类:
package com.xll.jdbc.daoImpl;

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

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Transactional;

import com.xll.jdbc.bean.User;
import com.xll.jdbc.dao.UserDao;

@Transactional
public class UserDaoImpl implements UserDao{
	private JdbcTemplate jdbcTemplate;
	
	public void setDatasouce(DataSource datasource) {
		jdbcTemplate = new JdbcTemplate( datasource);
	}
	public void delete(User user) {
		this.jdbcTemplate.update("delete from user where id=?", new Object[]{user.getId()});
		System.out.println("删除成功!");
	}
	public User get(int id) {
		User user = (User)this.jdbcTemplate.queryForObject("select * from user where id=?", new Object[]{id},
				new UserMapper());
		return user;
	}
	@SuppressWarnings("unchecked")
	public List<User> getUsers() {
		return this.jdbcTemplate.query("select * from user", new UserMapper());
	}

	public void save(User user) {
		this.jdbcTemplate.update("insert into user(id,name) values(?,?)",
				new Object[]{user.getId(),user.getName()});
		System.out.println("保存成功!");
	}
	private static final class UserMapper implements RowMapper {
	   
		public Object mapRow(java.sql.ResultSet rs, int rowNum)
				throws SQLException {
			  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="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		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-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
		
		
		
	<bean id="Datasource"
		class="org.apache.commons.dbcp.BasicDataSource">
			<property name="driverClassName" value="com.mysql.jdbc.Driver" />
			<property name="url" value="jdbc:mysql://localhost:3306/mydb" />
			<property name="username" value="root" />
			<property name="password" value="123" />
			<property name="initialSize" value="2" />
			<property name="maxActive" value="100" />
			<property name="maxIdle" value="2" />
			<property name="minIdle" value="1" />
	</bean>
		<bean id="txManager"	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<property name="dataSource" ref="Datasource" />
		</bean>
		
	<tx:annotation-driven transaction-manager="txManager" />
		
	<bean id="userDaoImp" class="com.xll.jdbc.daoImpl.UserDaoImpl">
	<property name="datasouce" ref="Datasource" />
	</bean>
</beans>		


其中我配置了事务管理,这里我的DAO的实现类中用datasource初始化了jdbcTemplate,在配置文件中,向userDaoImpl中注入了datasource。当然你也可以直接extends
JdbcDaoSupport




我的测试类如下:

public void testGetAll(){
		ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
		UserDao ud = (UserDao)ctx.getBean("userDaoImp");
		List list = ud.getUsers();
		
		Iterator iter = list.iterator();
		while(iter.hasNext()){
			User user = (User)iter.next();
			System.out.println(user);
		}
	}
	


结果为:
name=xiaoliang,id=7
name=xiao,id=9



这里有个小细节,就是默认情况下用的是spring的代理,也就是这句
UserDao ud = (UserDao)ctx.getBean("userDaoImp");  
你得写成接口来接收,不然报错,当然你可以在配置文件中加入这句
<aop:config proxy-target-class="true"></aop:config>



这时候使用的是cglib的代理来实现的,所以这时候你的测试类中可以写成这样:
UserDaoImpl ud = (UserDaoImpl)ctx.getBean("userDaoImp");





上面已经配置了事务,并开启了注解的功能,<tx:annotation-driven transaction-manager="txManager" />,

这时,我在DAO实现类的save()中作如下改动:
public void save(User user) {
		this.jdbcTemplate.update("insert into user(id,name) values(?,?)",
				new Object[]{user.getId(),user.getName()});
		int i = 10/0;
		System.out.println("保存成功!");
	}



这时候运行我的测试类,数据将不会插入成功,而去掉实现类上面的事务注解@Transactional,再运行测试类,这是虽然也抛异常,但数据已经插入到数据库了,可以看到事务的功能。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics