什么是Tenplate?
Spring提供的一種操作數據庫的技術,是對Jdbc的封裝。語法非常接近DBUtils.
JdbcTemplate可以直接操作數據庫,加快效率,jdbcTemplate也可以為聲明式事務准備
為什么用JdbcTemplate進行開發?
Spring對數據庫的操作在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSource注冊到JdbcTemplate之中。
Spring提供的JdbcTemplate對jdbc做了封裝,大大簡化了數據庫的操作。找到Spring JdbcTemplate源碼,可以看到如下方法:
Connection con = DataSourceUtils.getConnection(getDataSource());
如果直接使用JDBC的話,需要我們加載數據庫驅動、創建連接、釋放連接、異常處理等一系列的動作;繁瑣且代碼看起來不直觀。
此外,Spring提供的JdbcTempate能直接數據對象映射成實體類,不再需要獲取 ResultSet去獲取值/賦值等操作,提高開發效率;
如下:return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class)
配置環境:
導入jar包:
IOC需要的jar包:
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar //注解會使用到的包
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
MySQL驅動包、c3p0jar包:
c3p0-0.9.1.2.jar
mysql-connector-java-5.1.37-bin.jar
JdbcTemplate需要的jar包:
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
在IOC容器中配置數據源:
即在applicationContext.xml中
<!-- 引入外部屬性文件--> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 配置數據源 --> <bean id="comboPooledDataSource" 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.url}"></property> <property name="driverClass" value="${jdbc.driver}"></property> </bean>
其中jdbc.properties文件內容:
jdbc.user=root
jdbc.password=1234
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.driver=com.mysql.jdbc.Driver
在IOC容器中配置JdbcTemplate對應的bean
<!--配置jdbcTemplate,並裝配DataSource數據源屬性 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="comboPooledDataSource"></property> </bean>
測試數據源:
建立一個Junit Test Case 類:
將emp_id=5的記錄的salary字段更新為1300.00【更新操作】
public class TestDataSource { private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); private JdbcTemplate template=ioc.getBean(JdbcTemplate.class); @Test public void test01(){ //實驗2:將emp_id=5的記錄的salary字段更新為1300.00 String sql = "UPDATE employee SET salary = ? WHERE emp_id = ?"; template.update(sql, 1300,5);//第一個是sql語句,后面的按着順序傳入參數即可,這個update方法是接收的可變參數!參數的個數和類型不收限制。 }
從上述實驗中就可以看到,該操作不用我們自己再去獲取數據庫連接信息了,而是直接傳遞sql語句及其參數!
批量插入 :
public class TestDataSource { private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); private JdbcTemplate template=ioc.getBean(JdbcTemplate.class); @Test public void testBatch(){ String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(?,?)"; //執行sql語句需要傳遞的參數 ,一個類型為Object數組的list集合。 List<Object[]> list = new ArrayList<Object[]>(); list.add(new Object[]{"Tom2015",1000}); list.add(new Object[]{"Tom2016",2000}); list.add(new Object[]{"Tom2017",3000}); template.batchUpdate(sql, list);//批量插入,所以用帶有batch的batchupdate方法,該方法有兩個參數,前一個為SQL,后一個為參數集合。 } }
查詢:
emp_id=5的數據庫記錄,封裝為一個Java對象返回 分析:封裝為一個對象返回的話,首先我們需要有一個與數據表對應的實體類!
@Test public void test01(){ //需要注意的是:sql語句中的別名要與對應實體類的屬性名保持一致! String sql = "SELECT emp_id AS empId,emp_name AS empName,salary FROM employee WHERE emp_id=?"; //RowMapper是一個接口,這里我們使用其子類 RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class); //最后一個參數是可變參數,用於向sql語句中依次傳遞參數! Employee employee = template.queryForObject(sql, rowMapper, 5); System.out.println(employee); } }
查詢集合:
查詢salary>4000的數據庫記錄,封裝為List集合返回
public class TestDataSource { private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); private JdbcTemplate template=ioc.getBean(JdbcTemplate.class); @Test public void test01(){ //需要注意的是:sql語句中的別名要與對應實體類的屬性名保持一致! String sql = "SELECT emp_id AS empId,emp_name AS empName,salary FROM employee WHERE salary > ?"; //RowMapper是一個接口,這里我們使用其子類 RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class); //該query方法查詢出來的是一個list列表,query方法的最后一個參數是可變參數! List<Employee> list = template.query(sql, rowMapper, 4000); for (Employee employee : list) { System.out.println(employee); } } }