Ibatis跟Spring的讲解

2010-05-26  林子新 

一、pom.xml加入spring、ibatis的依赖关系

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring</artifactId>

       <version>2.5.6</version>

</dependency>

<dependency>

        <groupId>org.apache.ibatis</groupId>

        <artifactId>ibatis-sqlmap</artifactId>

        <version>2.3.0</version>

</dependency>
.

二、编写ibatis的sql映射文件user.xml(文件名自定)

.
该文件包含了user这一实体涉及到的所有增删改查的SQL语句。
如:
.

三、编写ibatis配置文件sqlMapConfig.xml(文件名自定)

.       
该文件说明sql映射文件位置(引入上述的user.xml)。
因需使用spring框架,所以其数据源具体的配置信息放入spring的配置文件,此文件中指明数据源bean名称即可。:

<sqlMapConfig>

        <sqlMap resource=“user.xml” />

</sqlMapConfig>

  <property name=”dataSource”>
  <ref bean=”dataSource”/>
  </property>
.

四、编写spring配置文件applicationContext.xml(文件名自定)

.
该文件包含了ibatis的配置,数据源配置,程序DAO层、Action层、Service层等的配置。

(1)ibatis配置,如:

<bean id=“sqlMapClient” class=“org.springframework.orm.ibatis.SqlMapClientFactoryBean”>

     <property name=“configLocation”>

           <value>classpath:sqlMapConfig.xml</value>

       </property>

</bean>

(2)数据源配置,如:

    <bean id=“dataSource”

class=“org.springframework.jdbc.datasource.DriverManagerDataSource”>

       <property name=“driverClassName”>

           <value>com.mysql.jdbc.Driver</value>

       </property>

       <property name=“url”>

           <value>jdbc:mysql://localhost/test</value>

       </property>

       <property name=“username”>

           <value>root</value>

       </property>

       <property name=“password”>

           <value>test</value>

       </property>

</bean>

(3)程序bean的配置,如user的DAO、Action、Service:

<bean id=“userDAO” class=“com.taobao.login.dao.impl.UserDAOImpl”></bean>

    <bean id=“userAction” class=“com.taobao.login.action.UserAction”></bean>

<bean id=“userService” class=“com.taobao.login.service.impl.UserServiceImpl”></bean>

参数介绍 

1)   id: 可自定义,但需保证唯一性;程序中引用id值即可。

2)   property:配置具体属性;

3)   value:具体的属性值;

4)   class: 指定bean关联的类,全路径;

5)   name: 类中需引用的方法名;对该class中指定name的set方法,传入value的值。

 

———————————————————————————–
上述文件也可进行下优化处理: 

PS1为了使applicationContext.xml文件更清晰可读,

可以把各类的配置文件,分成若干个spring文件,再在总的applicationContext.xml文件中import其它几个spring配置文件。

如:

<import resource=“spring-dataSource.xml”/>

    <import resource=“spring-ibatis.xml”/>

<import resource=“spring-user.xml”/>

PS2上述配置文件中会使用到一些常量值,如数据源、用户名、密码等,可再抽取成jdbc.properties文件统一赋值管理,其它文件中客户可使用 ${} 来引用该变量值。

    <bean id=“dataSource”

class=“org.springframework.jdbc.datasource.DriverManagerDataSource”>

       <property name=“driverClassName”>

           <value>${jdbc.driverClassName}</value>

       </property>

       <property name=“url”>

           <value>${jdbc.url}</value>

       </property>

       <property name=“username”>

           <value>${jdbc.username}</value>

       </property>

       <property name=“password”>

           <value>${jdbc.password}</value>

       </property>

</bean>

PS3jdbc.properties文件路径是在applicationContext.xml中配置,

如下段代码表示取classpath路径下的jdbc.properties文件<匹配本地项目工程目录/target下的所有文件>)

    <bean id=“propertyConfigurer”
class=“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”>

       <property name=“locations”>

           <list>

              <value>classpath:jdbc.properties</value>

           </list>

    </property>

</bean>
————————————————————————————
.

五、编写web.xml

.
Web工程,可以直接在项目工程中的web.xml文件里引入spring的总配置文件,再加入spring监听即可,如:

    <context-param>

       <param-name>contextConfigLocation</param-name>

       <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

    <listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>
.

六、程序中使用

.
经过上述5个步骤,即已成功配置spring+ibatis框架,至于程序中如何使用,可参见下方例子:

//声明bean ,其中sqlMapClient必须和spring配置文件中的id保持一致

//如是继承类,只需在父类中声明即可,子类中可直接使用

protected SqlMapClient sqlMapClient;

//注入bean属性,spring通过setter注入,利用setter方法的属性来配置属性值

public void setSqlMapClient(SqlMapClient sqlMapClient) {

       this.sqlMapClient = sqlMapClient;

}  

//bean使用,此时不需要再实例化sqlMapClient,可以直接使用该对象

public UserDO insertUser(UserDO userDO){

       try {

           sqlMapClient.insert(“insertUser”,userDO);

           return userDO;

       } catch (SQLException e) {

           e.printStackTrace();

       }

       return null;

    }

 

Spring的功能很强大,随便google一下,就可以搜出一堆的优点介绍,但偶暂时未体会到那么多,因为应用场景也小,现在暂时体会到的Spring几个好处是: 

1.  可以实现控制反转。

直白点的理解是通过一个配置文件集中控制程序,达到不用修改代码即可改变程序功能的作用(配置过的部分才起作用)。

2.  可以实现AOP面向方面编程。

直白点的理解 类似于公共业务处理,有些模块都需要处理同一业务,可以使用spring来控制,不用在每个模块中 再去剖析或编写这些公共业务的代码。

相当于对程序里部分功能,做了一个横向管理。

3.  方便解耦,简化开发。

不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用

使用最明显的一点是使用配置过的对象时,程序中声明后即可直接使用,不用再实例化出一对象,提高开发效率。

  

【问题】:在测试TOPAPI的过程中,使用过@Resource标签功能来注入bean属性,即:

// 自动注入 bean名称为 userService的 Bean
@Resource
private UserService  userService;

 但在此工程中@Resource功能无法体现,编译时总是报空指针错误,应该未注入成功Why?
.
【原因】spring容器中缺少一个负责处理这些注释的 BeanPostProcessor的bean.导致@Resource无效
【解决方法】spring配置文件中加入

<bean class=”org.springframework.context.annotation.CommonAnnotationBeanPostProcessor”/>

即可。

492°/4902 人阅读/2 条评论 发表评论

王恩建  2010-05-26

ibatis乔迁到google code并改名mybatis了。


林子新  2010-05-26

还请多多指教啦


登录 后发表评论