Posts Tagged ‘datasource database’

Spring กับ dataSource ครับ

January 16th, 2009

บทที่แล้วเราได้ลองการสร้าง bean หรือ service แบบโง่ๆหนึ่งตัวแล้วต่อไปเราจะเริ่มเข้าโหมดทำมาหากินคือ ติดต่อกับ Database ครับโดยผมจะใช้ Database ยอดนิยม Oracle เอ้ยไม่ใช่ MySQL ในการทำงานครับ
ตัวอย่างนี้จะใช้ตารางเดียวนะครับเพื่อให้เห็นภาพง่ายๆก่อนว่าเราจะติดต่ออย่างไร ส่วนเทคนิคที่จะใช้ติดต่อก็คือ iBatis ครับเพราะผมชอบ (ฮาาาาาาาา) ง่ายครับไม่อยากเขียน JDBC และไม่อยากใช้ Hibernate เพราะ
ชอบโดน Database Admin ด่าเวลาใช้ Hibernate ว่า “เห้ย! เรียนวิชาออกแบบ Database ที่ไหนวะ ไม่ทำ Normalization” อึ้งครับดังนั้นพบกันครึ่งทาง “เมิงออกแบบ Database มา กรูเขียนตามที่เมิงต้องการแต่ขอเป็น
แบบเท่ๆหน่อย” เอาให้เต็มที่ ส่วนใครไม่รู้จัก iBatis ก็ไปอ่านเองก่อนนะครับที่ http://ibatis.apache.org
เริ่มต้นลำดับที่ 1 เขียน Test
แน่นอนอย่าลืม Concept เทพของเราคืออยากได้อะไรเขียนไว้ใน Test ก่อนแล้วค่อยไปเขียน Code ดังนั้นผมอยากได้ส่วนที่ติดต่อกับ Database ชื่อ spring66 แต่ก่อนอื่นให้เราทำความเข้าใจก่อนว่าใน spring ส่วนที่ใช้ติดต่อ
กับ Databse นั้นเราจะใช้บริการ bean ชื่อ dataSource ครับดังนั้นเราจะลองเขียน test ก่อนนะครับว่ามี dataSource แล้วหรือยัง

package com.spring66.tutorial;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;

/**
 *
 * @author TwinP
 */
public class DatasourceTest extends AbstractDependencyInjectionSpringContextTests {

    protected final Log log = LogFactory.getLog(getClass());

    @Override
    protected String[] getConfigLocations() {
        setAutowireMode(AUTOWIRE_BY_NAME);
        return new String[]{
                    "classpath:/applicationContext.xml",
                    "classpath*:/applicationContext.xml" // for modular projects
                };
    }

    public void testLoadBean() {
        Object obj = super.applicationContext.getBean("dataSource");
        log.debug("Looking for Datasource");
        assertNotNull(obj);
    }
}

จากนั้นลอง test ดูครับ
mvn test -Dtest=DatasourceTest
และแน่นอนโดนด่า เพราะไม่มี bean ชื่อนี้ครับ ทางออกคือสร้าง bean ชื่อ dataSource ที่ applicationContext.xml ครับโดยใส่รายละเอียดดังนี้

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring66"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </bean>

อ่ะมาดูรายละเอียดกันเลย class=”???” เป็นตัวจัดการ Database Connection ที่เราต้องการใช้งานโดยปกติแล้วมีให้เลือกหลายตัวแต่ DBCP เป็นตัวที่นิยมมากหน่อยครับ
driverClassName แน่นอน MySQL Driver
url = รายละเอียด server และชื่อ Database ที่เราต้องการติดต่อด้วย
usename = database username
password = database password
ครับลองอีกทีครับ run test แน่นอนผ่านครับต่อไป เมื่อมองเห็นแล้วแล้วมันต่อได้จริงหรือป่าวเนี่ยเอ่าเขียน Test โดยเพิ่มเมธอดนี้เข้าไปเพื่อทดสอบ Connection

    public void testConnection() {
        Object obj = super.applicationContext.getBean("dataSource");
        log.debug("Looking for Datasource");
        BasicDataSource bs = (BasicDataSource) obj;
        try {
            Connection con = bs.getConnection();
            DatabaseMetaData metaData = con.getMetaData();
            log.debug("MetaData->"+metaData.getDatabaseProductName());
            assertNotNull(metaData);
        } catch (Exception error) {
            log.debug("Error->"+error.toString());
            fail("Error->"+error.toString());
        }
    }

และแน่นอนโดนด่า
DEBUG [main] DatasourceTest.testLoadBean(43) | Error->org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class ‘com.mysql.jdbc.Driver’
อ่ะเนื่องจากเราอยากใช้ Driver แต่ไม่ได้กำหนดดังนั้นเราต้องเพิ่ม Driver เข้าไปใน pom.xml ครับทำโดยการเพิ่ม

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

เข้าไปครับเอ่าลอง Test ใหม่ และแล้วก็โดนด่าอีกว่าไม่เจอและไม่รู้จัก database ชื่อ spring66 และแน่นอนไปสร้างซะ
DEBUG [main] DatasourceTest.testLoadBean(43) | Error->org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Unknown database ‘spring66′)
หลังจากสร้างเส็ดลองอีกทีไม่เข็ด
ผ่านหล่อ และแน่นอนหมดแรง