少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          今天在項(xiàng)目中用了mybatis的resultMap。以前用的時(shí)候都是一些簡單的查詢,修改,分頁。這次涉及到了POJO對象之間的一對多和多對一的關(guān)系映射。

              mybatis有幾種使用方式, 我喜歡用mapper的方式,然后用spring來管理mybatis.

              開發(fā)工具是Eclipse jee, mybatis版本是3.0.5, mybatis-sprint-1.0.1

             工程文件目錄

          mybatis-config.xml 是mybatis的配置文件:

           

          <configuration>
              <settings>
                  <setting name="cacheEnabled" value="false" />
                  <setting name="useGeneratedKeys" value="true" />
                  <setting name="defaultExecutorType" value="REUSE" />
              </settings>
          	<mappers>
                  <mapper resource="com/exam/persistence/mapper/ClientMapper.xml" />
              </mappers>
          </configuration>

          applicationContext.xml:

           

          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          	<property name="dataSource" ref="dataSource" />
          	<property name="configLocation" value="/WEB-INF/mybatis-config.xml" />
          </bean>

          <bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

              <property name="mapperInterface" value="com.exam.persistence.mapper.ClientMapper" />

              <property name="sqlSessionFactory" ref="sqlSessionFactory" />

          </bean>

          配置文件就是這些了。主要的東西在下面:

          業(yè)務(wù)邏輯涉及到三張表: Client, Subscriber, Account. 其中Client表和Subscriber表是多對一的關(guān)系. Client表和Account是一對多的關(guān)系。

           在com.example.persistence.mapper目錄下,需要?jiǎng)?chuàng)建兩個(gè)文件分別是:ClientMapper.java 和 ClientMapper.xml

          對象映射關(guān)系主要在ClientMapper.xml中定義:

           

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          <mapper namespace="com.exam.persistence.mapper.ClientMapper">
              <resultMap id="clients" type="com.exam.entity.Clients">
              	<id property="externalId" column="externalId" />
              	<result property="id" column="id"/>
              	<result property="subscriptionId" column="subscriptionId"/>
              	<association property="subscription" column="subscriptionId" javaType="com.exam.entity.Subscription" select="selectSubscription"/>
              	<collection property="accounts" column="id" ofType="com.exam.entity.Accounts" select="selectAccounts"/>
              </resultMap>
              
              <select id="getClientByID" resultMap="clients" parameterType="java.lang.String">
                 select 
                     client.internal_id as id,
                     client.external_id as externalId,
                 from CLIENT client 
                      left outer join SUBSCRIPTION subscription on client.subscription_id = subscription.subscription_id
                      left outer join ACCOUNT accounts on client.internal_id = accounts.id
                  where client.external_id = #{external_id}
              </select>
              
              <select id="selectAccounts" parameterType="int" resultType="com.exam.entity.Accounts">
              	select * from ACCOUNT where client_id=#{client_id}
              </select>
              <select id="selectSubscription" parameterType="java.lang.String" resultType="com.exam.entity.Subscription">
              	select * from SUBSCRIPTION where subscription_id = #{subscription_id}
              </select>
          </mapper>

          這個(gè)xml文件定義了一個(gè)resultMap id="clients". clients里面包含了一個(gè)assoction(多對一)和一個(gè)collection(一對多). 這兩個(gè)分別對應(yīng)了兩個(gè)select id.

           ClientMapper.java是一個(gè)interface:

          import java.util.List;
          import com.exam.entity.Clients;
          public interface ClientMapper {
            public List<Clients> getClientByID(String external_id);
          }

          其中函數(shù)名"getClientByID"應(yīng)該和ClientMapper.xml中的select id的值相同。

           在com.exam.entity目錄下面需要定義Clients, Accounts, Subscription 三個(gè)POJO類。就不在這里寫POJO類了。

          這樣我們在service邏輯中就可以使用ClientMapper.

           

          public class ClientServiceImpl implements ClientService {
          	private ClientMapper clientMapper;
          
          	public ClientMapper getClientMapper() {
          		return deviceMapper;
          	}
          
          	public void setClientMapper(ClientMapper clientMapper) {
          		this.clientMapper = clientMapper;
          	}
          
                   @Override
          	public List<Clients> getClientByID(String external_id) {
          	    return getClientMapper().getClientByID(external_id);
          	}
          }我們需要在applicationContext中把clientMapper注入到這個(gè)server類中就ok了。
          先寫到這里。




          http://m.oschina.net/blog/29845
          posted on 2012-03-28 22:23 abin 閱讀(4850) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 佛坪县| 大兴区| 嘉峪关市| 德庆县| 清新县| 图们市| 灌云县| 凤凰县| 二手房| 汤阴县| 房产| 灵山县| 百色市| 万盛区| 岚皋县| 新源县| 桃园市| 花莲县| 灌阳县| 松阳县| 通河县| 榆林市| 始兴县| 连城县| 黄石市| 萍乡市| 太白县| 三门峡市| 芷江| 封丘县| 白玉县| 砀山县| 镇远县| 洞口县| 界首市| 永福县| 万州区| 临海市| 孝感市| 鄯善县| 固阳县|