spring使用JdbcTemplate和jdbcDaosupport及具名參數使用


關於jdbctemplate:

個人感覺比Java鏈接mysql那一套方便好維護多了,只需在配置文件維護即可

需要的包:

com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
mysql-connector-java-5.1.7-bin.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-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
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

具體步驟:

配置外部資源文件(db.properties)

配置mysal數據源

配置jdbctemplate

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    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-4.1.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd">
    <!-- 裝配自導掃描的包 -->
    <context:component-scan base-package="com.spring.bean.jdbc"></context:component-scan>
    <!-- 加載外部資源文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 配置MySQL數據源  -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${db.driverClassName}"></property>
        <property name="url" value="${db.url}"></property>
        <property name="username" value="${db.username}"></property>
        <property name="password" value="${db.password}"></property> 
    </bean>
    <!--配置jdbcTemplate模板  -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
    </bean>
    <!-- 配置namedParameterJdbcTemplate ,具名參數 -->
    <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"></constructor-arg>
    </bean>
    
</beans>

外部資源文件

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/students
db.username=root
db.password=root

實體students

package com.spring.bean.jdbc;

/**
 * 學生實體類
 * @author Administrator
 *
 */
public class Students {

    private Integer Id;
    private String name;
    private String sex;
    private int age;
    private String tel;
    public Integer getId() {
        return Id;
    }
    public void setId(Integer id) {
        Id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    
    @Override
    public String toString() {
        return "Students [Id=" + Id + ", name=" + name + ", sex=" + sex
                + ", age=" + age + ", tel=" + tel + "]";
    }
    
}

實體course

package com.spring.bean.jdbc;

public class Course {

    private Integer id;
    private String coursename;
    private String coursenameid;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getCoursename() {
        return coursename;
    }
    public void setCoursename(String coursename) {
        this.coursename = coursename;
    }
    public String getCoursenameid() {
        return coursenameid;
    }
    public void setCoursenameid(String coursenameid) {
        this.coursenameid = coursenameid;
    }
    @Override
    public String toString() {
        return "Course [id=" + id + ", coursename=" + coursename
                + ", coursenameid=" + coursenameid + "]";
    }
}

jdbctemplate

package com.spring.bean.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.Repository;
@Repository
public class StudentsDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Students getStudent(String sql, Integer id) {
        RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class);
        Students students = jdbcTemplate.queryForObject(sql, rowMapper, id);
        return students;
    }
}

jdbcDaosupport

package com.spring.bean.jdbc;

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;
@Repository
public class CourseDao extends JdbcDaoSupport {
    

    /**此處必須加入dataSource或jdbcTemplate要么報錯如下
     * Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required
     * 如不加jdbcTemplate。要用dataSource
     * name只能重新加入dataSource,為什么我用了setDataSource22為DataSource賦值
     * 因在JdbcDaoSupport類中為final關鍵字修飾,不可重寫
     * @param dataSource
     */
    @Autowired
    public void  setDataSource22(DataSource dataSource) {
        setDataSource(dataSource);
    }
    
    /**
     * 獲取課程
     * @param sql
     * @param id
     * @return
     */
    public Course getCourse(String sql,int id){
        RowMapper<Course> rowMapper = new BeanPropertyRowMapper<Course>(Course.class);
        Course course = getJdbcTemplate().queryForObject(sql, rowMapper,id);
        return course;
    }
}

測試類具體見注釋

package com.spring.bean.jdbc;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
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.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

public class MainTest {
    
    private ApplicationContext ctx=null;
    private StudentsDao studentsDao;
    private JdbcTemplate jdbcTemplate;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    private CourseDao courseDao;
    
    {
        ctx=new ClassPathXmlApplicationContext("bean.xml");
        jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
        studentsDao=(StudentsDao) ctx.getBean("studentsDao");
        namedParameterJdbcTemplate=(NamedParameterJdbcTemplate)ctx.getBean("namedParameterJdbcTemplate");
        courseDao=(CourseDao) ctx.getBean("courseDao");
    }
    
 /**
   *更新某一條操作
  */ @Test
public void getCourse(){ String sql="SELECT * from course WHERE id=?"; Course course = courseDao.getCourse(sql,1); System.out.println(course); } /** * 使用具名參數操作數據庫(可以為字段起名) * 優點就是:當字段較多,不用考慮字段的順序,效率高,即key,value的形式 * 缺點:麻煩代碼量多 */ @Test public void testnamedParameterJdbcTemplate(){ String sql="INSERT INTO students ( name, sex, age, tel) VALUES (:n, :s, :a, :t)"; Map<String, Object> paramMap=new HashMap<String,Object >(); paramMap.put("n", "rongrong"); paramMap.put("s", "man"); paramMap.put("a", "25"); paramMap.put("t", "18612396984"); namedParameterJdbcTemplate.update(sql, paramMap); } /** * 使用具名參數操作數據庫 * 使用update(String sql, SqlParameterSource paramSource)方法傳入實體參數 * 要求:sql的字段名稱與對象屬性名稱一致 * SqlParameterSource paramSource */ @Test public void testnamedParameterJdbc(){ String sql="INSERT INTO course (coursename, coursenameid) VALUES (:coursename, :coursenameid);"; Course course = new Course(); course.setCoursenameid("As-1001"); course.setCoursename("java"); SqlParameterSource paramSource = new BeanPropertySqlParameterSource(course); namedParameterJdbcTemplate.update(sql, paramSource); } /** * 修改數據庫某條屬性 */ @Test public void testUpdate(){ String sql="UPDATE students SET `name`=? WHERE id=? "; jdbcTemplate.update(sql, "lucy",1); } /** * 批量更新數據 * List<Object[]>此處為對象數組 * 必須為對象數組,插入一條數據如:{"MT-1","man",17,"13706063546"} * 如為多條數據,那么必須為對象數組 */ @Test public void testBatchUpdate(){ String sql="INSERT INTO students ( name, sex, age, tel) VALUES (?, ?, ?, ?)"; List<Object[]> batchArgs=new ArrayList<Object[]>(); batchArgs.add(new Object[]{"MT-1","man",17,"13706063546"}); batchArgs.add(new Object[]{"MT-2","man",18,"13706063547"}); batchArgs.add(new Object[]{"MT-3","man",19,"13706063548"}); batchArgs.add(new Object[]{"MT-4","man",20,"13706063549"}); jdbcTemplate.batchUpdate(sql, batchArgs); } /** * 查詢返回一個實體對象集合 * 注意調用的不是 queryForList 方法 */ @Test public void testQueryForList(){ String sql="SELECT id,name, sex, age, tel FROM students"; RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class); List<Students> students = jdbcTemplate.query(sql, rowMapper); // 不是 queryForList 方法 // List<Students> students = jdbcTemplate.queryForList(sql, Students.class); System.out.println(students); } /** * 從數據庫中獲取一條記錄, 實際得到對應的一個對象 * 注意不是調用 queryForObject(String sql, Class<T> requiredType, Object... args) 方法! * 而需要調用 queryForObject(String sql, RowMapper<T> rowMapper, Object... args) * 1. 其中的 RowMapper 指定如何去映射結果集的行, 常用的實現類為 BeanPropertyRowMapper * 2. 使用 SQL 中列的別名完成列名和類的屬性名的映射. 例如 name, sex, age, tel * 3. 不支持級聯屬性. JdbcTemplate 到底是一個 JDBC 的小工具, 而不是 ORM 框架 */ @Test public void testQueryForObject(){ String sql="SELECT id,name, sex, age, tel FROM students WHERE id=?"; RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class); Students students = jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(students); } /** * 獲取單個列的值, 或做統計查詢 * 使用 queryForObject(String sql, Class<Long> requiredType) * 其中:requiredType為Integer.class可以達到統計查詢的效果 * 使用 int queryForInt(String sql) throws DataAccessException,可實現 */ @Test public void testQueryForINt(){ String sql="SELECT count(id) FROM students "; // RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class); int long1 = jdbcTemplate.queryForInt(sql); // Integer long1 = jdbcTemplate.queryForObject(sql, Integer.class); // 不是 queryForList 方法 // List<Students> students = jdbcTemplate.queryForList(sql, Students.class); System.out.println(long1); } /** * 根據用戶id,返回用戶對象 */ @Test public void getStudents(){ String sql="SELECT id,name, sex, age, tel FROM students WHERE id=?"; System.out.println(studentsDao.getStudent(sql, 4)); } }

 


免責聲明!

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



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