#java #mybatis
#java #mybatis
Вопрос:
Я сложен. Я хотел бы заменить прямое использование sql в пользу mybatis faramework. Я хотел бы выбрать список учетных записей с заполненной картой свойств.
Но давайте начнем с самого начала, с первого класса учетной записи
public class Account {
private int id;
...
private Map<String, String> properties;
...
//setters / getters
}
Интерфейс Mapper для учетной записи очевиден, и файл сопоставления содержит выборки
<select id="getAccountById" resultMap="account">
select ... from account where id = #{id}
</select>
<select id="getAccountProperties" resultType=map>
select * from properties where id=#{id}
</select>
Первый выбор возвращает объект Account, второй java.util.Карта содержит пару имя столбца / значение.
Я хотел бы, чтобы каждый объект учетной записи содержал карту со свойствами, поэтому я перебираю список учетных записей и выбираю его свойства по идентификатору
for(Account account : accountList) {
int id = account.getId();
Map properites = mapper.getAccountProperties(id);
account.setProperties(properties);
}
И в принципе это работает, но для 200 учетных записей это занимает около 2 минут, и это неприемлемо.
Я надеюсь, что использование resultMap
with collection
ускорит его. Но вопрос в том, как это сделать. Как должно resultMap="account"
выглядеть
<resultMap id="account" type="Account">
<id property="id" column="id">
...
<collection property="properties" javaType="map" column="id" select="getAccountProperties" />
</resultMap>
В этом случае выбранный объект учетной записи не содержит никаких свойств.
Большой вопрос: как связать свойства с объектом account?
Ответ №1:
Если вы используете следующую результирующую карту
<resultMap id="account" type="Account">
<result property="id" column="id">
<result property="properties" column="id" select="getAccountProperties" />
</resultMap>
Затем для каждой учетной записи MyBatis выполняет оператор getAccountProperties, передающий значение идентификатора столбца в качестве параметра, но вы должны разрешить принимать его в теге select:
<select id="getAccountProperties" resultClass="java.util.Map" parameterClass="java.lang.Integer" >
select * from properties where id=#value#
</select>