في الواقع ، فإن إحدى الميزات القوية لـ MyBatis هي عادة قدرات SQL الديناميكية. إذا كان لديك خبرة في استخدام JDBC أو غيرها من الأطر المماثلة ، فأنت تفهم أنه متشابك للغاية لتسلسل سلاسل SQL بشكل ديناميكي معًا ، تأكد من أنك لا تنسى المساحات أو حذف الفواصل في نهاية القائمة. يمكن لـ SQL الديناميكي في MyBatis التعامل مع هذا الألم جيدًا. بالنسبة إلى SQL الديناميكي ، فإن أبسط طريقة هي أن تمنحنا العديد من الأحكام السلوكية الديناميكية عند ترميزها. في MyBatis ، يتم استخدام لغة SQL ديناميكية قوية لتحسين هذا الموقف ، والتي يمكن استخدامها في أي رسم خرائط لبيانات SQL. تشبه عناصر SQL الديناميكية استخدام JSTL أو غيرها من معالجات النص المماثلة XML. يستخدم MyBatis تعبيرات قوية تستند إلى ognl للتخلص من العناصر الأخرى.
تتضمن العديد من عناصر العقدة التي نستخدمها عادةً إذا ، اختر (عندما ، خلاف ذلك) ، تقليم (حيث ، IF) ، و foreach. أشعر قليلاً مثل استخدام XSLT (سأذكره لاحقًا في المقالة ~).
(1) استخدام إذا
في تكوين ترقيم الصفحات لـ ViisitMapper ، إذا كانت PageIndex> -1 و Pagesize> -1 ، فسيتم إضافة ترقيم الصفحات المقابلة ، وإلا فلن تتم إضافتها (يتم أخذ الافتراضي كله) ، على النحو التالي:
<select id = "getListByPagenate" parametertype = "pagenateargs" resulttype = "visitor"> select * from (<refid = test = "pagestart> -1 و pagesize> -1"> limit #{pagestart} ، #{pagesize} </if> </select> <sql id = "getListsql"نظرًا لأن PageIndex و Pagesize هما قيمان int ، يمكننا إصدار أحكام مباشرة مثل هذا. إذا كان مثيلًا للكائن ، فيمكننا استخدام الحكم الفارغ للتحكم في بعض المنطق الديناميكي. يعتمد التطوير المحدد على احتياجات العمل. أعتقد أنه من المهم أن نلاحظ هنا أنه ليس من السهل الكتابة && ، لن يتم التعرف على هذا في التكوين ~.
(2) استخدام الاختيار (عندما ، خلاف ذلك)
اختر وقت استخدامه بشكل أساسي في سيناريوهات التطبيق التي تلبي واحدة فقط من الشروط في ظل ظروف متعددة. على سبيل المثال ، إليك حالة استعلام ومعرف تمرير واسم وكرم على التوالي. لنفترض أنه عندما نستفسر عن جدول الزوار ، إذا كان لدى VisitorId قيمة ، فاستخدم استعلام الهوية ، وإذا كان لدى VisitorName قيمة ، فاستخدم استعلام VisitName. على النحو التالي ، أضف القائمة <Sisitor> getListChoosewhendemo (BasicQueryargs args) إلى فئة واجهة David.MyBatis.Demo.ivisitoroperation. أضف تكوين العقدة المحدد المقابل في VisitorMapper:
package david.mybatis.demo ؛ import java.util.list ؛ import david.mybatis.model.basicqueryargs ؛ import david.mybatis.model.pagenateargs ؛ import david.mybatis.model.visitor int إضافة (زائر زائر) ؛ /** حذف الزائر*/ public int delete (int id) ؛ /** تحديث الزائر*/ int public update (زائر الزوار) ؛ /** استعلام زائر*/ استعلام الزوار العام (INT ID) ؛ / * * قائمة الاستعلام */ قائمة عامة <Sisitor> getList () ؛ / * * قائمة الاستعلام عن ترقيم الصفحات */ قائمة عامة <Sisitor> getListByPageNate (Pagenateargs args) ؛ / * * قائمة استعلام ترقيم الصفحات (بما في ذلك rownum) */ قائمة عامة <SititorWithrn> getListByPagenateWithrn (Pagenateargs args) ؛ /** الاستعلام الأساسي*/ Public Dissitor BasicQuery (int id) ؛ / * * استعلام الحالة الديناميكية (اختر ، متى) مثيل */ قائمة عامة <Sisititor> getListChoosewhendemo (BasicQueryargs args) ؛ / * * استعلام الحالة الديناميكية (حيث ، if) مثيل */ قائمة عامة <Sisitor> getListWheredEmo (basicqueryargs args) ؛ / * * الاستعلام الديناميكي (foreach) مثيل */ قائمة عامة <Sisititor> getListForeachDemo (قائمة <integer> ids) ؛ }
<؟ <resultmap type = "visitor" id = "visitorrs"> <id column = "id" property = "id" /> <result column = "name" property = "name" /> <result column = "email" property = "email" /> <result column = "status" propert من الزائر </sql> <!-اختر متى يتم استيفاء أحد الشروط-> <select id = "getListChoosEwhendemo" resultMap = "Visitors" parametertype = "basicqueryargs"> <refid = "getListsqlConditions"/> <حيث test = "QueryStatus> test = "QueryID! = 0"> و id = #{QueryID} </عندما> <عندما test = "QueryName! = null"> واسم مثل #{queryname} </en> <lorloy> و createTime> = #{querytime} </lex> </where>(3) استخدام حيث إذا (تقليم)
ميزة المكان الذي تتمثل فيه الكلمات الرئيسية في أنه إذا كانت هناك شروط مرشح مقابلة ، فإنها تعرف إدراج الكلمات الرئيسية في الأوقات المناسبة. كما أنه يعرف متى يتم إزالة الموصلات المقابلة و / أو ، والتعامل بشكل رئيسي مع السيناريوهات التالية
<SELECT ID = "findavectiveBloglike" resultType = "blog"> حدد * من المدونة حيث <if test = "state! = null"> state = #{state} </if> if test = "test!لن يصبح نتيجة لفشل جميع الظروف
<SELECT ID = "FindActiveBloglike" resultType = "blog"> حدد * من المدونة حيث </select>
أو لأنه لم يتم الوفاء بالشرط الأول ، يتم استيفاء الشرط اللاحق فقط.
<SELECT ID = "FindaCtactiveBloglike" resultType = "blog"> حدد * من المدونة حيث وعنوان "Sometitle" </select>
لذلك ، يمكننا إنشاء خيار عند مثال على الحالة ، وإضافة القائمة العامة المقابلة <Sititor> getListwheredEmo (args basicqueryargs) إلى فئة واجهة Ivisitoroperation ، وإضافة التكوين المقابل في ملف تكوين VisitorMapper على النحو التالي:
<؟ <sql id = "getListsQlConditions"> حدد * من الزائر < /sql> <!-إضافة عمليات إذا تم استيفاء الشروط-> <select id = "getListwherEdemo" resultMap = "Visitors" parametertype = "quatequeryargs"> <refid = "getListQlConditions" /> </If> <if test = "queryid> 0"> و id =#{QueryID} </If> <if test = "queryName! = nULL"> و name like =#{queryname} </frice> </test = "querytime! = null"> و createTime> =#{querytime} | أو "> <if test =" querystatus> 0 "> status> 0 </if> <if test =" queryid> 0 "> و id =#{QueryID} </fort> <queryname! = null"> و name like =#{QueryName} </if <s test = "queryname! </rect> -> </select> </kapper>(4) استخدام foreach
في SQL الديناميكي الشائع ، لدينا سيناريو أعمال حيث معرف في سلسلة كبيرة من المعرفات. في هذه الحالة ، يمكننا استخدام Foreach دون الاضطرار إلى العمل بجد لصق سلسلة الهوية. والخطوة نفسها هي إضافة الطريقة المقابلة إلى القائمة العامة لفئة واجهة ivisitoroperation <Sititor> getListForeachDemo (قائمة <integer> معرفات) ، ثم قم بتكوين معلومات عنصر العقدة المقابلة في ملف Mapper المقابل ، كما يلي:
<؟ <sql id = "getListsqlConditions"> حدد * من الزائر </sql> <!-شروط حلقة foreach-> <select id = "getListForeAckDemo" resultMap = "visitorrs"> <refid = "refid =" getListsQlConditions "/> anter status> 0 and id in <for elev = elieve = ")"> $ {item} </foreach> </select> </papper>أخيرًا ، تحتاج فقط إلى إنشاء طريقة الاختبار المقابلة في Demorun ، وسيتم إكمال SQL الديناميكي في MyBatis. طريقة Demorun المستخدمة للاختبار أدناه
/** استعلام ديناميكي foreach مثيل*/ public static void getListforeachDemo (قائمة <integer> ids) {sqlsession session = mybatisutils.getsqlsession () ؛ ivisitoroperation voperation = session.getMapper (ivisitoroperation.class) ؛ قائمة <Sisitor> ls = voperation.getListForeachDemo (IDS) ؛ لـ (زائر الزائر: ls) {system.out.println (زائر) ؛ }} /** استعلام ديناميكي حيث إذا كان مثيل* / public static void getListwherEcondition (int id ، اسم السلسلة ، تاريخ createTime) {name == ""؟ NULL: الاسم ؛ SQLSession Session = MyBatisutils.getSqlSession () ؛ basicqueryargs args = new basicqueryargs (id ، name ، createTime) ؛ ivisitoroperation voperation = session.getMapper (ivisitoroperation.class) ؛ قائمة <Sisitor> ls = voperation.getListWheredemo (args) ؛ if (ls.size () == 0) system.out.println ("تحقق من عدم تطابق!") ؛ else {for (زائر الزوار: ls) {system.out.println (زائر) ؛ }}} /** استعلام ديناميكي اختر متى مثيل* / public static getListChoosewhendemo (int id ، اسم السلسلة ، تاريخ CreateTime) {name == ""؟ NULL: الاسم ؛ SQLSession Session = MyBatisutils.getSqlSession () ؛ basicqueryargs args = new basicqueryargs (id ، name ، createTime) ؛ ivisitoroperation voperation = session.getMapper (ivisitoroperation.class) ؛ قائمة <Sisitor> ls = voperation.getListChoosewhendemo (args) ؛ if (ls.size () == 0) system.out.println ("تحقق من عدم تطابق!") ؛ else {for (زائر الزوار: ls) {system.out.println (زائر) ؛ }}}
ملاحظة: حول ognl
ognl هو اختصار لغة التنقل في الكائن. من منظور اللغة: إنها لغة تعبير قوية تستخدم للحصول على خصائص كائنات Java وتعيينها. يهدف إلى توفير بناء جملة تجريد أعلى للتنقل في الرسوم البيانية لكائن Java. لدى ognl تطبيقات في العديد من الأماكن ، مثل:
لغة الربط كعناصر واجهة المستخدم الرسومية (TextField ، ComboBox ، إلخ) لنمذجة الكائنات.
جدول قاعدة البيانات إلى لغة مصدر بيانات TableModel في Swing.
لغة الربط لمكونات الويب وكائنات نماذج الخلفية (Webognl ، Tapestry ، WebOords ، WebObjects).
كبديل أكثر تعبيرا عن Jakarata Commons Beanutils أو JSTL Language.
بالإضافة إلى ذلك ، هناك العديد من الأشياء التي يمكن القيام بها في Java ، والتي يمكن القيام بها أيضًا باستخدام ognl ، مثل تعيين القائمة واختيارها. للمطورين ، باستخدام ognl ، يمكنك استخدام بناء جملة موجز لإكمال التنقل في كائنات Java. بشكل عام ، يتم الانتهاء من التنقل في معلومات الكائن من خلال "مسار". يمكن أن يكون هذا "المسار" سمة إلى Java Bean ، وهو كائن مفهرس في مجموعة ، وما إلى ذلك ، بدلاً من استخدام طريقة GET أو SET مباشرة.