В разработке проекта мы часто сталкиваемся с ситуациями, где имена поля в таблице и имена атрибутов соответствующих классов сущностей таблицы могут быть не одинаковыми. Следующий редактор продемонстрирует вам, как решить проблему конфликта различных имен поля и классов сущности в этом случае. Заинтересованные друзья будут учиться вместе.
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 (), order_price float);*/// Имя атрибута в классе Order Entity и в таблице поля. // 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 = "." Encoding = "utf-"?> <! Doctype Mapper public "-// mybatis.org//dtd Mapper .//en" "http://mybatis.org/dtd/mybatis-mapper.dtd">! Значение пространства имен обычно устанавливается на имя файла пакета + SQL Map Имя, так что значение пространства имен можно было гарантировать уникально. Например, namespace = "me.gacl.mapping.ordermapper" Is me.gacl.mapping (имя пакета) + ordermapper (ordermapper.xml-файл суффикс).
Объект заказа получается на основе идентификационного запроса. Использование этого запроса не может запросить результат, который мы хотим. Это происходит главным образом потому, что имя атрибута класса объектов не соответствует имени поля базы данных, поэтому соответствующая запись не может быть запрошена.
-> <SELECT ID = "getOrderByID" parameterType = "int" outdetype = "me.gacl.domain.order"> select * из заказов, где order_id =#{id} </select> <!- Объект заказа получается на основе идентификационного запроса. Используя этот запрос, мы обычно можем запросить результат, который мы хотим.
Это связано с тем, что мы дадим псевдоним запроса с тем же именем атрибута, что и имя атрибута класса объекта, так что имя атрибута класса объекта и имя поля в результате запроса может соответствовать одному на один.
-> <select id = "selectorder" parametertype = "int" outdetype = "me.gacl.domain.order"> select order_id id, order_no orderno, order_price цена из заказов, где order_id =#{id} </select> <!- Согласно запросу ID, мы можем получить объект заказа. Используя этот запрос, мы можем запросить результат, который мы хотим обычно. Это связано с тем, что мы сопоставляем переписку один к одному между именем атрибута класса объекта и именем поля таблицы через <resultMap>->
<select id = "selectorDerresultmap" parameterType = "int" resultMap = "orderresultmap"> select * из орденов, где order_id =#{id} </select> <!-Сопоставление переписки между именем атрибута класса объекта и названием поля таблицы через <resultmap>-mapping the countrence mathernaty vameply-name и имя поля. Свойство идентификатора-> <id property = "id" column = "order_id"/> <!-Сопоставление поля неприимного ключа с помощью свойства результата-> <result Proportment = "orderno" column = "order_no"/> <result Proportment = "price_port_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 class test {@testpublic void testgetderOrderByid () {sqlSessess sqlSession = = = Mybatisutil.getsqlsession ();/*** Строка идентификации для сопоставления SQL,* me.gacl.mapping.ordermapper - это значение атрибута пространства имен тега Mapper в файле Orchomapper.xml,* getorderbyid - это значение атрибута идентификатора. Через значение атрибута идентификатора Tag Select вы можете найти SQL для выполнения*/string atportion = "me.gacl.mapping.ordermapper.getorderbyid"; // Сопоставление строки идентификации SQL // выполнение операции запроса и автоматически инкапсулировать результат запроса в Order Order Order = sqlSession.selection. Selection Slease -Selection (утверждение); SQL, используя SQLSession, вам необходимо закрыть sqlSessionsQlSession.Close (); System.out.println (order); // Результат печати: null, то есть нет соответствующей записи} @testpublic void testgetgetordordorbyid () {sqlsession sqlsession = mybatisutil.getsqlsession ();/*** map sql string,* me.gacl. file ordermapper.xml, * Selectorder - это значение атрибута идентификатора тега SELECT. Через значение атрибута идентификатора тега SELECT вы можете найти SQL для выполнения. */String atportion = "me.gacl.mapping.ordermapper.selectorder"; // map идентификация SQL String // execute Query Operation SqlSessionSqlSession.Close (); System.out.println (order); // Печать Результат: order [id =, orderno = aaaa, price =.]}@Testpublic void testgetgegetdorbyid () {sqlsession sqlsession = mybatisutil.getsqlsession ();/*** map sql string,* me.gacl.mappermappermappess (). Тег Mapper в файле OrderMapper.xml. * selectorderResultmap - это значение атрибута идентификатора тега SELECT. Через значение атрибута идентификатора тега SELECT вы можете найти SQL для выполнения. */String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//Mapping SQL identification string//Execute query operations, and automatically encapsulate the query results into an Order object and return Order order = sqlSession.selectOne(statement,);//Query the record with id in the orders table//After using SqlSession to execute SQL, you need to close SqlSessionSqlSession.Close (); System.out.println (order); // Результат печати: order [id =, orderno = aaaa, цена =.]}}}}} Результаты выполнения модульных тестов:
1. Метод TestgetRoderByID возвращает нуль после выполнения запроса.
2. После метода TestgetRoderByID2 и метода TestGetDordOrderByID3 выполнить запрос, вы можете получать желаемый результат нормально.
4. Резюме
Приведенный выше код теста демонстрирует проблему, что когда имя атрибута в классе объектов и имя поля в таблице не соответствуют, соответствующие результаты не могут быть запрошены при использовании Mybatis для операций запроса, и для задачи приняты два метода:
Решение 1: Определите псевдоним имени поля в операторе SQL запроса, так что псевдоним имени поля согласуется с именем атрибута класса объектов, так что имя поля таблицы может соответствовать одному с именем атрибута класса объектов. Этот метод решает отношения отображения между именем поля и именем атрибута путем определения псевдонима в операторе SQL.
Решение 2: Сопоставьте соответствие между ними между именами поля и именами атрибутов класса объекта через <resultMap>. Этот метод использует решение, предоставленное Mybatis для решения зависимости отображения между именами поля и именами атрибутов.
Выше приведено учебник по обучению Mybatis, представленный вам редактором (IV) - как быстро разрешить конфликт между именами поля и именами атрибутов класса объекта. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!