مقدمة إلى MyBatis
تم تسوية MyBatis من قبل Ibatis ، وهو إطار خرائط لاستمرار البيانات (ORM) القائم على جافا.
MyBatis عبارة عن تغليف لـ JDBC ، مما يسمح للمطورين بالتركيز فقط على SQL نفسه دون إنفاق الكثير من الجهد لمعالجة التعليمات البرمجية الإجرائية JDBC مثل تسجيل السائقين ، وتحديد المعلمات ، وإنشاء اتصال/بيان ، وتجهيزات التحديد ، وما إلى ذلك.
MyBatis هو إطار ثبات من الدرجة الأولى مع دعم SQL المخصص ، والإجراءات المخزنة والتعيينات المتقدمة. يزيل MyBatis جميع كود JDBC تقريبًا والإعداد اليدوي للمعلمات واسترجاع النتائج. يمكن لـ MyBatis استخدام XML البسيط أو التعليقات التوضيحية للتكوين والخريطة البدائية ، وواجهات MAP و Java Pojos (كائنات Java القديمة العادية) إلى سجلات قاعدة البيانات.
عنوان مشروع MyBatis/الوثائق عبر الإنترنت.
أولا لقاء mybatis
يتطلب استخدام MyBatis إضافة التبعيات التالية في pom.xml:
<code> <redency> <rouplency> org.mybatis </rougiD> <StifactId> mybatis </shintifactid> <sople> 3.3.0 </version> </sependency> <reperency> <roupiD> mysql </rougled> <StifactId> mysql-connector-java </ethifactid> <splement> </version </soldency </soldenced>
يختار
تكوين mybatis/mybatis-configuration.xml
كملف التكوين العالمي لـ MyBatis ، يتم تكوينه بمعلومات البيئة التي تعمل بها MyBatis (مثل ملف مصدر البيانات/ملف Mapper ، إلخ).
<code> <code> <!-{cke_protected} {c} ٪ 3c! ٪ 2d ٪ 2d ٪ 3fxml ٪ 20version ٪ 3d ٪ 221.0 ٪ 22 ٪ 20encoding ٪ 3d ٪ 22UTF-8 ٪ 22 ٪ 20 ٪ 3f 2d 2d 2d 3e-> id = "development"> <!-{cke_protected} {c} ٪ 3c! ٪ 2d ٪ 2d ٪ 20 ٪ E9 ٪ 85 ٪ 8d e7 ٪ bd ٪ aejdbc ٪ e4 ٪ ba ٪ 8b ٪ e5 ٪ 8a ٪ a1 ٪ e7 ٪ a1 ٪ e7 ٪ 90 ٪ 86 ٪ 2d ٪ 2d ٪ 3e type = "jdbc"> <!-{cke_protected} {c} ٪ 3c! ٪ 2d 2d ٪ 20 ٪ E9 ٪ 85 ٪ 8d ٪ e7 ٪ bd ٪ ae ٪ e6 ٪ 95 ٪ b0 ٪ e6 ٪ 8d 8d ae ٪ e6 ٪ 90 ٪ 2d ٪ 2d 2d 3e- value = "com.mysql.jdbc.driver"> <property name = "url" value = "jdbc: mysql: // host: port/db؟ value = "password"> </swerperation> </soppormal> </property> </dataSource> </stallctactionManager> </ Ke_protected} {C} ٪ 3C! ٪ 2d ٪ 2d ٪ 20 ٪ E5 ٪ 8a ٪ A0 ٪ E8 ٪ BD ٪ BDMAPPER ٪ E6 ٪ 98 A0 ٪ E5 ٪ B0 ٪ 84 ٪ E6 ٪ 96 ٪ 87 ٪ E4 ٪ B6 ٪ 20 ٪ 2D ٪ 2D 3E-> mappers> <mapper Resource = "mybatis/mapper/userDao.xml"> </papper> </nygrespers> </ispicturation> </code>كتابة userdao (خريطة Mapper)
تم تكوين الجزء الأكثر جوهرية من MyBatis مع عبارات SQL التي تعمل على تشغيل قاعدة البيانات:
<code> <code> <code> <!-{cke_protected} {c} ٪ 3c! ٪ 2d 2d 2d ٪ 3fxml ٪ 20version ٪ 3d ٪ 221.0 ٪ 22 ٪ 20encoding ٪ 3d ٪ 22utf-8 ٪ 22 ٪ 20 ٪ 3f 2d 2d 2d ٪ 3e-> parametertype = "java.lang.integer" resulttype = "com.fq.domain.user"> حدد * من المستخدم حيث id = #{id} ؛ </select> <select id = "selectUserByName '٪ $ {value} ٪' ؛ </select> </mapper> </code> </code> وصف السمة
مساحة اسم مساحة الاسم ، تستخدم لعزل عبارات SQL
تحدد ParameterType نوع تعيين إدخال SQL ، ويحصل MyBatis على معلمات من كائن الإدخال من خلال ognl لتمرير بيانات SQL.
تحدد ResultType نوع تعيين إخراج SQL. يقوم MyBatis بتعيين صف من سجلات استعلام SQL إلى النوع المحدد بواسطة ResultType.
يتضمن اسم ملف تعيين Mapper userdao.xml/usermapper.xml/user.xml ونماذج أخرى. يتم تخزينها بشكل عام في دليل Mapper من نفس المستوى مثل mybatis-configuration.xml. نظرًا لأن وظيفتها الرئيسية هي تحديد العلاقة بين عبارات SQL والتعيين ، فهي تسمى بشكل جماعي ملفات رسم الخرائط Mapper.
تحديد فئة PO
الوظيفة الرئيسية لفئة PO هي SQL (الإدخال/الإخراج) ، والتي عادة ما تتوافق مع جداول قاعدة البيانات:
<code> <code> <code> <code> <code>/*** Author Jifang*since 15/12/31 2:27 PM.*/مستخدم الفئة العامة {معرف integer الخاص ؛ اسم سلسلة خاصة ؛ كلمة مرور public ؛ this. {return id ؛} public void setId (integer id) {this.id = id ؛} السلسلة العامة getName () {return name ؛} public void setName (اسم السلسلة) {this.name = name ؛ + "id =" + id + "، name = '" + name +'/'' + "، password = '" + password +'/'' + '}' ؛}} </code> </code> </code> </code>userdao (كائن Java)
احصل على SQLSession ، وتنفيذ عبارات SQL ، واحصل على نتيجة رسم الخرائط:
<code> <code> <code> <code> <code> <code> <code>/*** author jifang*since 16/2/24 6:15 pm. sqlsessionfactorybuilder (). build (resources.getResourCeasStream (Resource)) ؛}@testpublic void selecterbyid () {try (sqlsession session = factory.opensession ()) {user user = session.selectone ("namepace.selectuserbyid" ، 1) SelectUserByName () {try (SQLSession Session = Factory.OpenSession ()) {list <Sether> users = session.selectlist ("namepace.selectuserbyName" ، "student") ؛ لـ (المستخدم المستخدم: المستخدمون) {system.out.println (user) ؛}}}} </suster> </code> </code> </code> </code> </code>أدخل
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "insertuser" parametertype = "com.fq.domain.user"> insert في user (name ، كلمة المرور) القيم ( #{name} ، #{password}) ؛ <////code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> testpublic void insertUser () {try (sqlsession session = factory.opensession ()) {user user = new = new ( user () ؛ user.setName ("new_name1") ؛ user.setPassword ("new_password") ؛ session.insert ("namepace.insertuser" ، user) ؛ session.commit () ؛}} </code> </code> العودة عن طريق المفتاح الأساسي التلقائي
قم بتعديل ملف Mapper وإضافته ، ويمكنك إرجاع المفتاح الأساسي للمواد التلقائية لـ MySQL (أي المعرف الذي تم إنشاؤه عند إدراج البيانات فقط):
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <sereert id = "insertuser" parametertype = "com.fq.domain.user"> <seleckey keyproperty = "ider" بعد "resulttype =" javape> ediveed expanteed last_insert_id () ؛ </selectekey> إدراج في قيم المستخدم (الاسم ، كلمة المرور) ( #{name} ، #{password}) ؛ </sert> </code> </code> </code> </code> </code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> testpublic void insertuser () "new_password") ؛ session.insert ("namespace.insertuser" ، user) ؛ // تحتاج إلى الحصول على session session.commit ()يمكن إكمال هذه الوظيفة أيضًا من خلال خصائص usegeneratedkeys/keyproperty ، يرجى الرجوع إلى وثائق MyBatis للحصول على التفاصيل.
تحديث
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <update id = "updateUserbyid" parametertype = "com.fq.domain.user"> تحديث اسم المستخدم = #{name} ، password = # #{id} ؛ </update> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> testpublic updateUserById () {try (sqlsession session = factory.opensession (true)) "feiqing" ، "icy5yqxzb1uwwswcvlsnlca ==") ؛}} </code> </code> </code> </code> </code> </code> </code> </code> </code>يمسح
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> #{id} ؛ </delete> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> testpublic void deleteuserbyid () {try (sqlsession session = factory. {session.delete ("namepace.deleteuserbyid" ، 51615) ؛}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>ملخص
#{}/$ {}
#{}: يمثل العنصر النائب ، ويطبق تعيين قيمة على العنصر النائب المعدل ( #{} يمثل عنصرًا نائبًا؟) ، ويحول نوع Java تلقائيًا إلى نوع JDBC (لذلك يمكن #{} منع حقن SQL بشكل فعال). يمكن أن يتلقى #{} قيم سمة من النوع البسيط أو PO. إذا قام المعلمة بنقل قيمة نوع بسيط واحد ، فيمكن أن يكون #{} أسماء أو أسماء أخرى في أقواس #{} المجعد. يمكن استخدام $ {} لصق السلاسل SQL. يمكن تقطيع محتوى المعلمة في SQL دون تحويل نوع JDBC. يمكن استخدام $ {} لتلقي قيم سمة Simple Type أو PO. إذا قام ParameterType بنقل قيمة نوع بسيط واحد ، فيمكن استخدام $ {} فقط للقيمة في أقواس $ {} المجعد.
على الرغم من عدم قدرة $ {} على منع حقن SQL ، إلا أن $ {} في بعض الأحيان يكون مناسبًا للغاية (مثل الترتيب عن طريق الفرز ، يجب نقل أسماء الأعمدة إلى SQL من خلال المعلمات ، ثم يتم استخدام $ {column} ، ولا يمكن استخدام #{} لتنفيذ هذه الوظيفة (انظر مناقشة JDBC الأساسية على استعداد للتفاصيل).
SQLSession
توفير طرق لتشغيل قاعدة البيانات (مثل: Selectone/SelectList). ومع ذلك ، فإن SQLSession هو عائق الخيوط ، لذلك من الأفضل تعريفه كمتغير محلي للاستخدام.
مزايا MyBatis (مقارنة مع JDBC)
يتم كتابة SQL برمز Java ، مما يجعل من الصعب الحفاظ عليها. يكتب MyBatis SQL في Mapper ، ويتم فصل XML عن رمز Java. من المعقد أن تمرير المعلمات إلى عبارات SQL (مثل: SQL حيث تكون الظروف مختلفة ، تختلف أنواع بيانات SQL عن Java). يقوم MyBatis تلقائيًا بتخطيط كائنات Java إلى عبارات SQL من خلال ParameterType. التحليل الناتج عن التحليل مزعج (تغييرات SQL تؤدي إلى تغييرات رمز التحليل ، تختلف أنواع بيانات SQL عن Java). يقوم MyBatis تلقائيًا بتخطيط نتائج تنفيذ SQL في كائنات Java من خلال ResultType.
المرفق: من الأفضل إضافة تنفيذ نظام السجل (LOGBACK/LOG4J) إلى pom.xml ، بحيث يتم طباعة معلومات السجل عند تصحيح البرنامج ، مما يسهل التحقق من الأخطاء. استحوذ على تسجيل الدخول كمثال:
pom.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <sperence> <rougiD> ch.qos.logb ACK </rougiD> تسجيل الدخول الكلاسيكي </artifactId> <الإصدار> 1.1.2 </الإصدار> </sependency> </code> </code> </code> </code> </code> </code> </code> </code> </code> </sure> </code> </code> </code> </code> </code>
logback.xml
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <conduction> <configuration> value = "٪ d {hh: mm: ss.sss} [٪ thread] ٪ -5Level ٪ logger {0} - ٪ msg ٪ n"> <appender name = "stdout"> encoder> <datple> $ {pattern} </pattern> name = "file"> <LollingPolicy> <IbenAmepattern> $ {logroot} /common-server.٪D {yyyy-mm-dd} .log </fileNamepattern> <datere> </expender> </expender> </expender> </engender> Level = "Debug"> <appender-Ref Ref = "stdout"> <appender-ref ref = "file"> </espender-ref> </espender-ref> </rout> </sownperation> </sopporment> </iscondation> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>للحصول على تفاصيل أخرى حول سجلات MyBatis ، يرجى الرجوع إلى قسم سجل مستندات MyBatis.
DAO Development
هناك طريقتان لتطوير DAO باستخدام MyBatis ، وتطوير DAO الأصلي ورسم الخرائط DAO.
يتطلب تطوير DAO الأصلي DAO DAO من المطورين كتابة واجهات DAO وتطبيقات DAO ، مثل الاستعلام عن معلومات المستخدم بناءً على المعرف:
Mapper (كما كان من قبل)
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <تحديد Id = "parametertype" resultType = "com.fq.domain.user"> حدد * من المستخدم حيث معرف = #{id} ؛ </تحديد> </code> </code> </code> </code> </code> </code> </code> </code> <//////code واجهة userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> SelectUserById (INTEGER ID) رمي الاستثناء ؛} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
تطبيق userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> Factory ؛ public userdaoimpl (sqlsessionfactory factory) {this.factory = factory ؛}@outridepublic user selecterbyid (integer id) يلقي الاستثناء {sqlsession session = factory.opensession () user ؛}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> عميل
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <dode> OriginalClient () يلقي الاستثناء {userDao dao = new userDaoimpl (sqlsessionfactorybuilder () جديد dao.selectuserById (1) ؛ system.out.println (user) ؛}} </code> </code> </code> </code> </code> </code> </code> </code> </code> <////////code>مشاكل في تطوير DAO الأصلي:
1) هناك العديد من الرموز الإجرائية في هيئة طريقة تنفيذ DAO.
2) يتطلب استدعاء طريقة SQLSession (SELECT/INSERT/UPDATE) تحديد معرف البيان ، الذي يتم ترميزه الثابت ، والذي لا يفضي إلى صيانة التعليمات البرمجية.
تنمية رسم الخرائط Mapper
تتطلب طريقة تطوير رسم الخرائط Mapper فقط كتابة واجهة DAO ، ويقوم MyBatis بشكل ديناميكي بإنشاء تطبيق واجهة بناءً على تعريف الواجهة وبيانات SQL في ملف MAPPER.
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <! المساحة الاسم = "com.fq.mybatis.userdao"> <select id = "selectUserById" parametertype = "java.lang.integer" resultType = "com.fq.domain.user"> حدد * من id = id = #{id} ؛ </rewer> </mapper> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>ملاحظة: في هذا الوقت ، يجب أن تكون مساحة الاسم هي نفس الاسم المؤهل تمامًا لواجهة userDao.
واجهة userDao هي نفسها كما كان من قبل ، ولكن لم يعد عميل userDaoImpl مستخدمًا.
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> pm.*/public class mybatisclient {private sqlsession session ؛ private sqlsessionfactory factory ؛@forepublicpublic void setup () {factory = new SqlSessionFactoryBuilder (). Factory.OpenSession () ؛}@testpublic void mapPperClient () يلقي استثناء {userDao dao = session.getMapper (userDao.class) ؛ مستخدم المستخدم = dao.selectuserbyid (1) ؛ system.out.println (user) ؛} reafpublic void teardown () {session.close () ؛}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>تحتاج طرق تطوير رسم خرائط Mapper إلى اتباع المواصفات التالية:
مساحة الاسم في ملف Mapper هي نفس الاسم المؤهل تمامًا لواجهة DAO ؛ معرف البيان في ملف mapper هو نفس اسم طريقة واجهة DAO ؛ المعلمة/resultType من البيان في ملف Mapper هو نفس المعلمة/resulttype لطريقة DAO.
رسم الخرائط
تتمثل الوظيفة الرئيسية لملفات تعيين Mapper (مثل userDao.xml) في تحديد عبارات SQL (كل SQL عبارة عن عبارة) ، وهو جوهر MyBatis.
يوصي MyBatis رسميًا باستخدام طريقة تعيين Mapper لتطوير DAO ، لذلك لن نقدم الكثير عن تطوير DAO الأصلي في المستقبل.
رسم الخرائط المدخلات
معلمات رسمية متعددة
تم استخدام المثال السابق لتمرير الأنواع البسيطة ، لذلك لن أكرره هنا. عندما يلزم تمرير المعلمات الرسمية المتعددة ، لم تعد المعلمة المعلمة ضرورية:
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> update = "تحديث المعرف". #{1} ، password = #{2} حيث معرف = #{0} ؛ </update> </code> </code> </code> </code> </code> </code> </code> </code> <///////code> <////code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> updateUserById (معرف Integer ، اسم السلسلة ، كلمة مرور السلسلة) يلقي الاستثناء ؛ </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <////////code> <///code> <///code> <///code> <///code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code.
الواردة الواردة
يستخدم MyBatis تعبير ognl لتحليل قيم سمة الكائن:
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <تحديد ID = "SelectUserByNamePassword" parametertype = "com.fq.domain.user" resulttype = "com.fq.domain.user"> حدد *من userwhere name = #{name} و password = #{password} ؛ </rewer> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> SelectUserByNamePassword (مستخدم المستخدم) رميات استثناء ؛ </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//////////code> <//////code> </////code> <///code> </code> </code> </code> <///code> </code> </code> </code> </code> </code>
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <تحديد id = "selecterByMap" parametertype = "java.util.map" resultType = "com.fq.domain.user"> حدد *من userwhere name = #{name} و password = #{password} ؛ </rewer> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>#{} المفتاح المقابل للخريطة في الأقواس المجعد.
userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> SelectUserByMap (MAP <String ، Object = ""> Map) رميات استثناء ؛ </string ،> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//////code> </code> <////code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
رسم الخرائط
إخراج نوع بسيط
Mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <تحديد id = "selectusercount" parametertype = "java.lang.String" resultType = "java.lang.integer"> حدد العد (*) من اسم المستخدم مثل '٪ $ {value} ٪' ؛ </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code > </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>userDao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> استثناء ؛ </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </siced> </siced> </siced> </sice> </siced> <////code> </code> </code> <///code> </code> </code> </code> </code> <///code> </code> </code>
يجب أن يضمن إرجاع نوع بسيط أن نتيجة الاستعلام تحتوي على صف واحد فقط من السجلات ، ويتم تحويل قيمة الحقل الأول أخيرًا إلى نوع الإخراج.
كائن/قائمة الإخراج PO
وقد تم توضيح نوعين من الإخراج من قبل (SelectUserById/SelectUserByName استخدم طريقة تطوير DAO الأصلية في ذلك الوقت ، ولكن نموذج تعريف Mapper كان متشابهًا) ، لذلك سأقوم فقط بإجراء ملخص بسيط هنا:
regudyType المحددة في mapper عند إخراج كائن PO واحد هو نفس النتيجة المحددة في Mapper ؛ يجب ضمان نتيجة استعلام SQL لتكون جزءًا واحدًا من البيانات ، ويسمى داخليًا باستخدام طريقة Selectone ؛ تشير قائمة الإخراج PO إلى أن نتيجة الاستعلام قد تكون متعددة ، ويتم تسميتها داخليًا باستخدام طريقة SelectList ، ويمكن استضافة قيمة إرجاع الواجهة بواسطة القائمة/المجموعة.
خريطة الإخراج
يمكن استخدام كائن PO الإخراج بدلاً من ذلك لاستخدام إخراج الخريطة ، مع اسم الحقل كمفتاح وقيمة الحقل كقيمة.
Mapper
<code> <select id = "selectUserLikename" resultType = "java.util.map"> حدد *من اسم المستخدم مثل "٪ $ {value} ٪ '؛ </select> </code>userDao
<code> <code> قائمة <map <string ، object = "" >> selectUserLikEname (اسم السلسلة) رمي الاستثناء ؛ </map <string ،> </code> </code>
النتيجة
يمكن لـ ResultType تعيين نتيجة الاستعلام إلى PO ، ولكن الفرضية هي أن اسم خاصية PO واسم حقل SQL يجب أن يكون هو نفسه. إذا كان غير متسق ، يمكن إجراء رسم الخرائط المقابلة من خلال ResultMap:
Mapper
<code> <code> <code> <resultmap id = "usermap" type = "com.fq.domain.user"> <id column = "user_id" property = "id"> <result column = "user_name" property = "name"> <result column = "user_password" property = "pwork" parametertype = "java.lang.string" resultmap = "usermap"> selectId user_id ، name user_name ، password user_passwordfrom user were were
واجهة userDao هي نفسها كما كان من قبل.