Spring(2)之 (2.3 Spring JDBC Template的使用)
Spring 對 JDBC的支援:
Spring 對於JDBC的支援體現在:
- 連線池
- JDBCTemplate工具類,簡化了JDBC開發
使用 Spring JDBC步驟:
- 導包
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.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方法)