Spring中的数据库操作--使用JdbcTemplate

Spring中的数据库操作

	静态代码+动态变量 = jdbc编程
	静态代码构成了模板,而动态变量则是需要传入的参数

	JdbcTemplate
		1)简化了我们对JDBC的操作:完成了SQL语句的创建和执行、资源的创建和释放的工作
			总结:节省代码,不管连接、不管事务、不管异常、不管关闭
		2)仅需要传递DataSource就可以把它实例化
		3)JdbcTemplate只需要创建一次
		4)JdbcTemplate是线程安全的,故可以使用单例模式
	
	使用JdbcTemplate
		总结:自己写的dao只需要把dataSource注入到jdbcTemplate中即可
	
		方法一:dao类继承JdbcDaoSupport,直接(调用JdbcDaoSupport的setDataSource方法)注入DataSource。
			注:查看JdbcDaoSupport的setDataSource方法的源码就可以明白DataSource是怎样注入到jdbcTemplate的

			<bean id="personDao" class="com.jxn.PersonDao">
				<!--  -->
				<property name="dataSource">
					<ref bean="dataSource"/>
				</property>
			</bean>
			
			public class PersonDao extends JdbcDaoSupport{
				public void update(){
					this.getJdbcTemplate().execute("update person set pname='a' where pid=3");
				}
				
				public void query(){
					List<Person> persons = this.getJdbcTemplate().query("select * from person", new PersonRowMapper());
					for(Person person:persons){
						System.out.println(person.getPname());
					}
				}
			}

			public class PersonRowMapper implements RowMapper{
				@Override
				public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
					Person person = new Person();
					person.setPid(rs.getLong("pid"));
					person.setPname(rs.getString("pname"));
					person.setPsex(rs.getString("psex"));
					return person;
				}
			}
		
		方法二:dao类继承JdbcTemplate,通过JdbcTemplate把DataSource注入
		
			<bean id="personDao" class="com.jxn.PersonDao">
				<constructor-arg index="0" ref="dataSource"></constructor-arg>
			</bean>
		
			public class PersonDao extends JdbcTemplate{
				public PersonDao2(DataSource dataSource){
					super(dataSource);
				}
				public void update(){
					this.execute("update person set pname='aa' where pid=2");
				}
			}

		方法三:dao类里封装一个JdbcTemplate属性,JdbcTemplate把DataSource注入,然后PersonDao再把JdbcTemplate注入

			<bean id="personDao" class="com.jxn.PersonDao">
				<property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
			</bean>
			<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
				<property name="dataSource"><ref bean="dataSource"/></property>
			</bean>
			
			public class PersonDao{
				private JdbcTemplate jdbcTemplate;
				public JdbcTemplate getJdbcTemplate() {
					return jdbcTemplate;
				}
				public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
					this.jdbcTemplate = jdbcTemplate;
				}
				public void update(){
					this.jdbcTemplate.execute("update person set pname='aaa' where pid=2");
				}
			}


	------------------------------------------------------------
	【JdbcDaoSupport、JdbcTemplate、JdbcAccessor的部分源码】

	JdbcDaoSupport 封装了 JdbcTemplate
	JdbcTemplate 继承了 JdbcAccessor
	JdbcAccessor 封装了 DataSource
	
		org.springframework.jdbc.core.JdbcTemplate
		org.springframework.jdbc.core.support.JdbcDaoSupport
		org.springframework.jdbc.support.JdbcAccessor
		javax.sql.DataSource;
	
	------------------------
		// JdbcDaoSupport 封装了 JdbcTemplate
		public abstract class JdbcDaoSupport extends DaoSupport {

			private JdbcTemplate jdbcTemplate;

			public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
				this.jdbcTemplate = jdbcTemplate;
				initTemplateConfig();
			}

			public final JdbcTemplate getJdbcTemplate() {
			  return this.jdbcTemplate;
			}
			
			// 可以通过Spring的DI直接把DataSource注入进来
			public final void setDataSource(DataSource dataSource) {
				if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
					this.jdbcTemplate = createJdbcTemplate(dataSource);
					initTemplateConfig();
				}
			}

			public final DataSource getDataSource() {
				return (this.jdbcTemplate != null ? this.jdbcTemplate.getDataSource() : null);
			}
			
			protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
				return new JdbcTemplate(dataSource);
			}
		}

	------------------------
		// JdbcTemplate 继承了 JdbcAccessor
		public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {

			public JdbcTemplate() {
			}
			
			public JdbcTemplate(DataSource dataSource) {
				setDataSource(dataSource);
			}
			
			// 在这里,JdbcTemplate封装了很多的jdbc的操作
		}
		
	------------------------
		// JdbcAccessor 封装了 DataSource
		public abstract class JdbcAccessor implements InitializingBean {

			private DataSource dataSource;

			public void setDataSource(DataSource dataSource) {
				this.dataSource = dataSource;
			}
			
			public DataSource getDataSource() {
				return this.dataSource;
			}
		}


	

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值