1. 程式人生 > >Spring(2)之 (2.3 Spring JDBC Template的使用)

Spring(2)之 (2.3 Spring JDBC Template的使用)

Spring 對 JDBC的支援:

Spring 對於JDBC的支援體現在:

  1. 連線池
  2. JDBCTemplate工具類,簡化了JDBC開發

使用 Spring JDBC步驟:

  1. 導包
    spring-jdbc-4.0.6.RELEASE
    spring-tx-4.0.6.RELEASE
    c3p0-0.9.1.2
    mysql-connector-java-5.1.12-bin
    (【bean.xml】中:① 建立資料庫連線池物件 dataSource② 建立 jdbcTemplate 的 bean物件(因為JdbcTemplate類中有 dataSource屬性,所以建立時用 ref引入 dataSource)、③ 建立類 userDao
    的 bean物件
    (如userDao物件)時,物件中有 jdbcTemplate屬性,所以建立時用 ref引入jdbcTemplate;【UserDao.java】:將 jdbcTemplate作為類屬性,利用 set方法將其注入進來,然後直接呼叫 jdbcTemplate自帶的方法執行sql語句。)
    bean.xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 建立連線池物件 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    	<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    	<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
    	<property name="user" value="root"></property>
    	<property name="password" value="12345"></property>
    </bean>
    <!-- JdbcTemplate工具類 -->
    <!-- 建立jdbcTemplate物件(將dataSource注入) -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    	<property name="dataSource" ref="dataSource"></property>
    </bean>
     <!-- 建立UserDao物件(將jdbcTemplate注入) -->
    <bean id="userDao" class="com.asd.spring.UserDao">
    	<property name="dataSource" ref="dataSource"></property>
    </bean>
    
</beans>

UserDao.java

public class UserDao{
	private JdbcTemplate jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
		this.jdbcTemplate=jdbcTemplate;
	}
	public void save() throws Exception{ //新增方法
		String sql="insert into user(username,age) values('Test',1)";
		jdbcTemplate.update(sql);
	}
	public void queryAll() throws Exception{ //查詢全部方法
		String sql="select id,username,age from user";
		List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);
		System.out.println(list);
		return null;
	}
	public List<User> query() throws Exception{ //查詢方法
		String sql="select id,username,age from user";
		//行處理
		return jdbcTemplate.query(sql,new RowMapper<User>(){
			public User mapRow(ResultSet rs,int index)throws SQLException{
				User user=new User();
				user.setId(rs.getInt("id"));
				user.setUsername(rs.getString("username"));
				user.setAge(rs.getInt("age"));
				return user;
			}
		});	
	}
}

 
eg 1. Spring 對 JDBC的支援(未改前):
(Spring對JDBC的支援優化:1.連線管理;2.重複程式碼的優化。 UserDao.java中:使用資料庫連線池作為屬性,資料庫連線池是用IOC容器生成,所以生成 DataSource的 bean物件 dataSource後,再在< property>標籤中用 ref屬性注入到 userDao的 bean物件中;dataSource再通過 set方法注入進來;
save()方法中通過 dataSource建立連線,通過連線建立Statement,再執行 sql語句,關閉 statement、conn;由於建立連線、建立Statement物件、執行、關閉等語句要重複,過於麻煩,可以使用 jdbcTemplate來進行 JDBC操作優化(不需要建立conn、建立Statement、.execute(sql)執行、關閉conn、statemnt,只需要一個 dataSource、一個sql語句,建立 jdbcTemplate時利用其構造方法將 dataSource注入,再呼叫其自帶的 update(sql)方法執行 sql語句即可); bean.xml中:建立連線池物件 、建立UserDao物件(將dataSource屬性注入);)

1.1 User.java

public class User{
	private int id;
	private String username;
	private int age;
	set、get()、toString();
}

1.2 UserDao.java_1(使用jdbcTemplate對JDBC操作優化後且將 jdbcTemplate作為類屬性)
(接下面,將 jdbcTemplate作為類屬性,此時 資料庫連線池dataSource屬性類以及其 set方法不需要了,需要一個 jdbcTemplate的 set方法將其注入;此時 bean.xml中建立 UserDao的 bean物件時,在UserDao的< property>標籤中用 ref屬性注入的是 jdbcTemplate物件而非 dataSource物件了(先建立 jdbcTemplate的 bean物件),jdbcTemplate的 bean物件用 ref屬性注入的是 dataSource物件;)

public class UserDao{
	//使用連線池,用IOC容器注入
	private JdbcTemplate jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
		this.jdbcTemplate=jdbcTemplate;
	}
	public void save() throws Exception{ //新增方法
		String sql="insert into user(username,age) values('Test',1)";
		jdbcTemplate.update(sql);
	}
	public void queryAll() throws Exception{ //查詢全部方法
		String sql="select id,username,age from user";
		List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);
		System.out.println(list);
		return null;
	}
	public List<User> query() throws Exception{ //查詢方法
		String sql="select id,username,age from user";
		//行處理
		return jdbcTemplate.query(sql,new RowMapper<User>(){
			public User mapRow(ResultSet rs,int index)throws SQLException{
				User user=new User();
				user.setId(rs.getInt("id"));
				user.setUsername(rs.getString("username"));
				user.setAge(rs.getInt("age"));
				return user;
			}
		});	
	}
}

1.2 UserDao.java_2(使用jdbcTemplate對JDBC操作優化後未將 jdbcTemplate作為類屬性)
(只需要一個 jdbcTemplate(建立時將 dataSource注入)來執行 sql語句:新增方法中呼叫 jdbcTemplate自帶的 update(sql)來執行 sql語句;查詢全部方法中呼叫 jdbcTemplate自帶的 queryForList(sql)來執行 sql語句,返回的是一個 Map型別的 list集合;對行處理呼叫query(sql,new RowMapper(){ }); 由於 new JdbcTemplate(dataSource)在每個方法中都重複,所以可以將 jdbcTemplate作為類屬性單獨提取出來,到上面;)

public class UserDao{
	//使用連線池,用IOC容器注入
	private DataSource dataSource;
	public void setDataSource(DataSource dataSource){
		this.dataSource=dataSource;
	}
	public void save() throws Exception{ //新增方法
		String sql="insert into user(username,age) values('Test',1)";
		//使用jdbcTemplate對JDBC操作優化
		JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
		jdbcTemplate.update(sql);
	}
	public void queryAll() throws Exception{ //查詢全部方法
		String sql="select id,username,age from user";
		JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
		List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);
		System.out.println(list);
		return null;
	}
	public List<User> query() throws Exception{ //查詢方法
		String sql="select id,username,age from user";
		JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
		//行處理
		return jdbcTemplate.query(sql,new RowMapper<User>(){
			public User mapRow(ResultSet rs,int index)throws SQLException{
				User user=new User();
				user.setId(rs.getInt("id"));
				user.setUsername(rs.getString("username"));
				user.setAge(rs.getInt("age"));
				return user;
			}
		});	
	}
}

1.2 UserDao.java_3(未使用jdbcTemplate時:)
(需要通過 dataSource建立 conn,通過 conn得到 statement,再通過 statement執行 sql語句,在關閉statement、conn;到上面;)

public class UserDao{
	//使用連線池,用IOC容器注入
	private DataSource dataSource;
	public void setDataSource(DataSource dataSource){
		this.dataSource=dataSource;
	}
	public void save() throws Exception{
		//JDBC連線
		Connection conn=dataSource.getConnection();
		//Statement
		Statement statement=conn.createStatement();
		String sql="insert into User(username,age) values('Test',1);
		statement.execute(sql);
		statement.close();
		conn.close();
	}
}

1.3 bean.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 建立連線池物件 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    	<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    	<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
    	<property name="user" value="root"></property>
    	<property name="password" value="12345"></property>
    </bean>
    <!-- JdbcTemplate工具類 -->
    <!-- 建立jdbcTemplate物件(將dataSource注入) -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    	<property name="dataSource" ref="dataSource"></property>
    </bean>
     <!-- 建立UserDao物件(將jdbcTemplate注入) -->
    <bean id="userDao" class="com.asd.spring.UserDao">
    	<property name="dataSource" ref="dataSource"></property>
    </bean>
    
     <!-- 建立UserDao物件(將dataSource注入) -->
    <!--<bean id="userDao" class="com.asd.spring.UserDao">
    	<property name="dataSource" ref="dataSource"></property>
    </bean> -->
</beans>

Test.java

public class Test{
	ApplicationContext applicationContext=ClassPathXmlApplicationContext("bean.xml");
	public void testApp{
		UserDao userDao=(UserDao)applicationContext.getBean("userDao");
		try{
			// userDao.save();
			// userDao.queryAll();
			System.out.println(userDao.query());
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

執行結果:(測試方法中呼叫 userDao中的查詢全部的方法queryAll)
在這裡插入圖片描述
執行結果:(測試方法中呼叫 userDao中的 query方法)
在這裡插入圖片描述