Сначала объясните требования. Есть три таблицы:
Таблица учащихся, таблица ролей и связанная с ней промежуточная таблица.
Студенты могут иметь несколько ролей,Но я храню эти несколько ролей как несколько записей в другой таблице.,Теперь я хочу запросить эти множество записей,Ввести вStudent
объектводинList
характеристики。
то есть наконецизStudent
объект结果应该长这样:
[
{
"id": 1,
"name": «Голубь Шуо Цзы»,
"roles": [
«Представитель класса физики»,
«Представитель математического класса»
]
}
]
Короче говоря, необходимо 1,2,3
или 1 2 3
Преобразовать в Java в List = [1,2,3]。
я могу быть внутриService
Сделайте два запроса в слое, а затем внедрите их отдельно.,Но ради элегантности,Я думаю, что только структура уровня персистентности может решить эту проблему.
Узнал здесьMybatis
框架中提供了одинтип转换器,Я могу реализовать этот интерфейс для завершения преобразования пользовательского типа.。Этот абстрактный классBaseTypeHandler
。
Сначала мне нужно написатьSQL
Воляхочуиз Запросить данные,Затем рассмотрим преобразование типов.
Оператор запроса:
SELECT stu.*,
(SELECT group_concat(r.role_name) AS roles
FROM stud_role sr
left join role r on sr.role_id = r.role_id
WHERE sr.stu_id = stu.id) AS roles
FROM student stu;
этот абзацSQL
из Результаты запроса следующие,Смысл состоит в том, чтобы объединить информацию о студенте и роль студента в строку и найти ее как одно поле.
вgroup_concat
даMysql
вфункция,существоватьOracle
Успешное применениеиспользоватьwmsys.wm_concat
добиться того жеиз Эффект。
Затем происходит преобразование типов.
выполнитьBaseTypeHandler
абстрактный класс:
package com.shuo.mpth.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.util.StringUtils;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
/**
* @author : wshuo
* @date : 2023/1/11 15:59
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({List.class})
public class ListTypeHandler extends BaseTypeHandler<List<String>> {
private static final String DELIM = ",";
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
String value = StringUtils.collectionToDelimitedString(strings, DELIM);
preparedStatement.setString(i, value);
}
@Override
public List<String> getNullableResult(ResultSet resultSet, String s) throws SQLException {
String value = resultSet.getString(s);
return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));
}
@Override
public List<String> getNullableResult(ResultSet resultSet, int i) throws SQLException {
String value = resultSet.getString(i);
return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));
}
@Override
public List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String value = callableStatement.getString(i);
return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));
}
}
SQL
Узнайте в предложенииизтип;Это первый шаг знаний.Далее нам нужно использовать его в указанном месте. Вот и использую непосредственно. @TableField
Аннотация указывает поле, которое необходимо преобразовать.
@Data
public class Student {
/**
* студенческий билет
*/
private Integer id;
/**
* имя студента
*/
private String name;
/**
* Роль, которую играет ученик
*/
@TableField(typeHandler = ListTypeHandler.class)
private List<String> roles;
}
Если не используется mybatis-plus , с использованием mybatis из xml конфигурации, затем в property Добавить в тегtypeHandler
属性да一样из Эффект。
Наконец нам нужно yml
Добавьте раздел конфигурации в файл конфигурации:
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.shuo.mpth.**.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-handlers-package: com.shuo.mpth.handler
handler
изимя пакета。Запустить проект сейчас,Запросить интерфейс,Обнаружено, что преобразование типов завершено: