Встроенные методы для Mapper
Модельный слой является классом сущностей, соответствующим таблице базы данных. Уровень контроллера представляет собой сервлет, который в основном отвечает за управление процессом бизнес -модуля, вызов метода интерфейса сервиса, а в Struts2 является действием. Служба в основном делает логические суждения, а уровень DAO - это уровень доступа к данным, который подключается к базе данных. Что касается Mapper, файл отображения Mapper используется в слое DAO.
Вот описание встроенного метода Mapper:
1. Countbyexample ===> Запрос количества в соответствии с условиями
int countbyexample (пример Userexample); // Ниже приведен полный список случаев. Userexample example = new userexample (); Критерии критериев = пример.createCriteria (); Criteria.andusernameequalto ("Джо"); int count = userdao.countbyexample (пример); Эквивалентно: выберите счет (*) от пользователя, где username = 'Джо'
2. DeleteByexample ===> Удалить несколько элементов в соответствии с условиями
int deleteByexample (пример Accountexample); // Ниже приведен полный случай userexample avest = new userexample (); Критерии критериев = пример.createCriteria (); Criteria.andusernameequalto ("Джо"); userdao.deletebyexample (пример); эквивалентно: удалить из пользователя, где username = 'Joe' 3. deleteByprimarykey ===> Удалить один элемент в соответствии с условиями
int deleteByprimarykey (INTEGER ID); USERDAO.DELETEBYPRIMARYKEY (101);
Эквивалентно:
Удалить из пользователя, где идентификатор = 101
4. Вставьте ===> Вставьте данные
int insert (запись учетной записи); // Ниже приведено полное использование CASE USER = NEW user (); //user.setid(101); user.setusername ("test"); user.setpassword ("123456") user.setemail ("[email protected]"); userdao.insert (пользователь);Эквивалентно:
Вставьте в пользовательские (ID, имя пользователя, пароль, электронная почта) значения (101, 'test', '123456', '[email protected]');
5. INSERTSELESTECTIOD ===> Вставьте данные
int insertselective (запись учетной записи);
6. SelectByExample ===> Данные запроса на основе условий
Список <clouck> selectByExample (пример AccountExample); // Ниже приведен полный случай userexample affer = new userexample (); критерии критериев = пример.createcriteria (); criteria.andusernameequalto ("joe"); Criteria.andusernameisnull (); пример. Setorderbyclause ("username asc, email descept"); Пользователь, где username = 'Joe' и имя пользователя - это нулевый порядок по имени пользователя ASC, электронная почта // Примечание: файл userExample.java, сгенерированный ibator, содержит статические критерии внутреннего класса. Существует много методов в критериях, в основном для определения условий запроса после утверждения SQL, где.7. selectByPrimaryKey ===> Данные запроса на основе первичного ключа
Учетная запись selectByPrimaryKey (IDEGER ID); // эквивалентный для выбора * из пользователя, где id = идентификатор переменной
8.
int updateByExampleSelective (@param ("record") запись учетной записи, @param ("Пример") пример Accountexample); // Ниже приведен полный список корпусов userexample avest = new userexample (); Критерии критериев = пример.createCriteria (); Criteria.andusernameequalto ("Джо"); Пользователь пользователь = новый пользователь (); user.setpassword ("123"); userdao.updatebyprimarykeyseelective (пользователь, пример); эквивалент: обновить пользователь установить пароль = '123', где username = 'Joe'
9.
int updatebyexample (@param ("record") запись учетной записи, @param ("Пример") пример Accountexample);10.
int updateByPrimaryKeySelective (запись учетной записи); // Ниже приведен полный случай пользователя CASE = new user (); user.setId (101); user.setPassword ("joe"); userdao.updatebyprimarykeyseelective (user);Эквивалентно:
Обновить пользователь установить пароль = 'Joe', где id = 101
int updateByPrimaryKeySelective (запись учетной записи); // Ниже приведено полный случай user user = new user (); user.setid (101); user.setpassword ("joe"); userdao.updatebyprimarykeyseelective (user);Эквивалентно: обновить пользователь установить пароль = 'Joe', где id = 101
11. UpdateByPrimaryKey ===> Нажмите первичную клавишу, чтобы обновить
int updateByPrimaryKey (запись учетной записи); // Ниже приведено полный случай пользователя CASE = new user (); user.setid (101); user.setusername ("Джо"); user.setpassword ("Джо"); user.setemail ("[email protected]"); userdao.updatebyprimarykey (пользователь);Эквивалентно:
Обновить пользователь настроен username = 'Joe', password = 'joe', email = '[email protected]', где идентификатор = 101
int updatebyprimarykey (запись учетной записи); // Следующее приведено полное использование пользователя Case = new user (); user.setid (101); user.setusername ("Джо"); user.setpassword ("Джо"); user.setemail ("[email protected]"); userdao.updatebyprimarykey (пользователь);Эквивалентно:
Обновить пользователь настроен username = 'Joe', password = 'joe', email = '[email protected]', где идентификатор = 101
Анализ файла конфигурации XML Mapper
Давайте посмотрим, как Mybatis читает файл конфигурации XML Mapper и анализирует операторы SQL в нем.
Мы до сих пор помним, как настройка SQLSessionFactory, как это:
<bean id = "sqlSessionFactory"> <name = "dataSource" ref = "dataSource"/> <name = "configlocation" value = "classPath: configuration.xml"> </properation> <name = "mapperlocations" value = "classpath: com/xxx/mybatis/mapper/*. value = "com.tiantian.mybatis.model" /> < /bean>
Вот свойство Mapperlocations, которое является выражением. SQLSessionFactory будет читать все файлы формата XML под пакетом com.xxx.mybaits.mapper в соответствии с этим выражением. Итак, как вы прочитали файл конфигурации на основе этого атрибута?
Ответ приведен в методе BultSQlSessionFactory в классе SQLSessionFactoryBean:
if (! isempty (this.mapperlocations)) {for (resource mapperlocation: this.mapperlocations) {if (mapperlocation == null) {продолжить; } try {xmlmapperbuilder xmlmapperbuilder = new xmlmapperbuilder (mapperlocation.getInputStream (), configuration, mapperlocation.toString (), configuration.getSqlFragments ()); xmlmapperbuilder.parse (); } catch (Exception e) {Throw New IndestioException («Не удалось проанализировать отображение ресурса: '" + mapperlocation + "'", e); } наконец {errorContext.Instance (). Reset (); } if (logger.isdebugenabled ()) {logger.debug ("Парсированный файл mapper: '" + mapperlocation + "'"); }}}Mybatis использует экземпляр класса Xmlmapperbuilder для анализа файлов конфигурации Mapper.
public xmlmapperbuilder (считывающий устройства для чтения, конфигурация конфигурации, строковый ресурс, карта <строка, xnode> sqlfragments) {this (новый Xpathparser (читатель, True, configuration.getVariables (), новый xmlmapperentityResolver ()), конфигурация, ресурс, sqlfragments); } private xmlmapperbuilder (xpathparser sancer, конфигурация конфигурации, строковый ресурс, map <string, xnode> sqlfragments) {super (configuration); this.builderassistant = new MapperBuilderAssistant (Configuration, Resource); this.parser = parser; this.sqlfragments = sqlfragments; this.resource = resource; }Затем система вызывает метод разбора XMLMapperBuilder для анализа Mapper.
public void parse () {// Если объект конфигурации не загружал файл конфигурации XML (избегание дубликатной загрузки, на самом деле это фактически, чтобы подтвердить, были ли свойства и содержание узла Mapper, // подготовка к разделению его дочерних узлов, таких как Cache, SQL, Select Resultmap, Parametermap, / / / / /c для загрузки if (! configuration.isresourceloaded (resource)) {configurationelement (parser.evalnode ("/mapper")); Configuration.AddLoadEdResource (ресурс); bindmapperfornamespace (); } // Проанализируйте узел <srodemap>, который не был обработан при обработке ResultMap в функции ConfigurationElement. parsependingresultmaps (); // Проанализируйте узел <cache>, который не существует при обработке Cache-Ref в функции ConfigurationElement (это произойдет, если кэш-REF загружается перед узлом кэша, на который он указывает) parsependingCharefs (); // То же, что и выше, если кэш не загружен, исключение также будет брошено при обработке оператора ParsePendingStatements (); }Процесс анализа Mybatis, разворачивающегося XML -файла Mapper, уже очень очевиден. Давайте посмотрим на то, как он анализирует карту:
private void configurationelement (xnode context) {try {// Получить атрибут пространства имен пространства узла Mapper Node -пространство = context.getStringTtribute ("пространство имен"); if (namespace.equals ("")) {бросить новое builderexception ("Пространство имен Mapper не может быть пустым"); } // Установить текущие имена пространства BuilderAssistant.setCurrentNamespace (пространство имен); // Проанализируйте узел Mapper <Cache-Ref> CachereFelement (context.evalnode ("cache-ref")); // Проанализируйте Mapper's <CheCh> узловой cacheElement (context.evalnode ("cache")); // Проанализируйте Mapper's <Parametermap> node parametermapelement (context.evalnodes ("/mapper/parametermap")); // Проанализируйте Mapper's <SlustMap> node -resultmapelements (context.evalnodes ("/mapper/resultmap")); // Проанализируйте Mapper's <sql> node sqlelement (context.evalnodes ("/mapper/sql")); // Использование объекта xmlStatementBuilder для анализа Mapper <select>, <soSert>, <pulte>, <ledete> узлов, // mybaits будут использовать класс MapedStatement.Builder для создания объекта сопоставления, // SQL в MyBaits соответствует карту StateTation. BuildStatementFromContext (context.evalnodes ("select | inful | update | delete")); } catch (Exception e) {бросить новое builderexception ("mapper mapper xml. Причина:" + e, e); }}Функция ConfigurationElement анализирует почти все дочерние узлы в узле Mapper. На этом этапе MyBaits анализирует все узлы в Mapper и добавляет их в объект конфигурации для объекта SQLSessionFactory, который будет использоваться в любое время. Здесь нам нужно добавить некоторое объяснение того, как MyBaits использует функцию ParsEStatementNode объекта класса XmlStatementBuilder, чтобы одолжить AddMampedStatement of MapperBuilderAssistant Object BuilderSaving, чтобы проанализировать отображение и связать его с объектом класса конфигурации: объект класса конфигурации:
public void parsestatementNode () {// атрибут ID string id = context.getStringTtribute ("id"); // база данных ATTRIBTION String DatabaseId = context.getStringTtribute ("DatabaseId"); if (! databaseidMatchescurrent (id, databaseid, this.requiredDataBaseid)) {return; } // fetchSize attribute integer fetchSize = context.getIntatribute ("fetchSize"); // атрибут тайм -аута integer timeout = context.getIntattribute ("Timeout"); // parametermap string string parametermap = context.getStringTtribute ("parametermap"); // parametertype string string parametertype = context.getStringTtribute ("parameterType"); Class <?> ParameterTyPeclass = ResolvAlss (ParameterType); // resultMapt attruit string resultmap = context.getStringTtribute ("resultMap"); // resultType attruit string resultType = context.getStringTtribute ("ResultType"); // атрибут lang string lang = context.getStringTtribute ("lang"); Languagedriver langdriver = getlanguagedriver (lang); Class <?> ResultTyPeclass = ResolVEClass (RESTORYTYPE); // resultyType attrubity structionType = context.getStringTtribute ("ResultSetType"); AtportionType atportiontype = aturnytype.valueof (context.getStringTtribute ("aturnytype", athouttype.prepared.tostring ())); ResultSettype resultyTypeEnum = ResolveResultSetType (ResultSetType); String nodeName = context.getNode (). GetNodeName (); Sqlcommandtype sqlcommandtype = sqlcommandtype.valueof (nodename.touppercase (locale.english)); // Это A <select> node boolean isselect = sqlcommandtype == sqlcommandtype.select; // атрибут flushCache boolean flushCache = context.getBooleAnattribute ("flushCache" ,! isselect); // usecache атрибут boolean usecache = context.getbooleanattribute ("usecache", isselect); // Результат атрибута Boolean ResultOrdered = context.getBooleAnattribute ("ResultOdered", false); // Включите фрагменты перед анализом xmlincludetransformer includeparser = new xmlincludeTransformer (конфигурация, Builderassistant); IncludeParser.applyincludes (context.getNode ()); // parse selectKey после включения и удаления их. ProcessSelectKeyNodes (ID, ParameterTyPeclass, Langdriver); // Проанализируйте SQL (Pre: <selectKey> и <clact> были проанализированы и удалены) sqlSource sqlSource = langdriver.createSqlSource (конфигурация, контекст, параметрический размер); // ResultSets свойства String Resultsets = context.getStringTtribute ("ResultSets"); // свойство KeyProperty String keyProperty = context.getStringTtribute ("keyProperty"); // KeyColumn свойства string keyColumn = context.getStringTtribute ("keyColumn"); Keygenerator Keygenerator; String keyStatementId = id + selectKeyGenerator.select_key_suffix; keyStatementId = BuilderAssistant.ApplyCurrentNamespace (KeyStatementId, True); if (configuration.haskeygenerator (keystatementId)) {keyGenerator = configuration.getKeyGenerator (keyStateMentId); } else {// useGeneratedKeys attribute keygenerator = context.getBooleAnattribute ("useGeneratedKeys", configuration.IsuseGeneratedKeys () && sqlCommandType.insert.equals (sqlCommandType))? new jdbc3keygenerator (): new nokeygenerator (); } builderassistant.AddmappedStatement (id, sqlSource, athusttype, sqlCommandType, FetchSize, Timeout, Parametermap, ParameterTypeclass, ResultTyPeclass, ResultTyTyPeenum, FlushCache, UseCache, ResultOrdered, KeyGenerator, KeyProperty, KeyCOLUNM, DataBaseId, DataBaseId, LangaSiver, DataBaseId, DataBaseId, Ressuldiver; } Из приведенного выше кода мы видим, что MyBaits использует xPath для анализа файла конфигурации Mapper, а затем создает ResultMap, Parametermap, Cache, оператор и другие узлы в нем, используя связанный строитель и связывает полученный объект в объект конфигурации. Этот объект конфигурации может быть получен из SQLSession, который объясняет проблему того, как MyBaits получает Mapper, и выполняет операторы SQL в нем, когда мы используем SQLSession для работы с базой данных.