今天在項目中用了mybatis的resultMap。之前用的時候都是一些簡單的查詢,修改,分頁。此次涉及到了POJO對象之間的一對多和多對一的關係映射。java
mybatis有幾種使用方式, 我喜歡用mapper的方式,而後用spring來管理mybatis.spring
開發工具是Eclipse jee, mybatis版本是3.0.5, mybatis-sprint-1.0.1 sql
mybatis-config.xml 是mybatis的配置文件: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:app
<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">ide
<property name="mapperInterface" value="com.exam.persistence.mapper.ClientMapper" />函數
<property name="sqlSessionFactory" ref="sqlSessionFactory" />工具
</bean>開發工具
配置文件就是這些了。主要的東西在下面:this
業務邏輯涉及到三張表: Client, Subscriber, Account. 其中Client表和Subscriber表是多對一的關係. Client表和Account是一對多的關係。
在com.example.persistence.mapper目錄下,須要建立兩個文件分別是:ClientMapper.java 和 ClientMapper.xml
對象映射關係主要在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>
這個xml文件定義了一個resultMap id="clients". clients裏面包含了一個assoction(多對一)和一個collection(一對多). 這兩個分別對應了兩個select id.
ClientMapper.java是一個interface:
import java.util.List; import com.exam.entity.Clients; public interface ClientMapper { public List<Clients> getClientByID(String external_id); }
其中函數名"getClientByID"應該和ClientMapper.xml中的select id的值相同。
在com.exam.entity目錄下面須要定義Clients, Accounts, Subscription 三個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注入到這個server類中就ok了。
先寫到這裏。