Spring學習(穀粒學院spring4課程)第六節 JdbcTemplate
阿新 • • 發佈:2018-12-13
一:配置資料庫連線池及jdbc Template或NamedParameterJdbcTemplate,
<!-- 匯入資原始檔 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置c3p0資料來源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <context:component-scan base-package="com.wh.spring"></context:component-scan> <!-- 配置spring的jdbc Template --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置 NamedParameterJdbcTemplate,該物件可以使用具名引數,其沒有無參構造器,必須為其構造器指定引數--> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> </bean>
二:使用jdbc Template
import static org.junit.Assert.*; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; public class JDBCTest { private ApplicationContext ctx; private JdbcTemplate jdbcTemplate; private Spring4Dao spring4Dao; private Spring4DaoUseDaoSupport spring4DaoUseDaoSupport; private NamedParameterJdbcTemplate namedParameterJdbcTemplate; { ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate"); spring4Dao=(Spring4Dao) ctx.getBean("spring4Dao"); spring4DaoUseDaoSupport=(Spring4DaoUseDaoSupport) ctx.getBean("spring4DaoUseDaoSupport"); namedParameterJdbcTemplate=(NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate"); } //@Test public void testDataSource() throws SQLException { DataSource dataSource=(DataSource) ctx.getBean("dataSource"); System.out.println(dataSource.getConnection()); } /** * 執行Insert,update,delete */ //@Test public void testUpdate() { String sql="insert into spring4 (name ,age) values('wh','23')"; jdbcTemplate.update(sql); } /** * 執行批量更新:批量的inset,Updata,Delete * 最後一個引數是List<Object[]>,修改一條記錄需要一個Object[] */ //@Test public void testBatchUpdate() { String sql="insert into spring4(name,age) values(?,?)"; List<Object[]> batchArgs=new ArrayList<>(); batchArgs.add(new Object[] {"a",1}); batchArgs.add(new Object[] {"b",2}); batchArgs.add(new Object[] {"c",3}); batchArgs.add(new Object[] {"d",4}); jdbcTemplate.batchUpdate(sql,batchArgs); } /** * 從資料庫中獲取一條記錄,實際得到對應的一個物件 * 表跟類對應,記錄跟物件對應(ORM) * 注意,不是呼叫queryForObject(String sql, Class<Spring4> requiredType, @Nullable Object... args) 方法 * 該方法返回一個欄位的值 * 查詢一條記錄需要呼叫queryForObject(String sql, RowMapper<Spring4> rowMapper, @Nullable Object... args)方法 * 1:RowMapper指定如何對映結果的行,常用的實現類為BeanPropertyRowMapper; * 2:使用SQL中的列的別名完成列名和類的屬性名的對映 , 例如last_name lastName * 3:不支援級聯屬性,jdbcTemplate是JDBC的小工具,不是ORM框架 */ //@Test public void testQueryForObject() { String sql="select * from spring4 where name=?"; RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class); Spring4 spring4=jdbcTemplate.queryForObject(sql, rowMapper,"a"); System.out.println(spring4); } /** * 查到實體類的集合 * 注意,呼叫的不是queryForList */ //@Test public void testQueryForList() { String sql="select * from spring4 where name=?"; RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class); List<Spring4> spring4s=jdbcTemplate.query(sql, rowMapper,"wh"); System.out.println(spring4s); } /** *獲取單個列的值,或做統計查詢 *使用queryForObject(String sql, Class<Integer> requiredType) 方法 */ //@Test public void testQueryForObject2() { String sql="select count(*) from spring4"; int count=jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(count); } //@Test public void testSpring4Dao() { System.out.println(spring4Dao.get("a")); } //@Test public void testSpring4DaoUseDaoSupport() { System.out.println(spring4DaoUseDaoSupport.get("a")); } /** * 可以為引數起名字 * 1:若有多個引數,則不用再對應位置,直接對應引數名,便於維護 * 2:較為麻煩 */ //@Test public void testNamedParameterJdbcTemplate() { String sql="insert into spring4(name,age) values(:na,:ag)"; Map<String, String> paramMap=new HashMap<>(); paramMap.put("na", "wa"); paramMap.put("ag", "12"); namedParameterJdbcTemplate.update(sql, paramMap); } /** * 使用具名引數時,可以使用update(String sql, SqlParameterSource paramSource) 方法進行更新操作 * 1:SQL語句的引數名和屬性一致 * 2:使用SqlParameterSource的BeanPropertySqlParameterSource實現類作為引數 */ @Test public void testNamedParameterJdbcTemplate2() { String sql="insert into spring4(name,age) values(:name,:age)"; Spring4 spring4=new Spring4(); spring4.setAge(16); spring4.setName("小葉子"); SqlParameterSource paramSource=new BeanPropertySqlParameterSource(spring4); namedParameterJdbcTemplate.update(sql, paramSource); } }
三:使用 JdbcDaoSupport
注意:要為 JdbcDaoSupport配置DataSource或jdbc Template
import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.support.JdbcDaoSupport; import org.springframework.stereotype.Repository; /** * 不推薦使用JdbcDaoSupport * 推薦使用jdbcTemplate作為Dao的成員變數 */ @Repository public class Spring4DaoUseDaoSupport extends JdbcDaoSupport{ //由於setDataSource被Final修飾 @Autowired public void setDataSource2(DataSource dataSource) { setDataSource(dataSource); } public Spring4 get(String name) { String sql="select * from spring4 where name=?"; RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class); return getJdbcTemplate().queryForObject(sql, rowMapper,name); } }