Spring對 JDBC 的支持,JdbcTemplate類的使用


導包:spring框架的包 和 連接數據庫連接池的c3p0包 連接mysql數據庫的包;

在src目錄下建立jdbc.properties文件:存放連接數據庫的屬性值

jdbc.user=root jdbc.password=lxn123 jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql:///spring1
 jdbc.initPoolSize=5 jdbc.maxPoolSize=10

 

在src目錄下建立spring bean configuration file的xml文件:applicationContext.xml

    <!-- 基於注解的,導入標識的包,可以識別本包,或其自包,其只對帶有指定注解的類,方法有效,不是對這個包中的所有類和方法有效 -->
    <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>
    
    <!-- 導入資源文件 ,classpath.jdbc.properties 為類路徑下的文件名為 jdbc.properties-->
    <context:property-placeholder location="classpath:jdbc.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="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
    </bean>
    
    <!-- 配置spring的JdbcTemplate -->
    <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>

 

建立test類中可能用到的Employee,Department類,這里,只有屬性,set,get,tostring等方法就。。。

Employee類的屬性:

private Integer id; private String lastName; private String email; private Department department;

Department類的屬性:

private Integer id; private String name;

 

建立類:EmployeeDao,基於注解的查詢方法

package com.atguigu.spring.jdbc;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

@Component//基本注解
public class EmployeeDao {
    
    @Autowired
    public JdbcTemplate jdbcTemplate;
    
    public Employee get(Integer id){
        String sql="select id,last_name,email from tables where id=?";
        RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
        Employee employee=jdbcTemplate.queryForObject(sql, rowMapper, id);
        return employee;
    }
}    

 

建立一個JUtil Test測試類:JDBCTest

package com.atguigu.spring.jdbc;

import static org.junit.Assert.*;

import java.util.List;
import java.sql.SQLException;
import java.util.ArrayList;

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;
public class JDBCTest {
    
    private ApplicationContext ctx=null;
    private JdbcTemplate jdbcTemplate;
    private EmployeeDao employeeDao;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    {
        ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
        employeeDao=ctx.getBean(EmployeeDao.class);
     namedParameterJdbcTemplate=ctx.getBean(NamedParameterJdbcTemplate.class); }
  

  @Test
  /**
   * 使用具名參數時, 可以使用 update(String sql, SqlParameterSource paramSource) 方法進行更新操作
  * 1. SQL 語句中的參數名和類的屬性一致!即上邊employee中屬性一致
  * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 實現類作為參數.
  */
  public void testNamedParameterJdbcTemplate2(){
    String sql="insert into tables(last_name,email,dept_id) values(:lastName,:email,:deptId)";
    Employee employee=new Employee();
    employee.setLastName("panpan");
    employee.setEmail("@panpan");
    employee.setDeptId(4);

    SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);
    namedParameterJdbcTemplate.update(sql, paramSource);
  }

  
  

   //可以為參數起名字
   //好處: 若有多個參數, 則不用再去對應位置, 直接對應參數名, 便於維護
  //缺點: 較為麻煩.
  public void testNamedParameterJdbcTemplate(){
    String sql="insert into tables(last_name,email,dept_id) values(:la,:em,:de)";

    Map<String, Object> paramMap=new HashMap<String, Object>();

    paramMap.put("la", "fsd");
    paramMap.put("em", "@ji");
    paramMap.put("de", 3);

    namedParameterJdbcTemplate.update(sql, paramMap);
  }


@Test
//對基於注解的方法測試 public void testEmployeeDao(){ System.out.println(employeeDao.get(1)); } //獲取單個列的值, 或做統計查詢 //使用 queryForObject(String sql, Class<Long> requiredType) public void testQueryForObject2(){ String sql="select count(id) from tables"; long count=jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count); } //查到實體類的集合 //注意調用的不是 queryForList 方法 public void testQueryForList(){ String sql="select id,last_name,email from tables where id>?"; RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class); List<Employee> employees=jdbcTemplate.query(sql, rowMapper, 1); System.out.println(employees); } /** * 從數據庫中獲取一條記錄, 實際得到對應的一個對象 * 注意不是調用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法! * 而需要調用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) * 1. 其中的 RowMapper 指定如何去映射結果集的行, 常用的實現類為 BeanPropertyRowMapper * 2. 使用 SQL 中列的別名完成列名和類的屬性名的映射. 例如 last_name lastName * 3. 不支持級聯屬性. JdbcTemplate 到底是一個 JDBC 的小工具, 而不是 ORM 框架 */ public void testQueryForObject(){ String sql="select id,last_name lastName,email,dept_id as \"department.id\" from tables where id=?"; RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class); Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(employee); } //執行批量更新: 批量的 INSERT, UPDATE, DELETE //最后一個參數是 Object[] 的 List 類型: 因為修改一條記錄需要一個 Object 的數組, //那么多條不就需要多個 Object 的數組 public void testBatchUpdate(){ String sql="insert into tables(last_name,email,dept_id) values(?,?,?)"; List<Object[]> batchArgs=new ArrayList<>(); batchArgs.add(new Object[]{"AAA","testa",5}); batchArgs.add(new Object[]{"BBB","JIJK",6}); batchArgs.add(new Object[]{"CCC","panpN",3}); batchArgs.add(new Object[]{"DDD","jfids",2}); batchArgs.add(new Object[]{"EEE","tfsd",4}); jdbcTemplate.batchUpdate(sql,batchArgs); } //執行 INSERT, UPDATE, DELETE,只修改sql語句,即可 public void testUpdate(){ String sql="update tables set last_name=? where id=?"; jdbcTemplate.update(sql, "權", "1"); } //測試數據庫連接池是否連接成功 public void testDataSource() throws SQLException { DataSource dataSource=ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); } }

 

 

 


免責聲明!

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



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