Spring之JDBC Template


 

時間:2017-2-5 18:16

 

——Spring對不同持久化技術的支持

Spring為各種支持的持久化技術都提供了簡單操作的模板和回調。

ORM持久化技術:
    JDBC:
        org.springframework.jdbc.core.JdbcTemplate
 

    Hibernate3.0:
        org.springframework.orm.hibernate3.HibernateTemplate
 
    IBatis(MyBatis):
        org.springframework.orm.ibatis.SqlMapClientTemplate
 
    JPA:
        org.springframework.orm.jpa.JpaTemplate
 
——JDBC Template

1、Spring JDBC是Spring提供的持久層技術。
2、簡化JDBC API的開發,使用上和Apache公司的DBUtils框架非常相似。
3、導入必要jar包到工程目錄。
4、導入Spring核心開發包
    >   spring-beans-3.2.0.RELEASE.jar
    >   spring-context-3.2.0.RELEASE.jar
    >   spring-core-3.2.0.RELEASE.jar
    >   spring-expression-3.2.0.RELEASE.jar
5、導入commons-logging日志包
    >   commons-logging-1.1.1.jar
6、導入JDBC模板開發包
    >   spring-jdbc-3.2.0.RELEASE.jar
        JDBC工具。
    >   spring-tx-3.2.0.RELEASE.jar
        事務管理。
7、導入MySQL驅動

——JDBC Template入門

1、導入相應jar包
    *   spring-jdbc-3.2.0.RELEASE.jar
    *   spring-tx-3.2.0.RELEASE.jar
    *   mysql-connector-java-5.1.35-bin.jar
    *   mchange-commons-java-0.2.3.4.jar

2、創建applicationContext.xml配置文件

3、編寫一個測試類
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
 
public class SpringDemo1 {
 
    @Test
    public void fun1(){
        // 創建連接池
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        // 設置參數
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///spring3_day02");
        dataSource.setUsername("root");
        dataSource.setPassword("Admin123");
 
        // 使用JDBC的模板
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        // 執行SQL語句
        jdbcTemplate.execute("create table User (id int primary key auto_increment, name varchar(20))");
    }
}

——使用Spring默認連接池

從剛剛的示例中已經看出,Spring JDBC模板的使用,必須依賴DataSource數據庫連接池。

在實際開發中,通常使用Spring配置文件來配置JDBC Template。

常用數據源:
    1)Spring數據源實現類:DriverManagerDataSource
    2)DBCP數據源:BasicDataSource
    3)C3P0數據源:ComboPooledDataSource

1、創建applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
 
    <!-- Spring默認連接池 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="jdbc:mysql:///spring3_day02" />
        <property name="username" value="root" />
        <property name="password" value="Admin123" />
    </bean>
 
 
    <!-- 定義JDBCTemplate類 -->
    <!-- 為JDBC模板注入連接池屬性 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

2、測試代碼:

    @Test
    public void fun(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate.execute("create table User3 (id int primary key auto_increment, name varchar(20))");
    }

——DBCP連接池

1、導入相應jar包
    *   com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
    *   com.springsource.org.apache.commons.pool-1.5.3.jar

2、創建配置文件

<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
 
    <!-- 配置DBCP連接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql:///spring3_day02" />
        <property name="username" value="root" />
        <property name="password" value="Admin123" />
    </bean>

    <!-- 定義JDBCTemplate類 -->
    <!-- 為JDBC模板注入連接池屬性 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
        <property name="dataSource" ref="dataSource" />
    </bean>
 
</beans>

3、測試代碼

    @Test
    public void fun(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate.execute("create table User4 (id int primary key auto_increment, name varchar(20))");
    }


——C3P0連接池

1、導入相應jar包
    *   com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

2、創建配置文件

<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
    <!-- 配置C3P0連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql:///spring3_day02" />
        <property name="user" value="root" />
        <property name="password" value="Admin123" />
 
    </bean>
 
    <!-- 定義JDBCTemplate類 -->
    <!-- 為JDBC模板注入連接池屬性 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
        <property name="dataSource" ref="dataSource" />
    </bean>
 
</beans>
 
3、測試代碼

    public void fun(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate.execute("create table User5 (id int primary key auto_increment, name varchar(20))");
    }

——將參數配置到屬性文件中

1、在src下創建jdbc.properties屬性文件
    jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql:///spring3_day02
    jdbc.username = root
    jdbc.password = Admin123

2、在applicationContext.xml中使用屬性文件配置的內容
    1)第一種寫法
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns=" http://www.springframework.org/schema/beans"
            xmlns:context=" http://www.springframework.org/schema/context"
 
            <bean
                class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="location" value="classpath:jdbc.properties" />
            </bean>
 
 
            <!-- 配置C3P0連接池 -->
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="${jdbc.driver}" />
                <property name="jdbcUrl" value="${jdbc.url}" />
                <property name="user" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </bean>

            <!-- 定義JDBCTemplate類 -->
            <!-- 為JDBC模板注入連接池屬性 -->
            <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="dataSource" />
            </bean>
 
        </beans>

    2)第二種寫法
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns=" http://www.springframework.org/schema/beans"
            xmlns:context=" http://www.springframework.org/schema/context"
 
            <context:property-placeholder location="classpath:jdbc.properties"/>
 
            <!-- 配置C3P0連接池 -->
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="${jdbc.driver}" />
                <property name="jdbcUrl" value="${jdbc.url}" />
                <property name="user" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </bean>
 
            <!-- 定義JDBCTemplate類 -->
            <!-- 為JDBC模板注入連接池屬性 -->
            <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="dataSource" />
            </bean>
        </beans>
 
——JDBCTemplate的CRUD操作


1、為了方便Dao中注入JDBC Template,Spring為每一個持久化技術都提供了支持類。
    1)JDBC:
        org.springframework.jdbc.core.support.JdbcDaoSupport
    2)Hibernate 3.0:
        org.springframework.orm.hibernate3.support.HibernateDaoSupport
    3)iBatis:
        org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

2、編寫Dao,並繼承JdbcDaoSupport類。
    JdbcDaoSupport中提供了JDBCTemplate實例,所以在自己的Dao中不需要再定義JDBCTemplate並且提供注入了,可以直接使用getJdbcTemplate()方法來獲取實例。

3、進行CUD操作
    1)保存:update(String sql, Object ... args)
    2)修改:update(String sql, Object ... args)
    3)刪除:update(String sql, Object ... args)

4、查詢操作
    1)簡單查詢
        *   select count(*) from user
            >   queryForLong(String sql)
            >   返回一個簡單類型 
        *   select name from user where id = ?
            >   queryForObject(String sql, Class, Object...args)
            >   返回單個對象 

    2)復雜查詢
        返回對象或集合。
        *   select * from user where id = ?
            >   queryForObject(String sql, RowMapper<T> rowMapper, Object...args)
            >   返回單個對象 
        *   select * from user
            >   query(String sql, RowMapper<T> rowMapper, Object ... args)
            >   返回多個對象 

5、示例代碼


User實體類:

public class User {
    private Integer id;
    private String name;
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}

----------------------------------------------------------------------------------------------------------------------------

UserDao:

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
 
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
 
public class UserDao extends JdbcDaoSupport {
 
 
    public void add(User user) {
        String sql = "insert into user values (null, ?)";
        // 因為JdbcDaoSupport中提供了JdbcTemplate,所以可以直接get獲取
        getJdbcTemplate().update(sql, user.getName());
    }
 
    public void update(User user) {
        String sql = "update user set name = ? where id = ?";
        getJdbcTemplate().update(sql, user.getName(), user.getId());
    }
 
    public void delete(User user) {
        String sql = "delete from user where id = ?";
        getJdbcTemplate().update(sql, user.getId());
    }
 
    public long findCount(){
        String sql = "select count(*) from user";
        return getJdbcTemplate().queryForLong(sql);
    }
 
    public String findNameById(int id){
        String sql = "select name from user where id = ?";
        return getJdbcTemplate().queryForObject(sql, String.class, id);
    }
 
    public User findById(int id){
        String sql = "select * from user where id = ?";
        return (User) getJdbcTemplate().queryForObject(sql,new UserRowMapper(), id);
    }
 
    class UserRowMapper implements RowMapper<User>{
        /**
         * rs:結果集
         * rowNum:行號
         * 需要自己提供RowMapper實現,用來將記錄封裝成對象 
         */
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            return user;
        }
    }
 
    public List<User> findAll(){
        String sql = "select * from user";
        return getJdbcTemplate().query(sql, new UserRowMapper());
    }
}

----------------------------------------------------------------------------------------------------------------------------

XML配置文件:

<?xml version="1.0" encoding="UTF-8"?>
 
    <context:property-placeholder location="classpath:jdbc.properties" />
 
 
    <!-- 配置C3P0連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
 
    <!-- 定義JDBCTemplate類 -->
    <!-- 為JDBC模板注入連接池屬性 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>
 
    <bean id="userDao" class="com.wyc.spring3.demo2.UserDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
 
</beans>
 
----------------------------------------------------------------------------------------------------------------------------

測試代碼:

import java.util.List;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo2 {
 
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
 
    @Test
    // 添加
    public void fun1() {
        User user = new User();
        user.setName("王五");
        userDao.add(user);
    }
 
    @Test
    // 修改
    public void fun2() {
        User user = new User();
        user.setId(1);
        user.setName("李四");
        userDao.update(user);
    }
 
    @Test
    // 刪除
    public void fun3() {
        User user = new User();
        user.setId(1);
        userDao.delete(user);
    }
 
    @Test
    // 查詢記錄數量
    public void fun4() {
        System.out.println(userDao.findCount());
    }
 
    @Test
    // 查詢姓名
    public void fun5() {
        System.out.println(userDao.findNameById(2));
    }
 
    @Test
    // 查詢單個對象
    public void fun6() {
        System.out.println(userDao.findById(3));
    }
 
    @Test
    // 查詢全部對象
    public void fun7() {
        List<User> list = userDao.findAll();
        for (User user : list) {
            System.out.println(user);
        }
    }
}

——總結

1、配置連接池:
     1)默認連接池
    2)DBCP連接池
    3)C3P0連接池
        *   提取properties文件
2、JdbcTemplate的CRUD操作 

    Dao繼承JdbcDaoSupport之后,可以不在Dao中注入JdbcTemplate對象了,因為JdbcDaoSupport中已經定義了JdbcTemplate實例。


免責聲明!

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



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