Простой запрос — тип результата
подготовка данных
Стол Студент
поле | Примечания |
---|---|
SNO | Студенческий билет |
SNAME | имя студента |
SSEX | Пол |
SBIRITHDAY | День рождения |
CLASS | класс |
<!--建表语句:-->
create table TEST.STUDENT
(
SNO varchar(3) not null,
SNAME varchar(4) not null,
SSEX varchar(2) not null,
SBIRTHDAY datetime null,
CLASS varchar(5) null
)
<!--Bean 文件-->
public class Student {
private String SNO;
private String SNAME;
private String SSEX;
private Date SBIRTHDAY;
private String CLASS;
<!--get 和 set 方法-->
...
}
пример
В соответствии с типом возвращаемых данных он грубо делится на основные типы данных, JavaBean и Map. Несмотря на то, что число возвращаемых строк результата может быть одиночным или множественным, а соответствующий тип возвращаемого значения интерфейса — это коллекция или отдельный объект, в файле сопоставления xml значение resultType остается тем же.
- Укажите поле — базовый тип данных
Класс интерфейса:
<!--单条结果集-->
String querySingleStudent();
<!--多条结果集-->
List<String> queryAllStudent();
Маппер файл:
<!--单条结果集-->
<select id="querySingleStudent" resultType="string">
SELECT SNAME FROM TEST.STUDENT LIMIT 1
</select>
<!--多条结果集-->
<select id="queryAllStudent" resultType="string">
SELECT SNAME FROM TEST.STUDENT
</select>
- Карта, обычно hashMap
Класс интерфейса:
<!--单条结果集-->
Map<String, Object> queryStudentMap();
<!--多条结果集-->
List<Map<String, Object>> queryAllStudentMap();
Маппер файл:
<!--单条结果集-->
<select id="queryStudentMap" resultType="hashmap">
SELECT SNAME FROM TEST.STUDENT LIMIT 1
</select>
<!--多条结果集-->
<select id="queryAllStudentMap" resultType="hashmap">
SELECT SNAME FROM TEST.STUDENT
</select>
в:
- hashmap — это сокращение, вы также можете использовать полное имя java.util.HashMap.
- По умолчанию, когда значение в результирующем наборе равно null, метод установки объекта карты не будет добавлен (установлен для объекта карты). Это поведение можно настроить в файле конфигурации mybatis-config.xml.
<setting name="callSettersOnNulls" value="true"/>
Переопределить настройки по умолчанию.
- JavaBean
Класс интерфейса:
<!--单条结果集-->
Student querySingleStudentBean();
<!--多条结果集-->
List<Student> queryAllStudentBean();
Маппер файл:
<!--单条结果集-->
<select id="queryStudentMap" resultType="student">
SELECT SNAME FROM TEST.STUDENT LIMIT 1
</select>
<!--多条结果集-->
<select id="queryAllStudentMap" resultType="student">
SELECT SNAME FROM TEST.STUDENT
</select>
- resultType="student" — это псевдоним Student.java, который также может быть полным именем. Псевдонимы задаются в конфигурационном файле mybatis-config.xml:
<typeAliases>
<typeAlias type="com.bean.Student" alias="student"/>
...
</typeAliases>
Но если есть много файлов JavaBean и вы не хотите указывать их один за другим, вы также можете использовать тег пакета для настройки автоматического сканирования mybatis, а псевдоним — это строчная буква имени класса.
<typeAliases>
<package name="包名"/>
</typeAliases>
Карта результатов сложного запроса
Для общих операторов запроса достаточно типа результата. Для многотабличных запросов и т. д. необходимо запрашивать resultMap.
Сопоставление отношений между полями базы данных и типами данных Java
Между типами полей базы данных jdbcType и типами данных java нет однозначного соответствия, и разные типы баз данных также отличаются. И mybatis использует TypeHandler как отношение отображения между ними. В большинстве случаев нет проблем, но не все случаи могут быть охвачены.В особых случаях вы можете использовать resultMap для настройки этого отношения сопоставления.
Например, тип поля базы данных LongVarchar соответствует типу String в java. Но в базе данных DB2 запрашиваемые поля типа LongVarchar идентифицируются как jdbcType как BLOB в mybatis. Есть два обходных пути: первый — использовать CAST для преобразования поля в тип VARCHAR (длина) в SQL. Другой - использовать resultMap:
<resultMap id="resultMapDemo" type="" autoMapping="true">
<result property="" column="" jdbcType="VARCHAR" />
</resultMap>
<select id="demoID" resultMap="resultMapDemo">
...
<select>
-
<select>
Используйте resultMap в теге, чтобы указать возвращаемую коллекцию. Обратите внимание, что resultMap и resultType нельзя использовать одновременно. -
<resultMap>
Этикетка- теги id и select определяют отношения сопоставления
- тип, как и resultType, является полным именем или псевдонимом возвращаемого типа.
- Отношение автоматического сопоставления autoMapping, здесь цель состоит только в том, чтобы изменить одно поле, другое автоматически использует отношение автоматического завершения сопоставления
-
<result>
Этикетка- свойство - это имя переменной java
- столбец - это имя поля базы данных
- jdbcType указывается здесь как VARCHAR
id
Существуют обе метки для отношения сопоставления полей.В документе mybatis указано, что неиспользование идентификатора приведет к снижению производительности.Поэтому рекомендуется использовать метку идентификатора для поля первичного ключа. Но если нет первичного ключа, когда вы предоставляете только некоторые поля, но не все поля в ResultMap, даже если вы используете атрибут autoMapping, тогда mybatis будет дедуплицировать в соответствии с именем поля, которое вы указали. Тогда при использовании resultMap оптимальным выбором будет:
- Если у таблицы есть первичный ключ, используйте тег id, чтобы указать
- Если в таблице нет первичного ключа, либо не настраивайте отношение сопоставления полей, либо используйте атрибут autoMapping для автоматического сопоставления, либо не используйте autoMapping для отображения всех полей.
Запрос ассоциации с несколькими таблицами
В примере с типом результата задействована только одна таблица, что делать, если в связанном запросе задействовано несколько таблиц. Мы можем просто сопоставить все столбцы с ключами хэш-карты.
Но HashMap не является хорошей моделью предметной области. Ваша программа, скорее всего, будет использовать JavaBeans или POJO (обычные старые объекты Java) в качестве моделей предметной области.
Поэтому в качестве модели предметной области здесь используется JavaBean. Добавить оценочный лист
поле | Примечания |
---|---|
SNO | Студенческий билет |
CNO | Курс № |
DEGREE | достижение |
<!--建表语句-->
create table SCORE
(
SNO varchar(3) not null,
CNO varchar(5) not null,
DEGREE decimal(10, 1) not null
)
<!--Bean 文件-->
public class Score {
private String SNO;
private String CNO;
private Double DEGREE;
<!--get 和 set 方法-->
...
}
отношение один к одному
Отношение «один ко многим» здесь — это соответствие «один к одному» между двумя полями таблицы, а оценка учащегося по определенному курсу определяется однозначно. В случае однозначного соответствия в resultMap используются метки.
Добавить поле Score в Student.java
<!--Student.java-->
private Score score;
public Score getScore() {
return score;
}
public void setScore(Score score) {
this.score = score;
}
Есть два варианта использования, первый — это вложенный запрос, в котором поля в наборе результатов предыдущего SQL-запроса передаются в качестве параметров следующему SQL-запросу. Второй случай — это вложенный набор результатов, то есть две таблицы выполняют связанный запрос, а набор результатов сопоставляется с несколькими файлами JavaBean.
- вложенный запрос
<resultMap id="allstudentResultMap" type="student">
<!--指定第二个 SELECT 语句,和传递的字段-->
<association property="score" column="sno" select="queryScore" />
</resultMap>
<!--第一个 SQL -->
<select id="queryAllStudent" resultMap="allstudentResultMap">
select SNO,SNAME
from test.STUDENT
</select>
<!--第二个 SQL-->
<select id="queryScore" resultType="score">
select degree from test.SCORE
where sno = #{sno}
</select>
на этикетке
- Свойство указывает на новое поле оценки в Student.java.
- столбец указывает поле, переданное в качестве параметра для следующего запроса SQL.Следует отметить, что в случае передачи одного поля mybatis просто заменяет #{параметр} заполнителем ?, а затем выполняет
resultSet.getString(columnName)
, сопоставление параметров не выполняется, поэтому любой символ может быть записан в #{} во втором SQL; если вам нужно передать несколько полей, используйтеcolumn = " {prop1=col1,prop2=col2} "
, и в этом случае он будет передан как объект параметра. - select указывает следующий оператор SELECT
Следует также отметить, что такой вложенный запрос не подходит для больших наборов результатов и имен столбцов.N+1Проблема в том, что следующий SQL будет выполняться N раз, чтобы зациклить запрос, более целесообразно использовать связанный запрос. Кроме того, вы также можете открыть mybatisленивый запросФункция, вложенный SQL не выполняется последовательно за один раз, а будет выполнять следующий SQL при его использовании. например, выполнитьstudent.getScore().getSNO()
будет выполнятьqueryScore
SQL. Он не включен по умолчанию и должен быть установлен в файле конфигурации.
Настройка параметров | описывать | По умолчанию |
---|---|---|
lazyLoadingEnabled | Глобальный переключатель для отложенной загрузки, состояние переключателя элемента можно переопределить, установив свойство fetchType в определенном отношении. | false |
aggressiveLazyLoading | Когда включено, любой вызов метода будет загружать все свойства объекта. В противном случае каждое свойство загружается по запросу. | неверно (верно в ≤3.4.1) |
<!--mybatis-config.xml-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
Вы также можете установить fetchType = "lazy" в теге, чтобы включить ленивую загрузку, которая переопределит настройки глобальных параметров.
- Вложенные наборы результатов
Для запросов, связанных с несколькими таблицами, в SQL обычно используются псевдонимы, чтобы избежать дублирования имен полей. Mybatis правильно сопоставляет псевдонимы со свойствами JavaBean.
<!--嵌套结果-->
<resultMap id="associationDemoMap" type="student" autoMapping="true">
<association property="score" javaType="score">
<result property="SNO" column="SC_SNO"/>
</association>
</resultMap>
<select id="queryStudentScore" resultMap="associationDemoMap">
SELECT SNAME, SSEX, CLASS, ST.SNO, SC.SNO AS SC_SNO
FROM test.student st INNER JOIN test.score sc
ON st.sno = sc.sno
where CNO = '3-105';
</select>
Отношение сопоставления между именами столбцов таблицы и атрибутами задается установкой тегов. Но если полей много, вам нужно будет указать их по одному.columnPrefix
свойство, указывающее префикс псевдонима, чтобы можно было повторно использовать resultMap
<resultMap id="associationDemoMap" type="student" autoMapping="true">
<!--columnPrefix 指定别名的前缀-->
<association property="score" resultMap="anotherMap" columnPrefix="SC_" />
</resultMap>
<!--方便重用-->
<resultMap id="anotherMap" type="score" autoMapping="true">
</resultMap>
отношение один ко многим
В дополнение к связи «один к одному» существует также связь «один ко многим», например, здесь студент соответствует оценкам нескольких курсов. В случае соответствия «один ко многим» используйте метки в resultMap. Сначала вам нужно настроить взаимосвязь между двумя таблицами в файле JavaBeans.
<!--Student.java-->
private List<Score> score;
public List<Score> getScore() {
return score;
}
public void setScore(List<Score> score) {
this.score = score;
}
Возьмите вложенные наборы результатов в качестве примера
<resultMap id="collectionDemoMap" type="student" autoMapping="true">
<!--多出了 ofType 属性-->
<collection property="score" ofType="score">
<result property="SNO" column="SC_SNO"/>
</collection>
</resultMap>
<select id="queryStudentScore" resultMap="collectionDemoMap">
SELECT SNAME,SSEX,CLASS,ST.SNO,SC.SNO AS SC_SNO
FROM test.student st INNER JOIN test.score sc
ON st.sno = sc.sno
</select>
Обратите внимание, что существует еще один атрибут ofType, помимо ассоциации, который используется для представления типа в коллекции List. Использование других свойств такое же, как ассоциация.