Эта статья - знания о проблемах класса сущности и таблицах в Mybatis, принесенных вам редактором. Изучение этого урока может быстро помочь нам решить проблему конфликта различных имен поля и имен атрибутов класса объекта. Друзья, которые это нужно, давайте посмотрим!
1. Подготовьте таблицы и данные, которые будут использоваться для демонстрации
Создать таблицы заказов (order_id int Первичный ключ auto_increment, order_no varchar (20), order_price float); вставьте в ордеры (order_no, order_price) значения ('aaaa', 23); вставьте в ордеры (order_no, order_price) значения ('bbbb', 33); 22);2. Определите классы сущности
Пакет me.gacl.domain;/*** @author gacl*Определите класс объектов, соответствующий таблице заказов*/public class order {/*** Создание таблиц (order_id int primary Key auto_increment, order_no varchar (20), Order_price float);*/// Имя атрибута в классе Order Entity и в таблице поля в таблице Orders различные IT; // id ===> order_idprivate string orderno; // orderno ===> order_noprivate rogy цена; // цена ===> order_pricepublic int getId () {return id;} public void setId (int id) {this.id = id;} public String getOrderno () {return orderno;} public void setOrderno (строка orderno) {this.orderno = orderno;} public getPrice () {return Price; {this.price = price;}@overridepublic string toString () {return "order [id =" + id + ", orderno =" + orderno + ", pright =" + price + "]";}}3. Напишите тестовый код
3.1. Напишите файл отображения SQL XML
1. Создайте файл OrderMapper.xml. Содержание ordermapper.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"> задайте уникальные названия для этого. Значение пространства имен обычно устанавливается на имя файла пакета + SQL Mapping Name, так что значение пространства имен можно было гарантировать уникально
Например, namespace = "me.gacl.mapping.ordermapper" - это me.gacl.maping (имя пакета) + ordermapper (файл ordermapper.xml для удаления суффикса)
-> <mapper namespace = "me.gacl.mapping.ordermapper"> <!-Получить объект заказа на основе идентификационного запроса. Использование этого запроса не может запросить результат, который мы хотим. Это в основном связано с тем, что имя атрибута класса объектов не соответствует имени поля базы данных, поэтому соответствующая запись не может быть запрошена-> <SELECT ID = "getOrderByID" parameterType = "int" reculatype = "me.gacl.domain.order"> select * из ордеров, где order_id =#{id} </select> <! Используя этот запрос, мы обычно можем запросить результат, который мы хотим. Это связано с тем, что мы дадим запросу псевдоним с тем же псевдоним, что и имя атрибута класса объекта, так что имя атрибута класса Entity и имя поля в результате запроса может соответствовать одному за другим-> <SELECT ID = "SELECTORDE order_id =#{id} </select> <!- Получить объект заказа на основе идентификационного запроса. Используя этот запрос, мы можем запросить результат, который мы хотим обычно. Это связано с тем, что мы сопоставляем переписку между ними между именем атрибута класса объекта и именем поля таблицы через <resultMap>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- column = "order_id"/> <!-Используйте атрибут результата для карты неприемных поля ключей-> <result property = "orderno" column = "order_no"/> <result property = "price" column = "order_price"/> <result property = "цена" column = "order_price"/> <resultmap> </mapper>2. Зарегистрируйте файл отображения ordermapper.xml в файле conf.xml
<mappers> <!- Зарегистрируйте файл ordermapper.xml. Ordermapper.xml расположен в пакете me.gacl.mapping, поэтому ресурс написан как Me/Gacl/Mapping/Ordermapper.xml-> <Mapper resource = "me/gacl/mapping/ordermapper.xml"/> </mappers>
3.2. Код испытаний на единицу записи
Пакет me.gacl.test; import me.gacl.domain.order; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlsession; import org.junit.test; public clus Mybatisutil.getsqlsession ();/*** Строка идентификации для сопоставления SQL,* me.gacl.mapping.ordermapper - это значение атрибута пространства имен тега Mapper в файле Orchomapper.xml,* getorderbyid - это значение атрибута идентификатора. Через значение атрибута идентификатора выбора тега вы можете найти SQL для выполнения*/String atportion = "me.gacl.mapping.ordermapper.getorderbyid"; // Сопоставление строки идентификации SQL // Выполнить операцию запроса и автоматически инкапсулировать результат запроса в объект порядка и вернуть порядок порядок = sqlsession.selection (1) Используя SQLSession выполнить SQL, вам необходимо закрыть sqlSessionsQlSession.Close (); System.out.println (order); // Результат печати: null, то есть не было найдено соответствующей записи} @testpublic void testgetgedordordyid2 () {sqlsession sqlsession = mybatisutil.getsqlsession ();/*** Map Sql String. file ordermapper.xml, * Selectorder - это значение атрибута идентификатора тега SELECT. Через значение атрибута идентификатора вы Select Select вы можете найти SQL, который будет выполнен, используя значение атрибута идентификатора из Select Tag*/string atportion = "me.gacl.mapping.ordermapper.selectorder"; // Сопоставление строки идентификации SQL // выполнить операцию запроса и автоматически инкапс. С идентификатором 1 в таблице заказов // После выполнения SQL с использованием SQLSession вам необходимо закрыть sqlSessionsQlSession.Close (); System.out.println (order); // Результат распечатки: заказ [id = 1, orderno = aaaa, price = 23.0]}@testpublic void testgetGeDbyId3 () {sqlSession sqlsession = mybatisutil.getsqlsession ();/*** map sql string,* me.gacl.mappess.morpsession. Атрибут тега Mapper в файле OrderMapper.xml, * selectorderResultmap - это значение атрибута идентификатора тега SELECT. Через значение атрибута идентификатора из Select Select, SQL, который будет выполнен, может быть найден*/string atportion = "me.gacl.mapping.ordermapper.selectorderresultmap"; // Картирование строки идентификации SQL // Выполнение запроса и автоматически инкапсулировать результат запроса в объект порядка и return order = sqlsession.selectore (1 -й заявление////////c Таблица // После использования SQLSession для выполнения SQL вам необходимо закрыть sqlSessionsQlSession.Close (); System.out.println (order); // Результат печати: заказ [id = 1, orderno = aaaa, цена = 23,0]}}Результаты выполнения модульных тестов:
1. Метод TestgetRoderByID возвращает нуль после выполнения запроса.
2. После метода TestgetRoderByID2 и метода TestGetDordOrderByID3 выполнить запрос, вы можете получать желаемый результат нормально.
4. Резюме
Приведенный выше код теста демонстрирует проблему, что когда имя атрибута в классе объектов и имя поля в таблице не соответствуют, соответствующие результаты не могут быть запрошены при использовании Mybatis для операций запроса, и для задачи приняты два метода:
Решение 1: Определите псевдоним имени поля в операторе SQL запроса, так что псевдоним имени поля согласуется с именем атрибута класса объектов, так что имя поля таблицы может соответствовать одному с именем атрибута класса объектов. Этот метод решает отношения отображения между именем поля и именем атрибута путем определения псевдонима в операторе SQL.
Решение 2: Сопоставьте соответствие между ними между именами поля и именами атрибутов класса объекта с помощью отображения. Этот метод использует решение, предоставленное Mybatis для решения зависимости отображения между именами поля и именами атрибутов.