Spring的Template


什么是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);
                }
            }
        }
        

 

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM