รู้เบื้องต้นเกี่ยวกับ Ibatis:
Ibatis เป็นโครงการโอเพ่นซอร์สของ Apache และโซลูชันการทำแผนที่ O/R คุณสมบัติที่ใหญ่ที่สุดของ Ibatis คือมันกะทัดรัดและเริ่มต้นได้อย่างรวดเร็ว หากคุณไม่ต้องการฟังก์ชั่นที่ซับซ้อนมากเกินไป Ibatis เป็นโซลูชันที่ง่ายที่สุดที่สามารถตอบสนองความต้องการของคุณและยืดหยุ่นได้เพียงพอ ตอนนี้ Ibatis ถูกเปลี่ยนชื่อเป็น mybatis
เว็บไซต์อย่างเป็นทางการคือ: http://www.mybatis.org/
1. พารามิเตอร์อินพุตเป็นค่าเดียว
<delete id = "com.fashionfree.stat.accesslog.deletememberaccesslogsbefore" parameterClass = "ยาว"> ลบจาก memberAccessLog ที่ accessTimestamp = # ค่า # </delete> <deLete id = "com.fashionfree.stat.accesslog.deletem AccessTimeStamp = # value # </delete>
2. พารามิเตอร์อินพุตเป็นวัตถุ
<insert id = "com.fashionfree.stat.accesslog.memberaccesslog.insert" parameterclass = "com.fashionfree.stat.accesslog.model.memberaccesslog> แทรกลงใน memberaccesslog #AccessLogid #, #memberId #, #clientip #, #httpmethod #, #actionId #, #requesturl #, #accessTimestamp #, #extend1 #, #extend2 #, #extend3 #) parameterClass = "com.fashionfree.stat.accesslog.model.memberaccesslog> แทรกลงใน memberaccesslog (AccessLogid, memberId, clientip, httpmethod, actionId, accessTimestamp #requestUrl #, #AccessTimestamp #, #extend1 #, #extend2 #, #extend3 #) </แทรก>
3. พารามิเตอร์อินพุตคือ java.util.hashmap
<select id = "com.fashionfree.stat.accesslog.SelectActionIdAntionNumber" parameterClass = "hashmap" resultmap = "getActionIdAntionNumber"> เลือก ActionId, นับ (*) นับจาก memberAccessLog ที่ memberId = # memberId # และ accessTimestamp> # start # id = "com.fashionfree.stat.accesslog.selectactionIdAntionNumber" parameterClass = "hashmap" resultmap = "getActionIdAntionNumber"> เลือก ActionId, นับ (*) นับจาก memberAccessLog ที่ memberId = # memberId # และ accessTimestamp> # start #
4. พารามิเตอร์อินพุตมีอาร์เรย์
<insert id = "updatestatusBatch" parameterClass = "hashmap"> อัปเดตชุดคำถามสถานะ = # สถานะ # <ไดนามิก prepend = "ที่คำถามใน"> <isnotNull property = "actionIds"> <iterate property = "actionIds" open = "(" close = ")" conjunction = " <insert id = "updatestatusBatch" parameterClass = "hashmap"> อัปเดตชุดคำถามสถานะ = # สถานะ # <ไดนามิก prepend = "ที่คำถามใน"> <isnotNull property = "actionIds"> <iterate property = "actionIds" open = "(" close = ")" conjunction = "คำอธิบาย: ActionIDS เป็นชื่อของอาร์เรย์ที่ผ่าน ใช้แท็กแบบไดนามิกเพื่อหลีกเลี่ยงข้อผิดพลาดของคำสั่ง SQL เมื่ออาร์เรย์ว่างเปล่า ใช้แท็ก isnotnull เพื่อหลีกเลี่ยงข้อผิดพลาดในการแยกวิเคราะห์ Ibatis เมื่ออาร์เรย์เป็นโมฆะ
5. พารามิเตอร์ที่ผ่านมีเพียงหนึ่งอาร์เรย์
<select id = "com.fashionfree.stat.accesslog.model.statMemberAction.SelectActionIdSofModule" resultClass = "hashMap"> เลือก moduleId, actionId จาก statMemberAction <dynamic prepend = "moduleid ใน" </select> <select id = "com.fashionfree.stat.accesslog.model.statmemberaction.selectactionIdsofmodule" resultclass = "hashmap"> เลือก moduleid, actionId จาก statmemberAction <dynamic prepend = " ModuleId </select>
หมายเหตุ: โปรดทราบว่าไม่มีรายการพารามิเตอร์คลาสในแท็กเลือก
นอกจากนี้: คุณสามารถใส่อาร์เรย์ลงใน HashMap ได้ที่นี่ แต่จะเพิ่มค่าใช้จ่ายเพิ่มเติมและไม่แนะนำให้ใช้
6. ให้ Ibatis แยกพารามิเตอร์ลงในสตริงโดยตรง
<select id = "com.fashionfree.stat.accesslog.selectsumdistinctcountofaccessmembernum" parameterclass = "hashmap" resultclass = "int"> count (memberId ที่แตกต่าง) จาก memberAccessLog ที่ AccessTimestamp> = # start # id = "com.fashionfree.stat.accesslog.selectsumdistinctcountofaccessmembernum" parameterclass = "hashmap" resultclass = "int"> เลือกนับ (memberId ที่แตกต่าง)
หมายเหตุ: มีความเสี่ยงในการฉีด SQL เมื่อใช้วิธีนี้และไม่แนะนำให้ใช้
7. PagedQuery
<select id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby" parameterClass = "hashmap" resultmap = "memberAccessLogMap"> <รวม refid = "selectallsql"/> <รวม refid = "wheresql"/> id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby.count" parameterClass = "hashmap" resultclass = "int"> <รวม refid = "countsql"/> <รวม refid = "wheresql RequestUrl, AccessTimestamp, Extend1, Extend2, Extend3 จาก MemberAccessLog </sql> <sql id = "wheresql"> AccessTimestamp <= # AccessTimestamp # </sql> <sql id = "countsql"> select (*) จากสมาชิก </sql> <sql id = "wheresql"> accessTimeStamp <= #accessTimestamp #</sql> <sql id = "countsql"> เลือกนับ (*) จาก memberAccessLog </sql> <sql id = "pagesql"> < , # pagesize # </isnotnull> </isnotnull> </ynamic> </sql> <select id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby" parameterClass = "HashMap" resulting = "MemberAccessLogMap" refid = "pagesql"/> </select> <select id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby.count" parameterClass = "hashmap" resultclass = "int"> <รวม refid = "countsql"/> memberId, clientip, httpmethod, actionId, requestUrl, accessTimestamp, Extend1, Extend2, Extend3 จาก memberAccessLog </sql> <sql id = "wheresql"> accessTimestamp <= # accessTimestamp # </sql> <sql id = "countsql" id = "pagesql"> <ไดนามิก> <isnotNull property = "startIndex"> <isnotNull property = "pageSize"> จำกัด # startIndex #, # pagesize # </isnotnull> </isnotnull> </dynamic> </sql>
หมายเหตุ: ในตัวอย่างนี้รหัสควรเป็น:
hashmap hashmap = new hashmap (); hashmap.put ("AccessTimestamp", somevalue); PAGEDQUERY ("com.fashionfree.stat.accesslog.selectmemberaccesslogby", hashmap);วิธี PageDQuery ค้นหาคำสั่งที่แมปชื่อ com.fashionfree.stat.accesslog.selectmemberaccesslogby.count เพื่อทำการสืบค้น sql ดังนั้นจึงได้รับจำนวนบันทึกของ com.fashionfree.stat.accesslog.selectmemberaccesslogby (com.fashionfree.stat.accesslog.selectmemberaccesslogby) สำหรับกระบวนการเฉพาะโปรดดูรหัสที่เกี่ยวข้องในคลาส UTILS
8. คำสั่ง SQL มีมากกว่าเครื่องหมาย> และน้อยกว่าเครื่องหมาย <1. เขียนมากกว่าเครื่องหมายและน้อยกว่าเครื่องหมายเป็น:> <ตัวอย่าง:: เช่น:
<delete id = "com.fashionfree.stat.accesslog.deletememberaccesslogsbefore" parameterclass = "ยาว"> ลบออกจาก memberAccesslog ที่ accessTimestamp <= # ค่า # </delete> รหัส XML memberAccessLog ที่ AccessTimestamp <= # value # </lelete>
วางอักขระพิเศษในพื้นที่ CDATA ของ XML:
<delete id = "com.fashionfree.stat.accesslog.deletememberaccesslogsbefore" parameterclass = "long"> <! parameterClass = "long"> <! [cdata [ลบจาก memberAccessLog โดยที่ AccessTimestamp <= # value #]]> </delete>
ขอแนะนำให้ใช้วิธีแรกเขียนเป็น <และ> (XML ไม่ได้แยกวิเคราะห์เนื้อหาใน CDATA ดังนั้นหาก CDATA มีแท็กแบบไดนามิกมันจะไม่ทำงาน)
9. รวมและแท็ก SQL จัดระเบียบคำสั่ง SQL ทั่วไปเข้าด้วยกันเพื่อการแบ่งปันที่ง่าย:
<sql id = "SelectBasicsQl"> เลือก SamplingTimestamp, Onlinenum, ปี, เดือน, สัปดาห์, วัน, ชั่วโมงจาก OnLineMemberNum </sql> <SQL ID = "wheresqlbefore"> โดยที่ SamplingTimestamp <= # SamplingTimestamp id = "com.fashionfree.accesslog.selectonlinemembernumsbeforesamplingtimestamp" parameterclass = "hashmap" resultclass = "onlinemembernum"> <รวม refid = "selectbasicql" /> <รวม refid = "wheresqlbefore" /> SamplingTimestamp, Onlinenum, ปี, เดือน, สัปดาห์, วัน, วัน, ชั่วโมงจาก onlinemembernum </sql> <sql id = "wheresqlbefore"> ที่ samplingtimestamp <= # samplingtimestamp # </sql> parameterClass = "hashmap" resultclass = "onlinemembernum"> <รวม refid = "selectBasicsQl" /> <รวม refid = "wheresqlbefore" /> < /select> < /select>
หมายเหตุ: แท็ก SQL สามารถใช้สำหรับการอ้างอิงเท่านั้นและไม่สามารถถือได้ว่าเป็นคำสั่งที่แมป ดังในตัวอย่างข้างต้นมีองค์ประกอบ SQL ชื่อ SelectBasicsQl และผิดที่จะพยายามใช้เป็นคำสั่ง SQL เพื่อดำเนินการ:
SQLMAPClient.QueryForList ("SelectBasicsQl");10. สุ่มเลือกระเบียน
<sql id =” randomsql”> สั่งซื้อโดย rand () จำกัด # number # </sql>
สุ่มเลือกบันทึกหมายเลขจากฐานข้อมูล (เฉพาะสำหรับ MySQL)
11. ฟิลด์ Stitch ในกลุ่ม SQL โดยการจัดกลุ่ม
<sql id =” selectgroupby> เลือก a.answerercategoryid, a.answererid, a.answerername, a.questioncategoryid, a.score, a.answerednum, a.correctnum, a.answerseconds หมวดหมู่จากคำตอบที่เป็นหมวดหมู่ A, แบบสอบถามหมวดหมู่ Q โดยที่ A.QuestionCategoryId = Q.QuestionCategoryId กลุ่มโดย A.ANSWERERID ORDER โดย A.ANSWERERCATEDORYIN A.CorrectNum, A.SWERSECONDS, A.CreatedTimestamp, A.lastQuestionApprovedTimestamp, A.lastmodified, Group_concat (q.categoryName) เป็นหมวดหมู่จากคำตอบ
หมายเหตุ: ฟังก์ชั่น group_concat ของ MySQL ใช้ใน SQL
12. เรียงลำดับในลำดับใน
①mysql:
<sql id =” groupbyinarea”> เลือก moduleId, modulename, สถานะ, lastModifierId, lastModifiedName, lastModified จาก statModule ที่ moduleid ใน (3, 5, 1) ลำดับโดย instr (', 3,5,1,', ','+ltrim (moduleid) Modulename, สถานะ, lastModifierId, LastModifiedName, LastModified จาก statModule ที่ moduleid ใน (3, 5, 1) คำสั่งซื้อโดย instr (', 3,5,1,', ','+ltrim (moduleid)+',') </sQl>②sqlserver:
<sql id =” groupbyinarea”> เลือก moduleId, modulename, สถานะ, lastModifierId, lastModifiedName, lastModified จาก statModule ที่ moduleId ใน (3, 5, 1) ลำดับโดย charindex (','+ltrim (moduleid)+',', ', 3,5,1,') moduleId, modulename, สถานะ, lastModifierId, lastModifiedName, lastModified จาก statModule ที่ moduleId ใน (3, 5, 1) สั่งซื้อโดย charindex (','+ltrim (moduleid)+',', 3,5,1, ') </sql>คำอธิบาย: ผลลัพธ์การสืบค้นจะถูกส่งกลับตามลำดับของ moduleId ในรายการใน (3, 5, 1)
MySQL: Instr (Str, substr)
SQLServer: Charindex (substr, STR) ส่งคืนตำแหน่งการเกิดขึ้นครั้งแรกของ substring ในสตริง str ltrim (str) ส่งคืนสตริง str, อักขระช่องว่าง (ซ้าย) ของมันถูกลบ
13. resultmap resultsmap รับผิดชอบค่าการแมปคอลัมน์ของการตั้งค่าผลลัพธ์การสืบค้น SQL เป็นค่าแอตทริบิวต์ของถั่วชวา
<resultmap id = "getActionIdActionNumber"> <result column = "actionId" คุณสมบัติ = "actionId" jdbctype = "bigint" javatype = "ยาว"/> <result column = "count" คุณสมบัติ = "count" jdbctype = "int" javatype = "int"/> column = "actionId" property = "actionId" jdbctype = "bigint" javatype = "long"/> <result column = "count" property = "count" jdbctype = "int" javatype = "int"/> </resultmap>
การใช้งานผลลัพธ์เรียกว่าการแมปผลลัพธ์ที่ชัดเจนซึ่งสอดคล้องกับผลลัพธ์ของคลาส (การแมปผลลัพธ์แบบอินไลน์) ข้อได้เปรียบที่ใหญ่ที่สุดของการใช้ ResultClass คือมันง่ายและสะดวก ไม่จำเป็นต้องมีผลลัพธ์ที่ระบุไว้ Ibatis กำหนดการตัดสินใจตามการสะท้อน ResultMap สามารถให้การตรวจสอบการกำหนดค่าที่เข้มงวดยิ่งขึ้นโดยการระบุ JDBCType และ Javatype
14.Typealias
<typealias alias = "memberOnlineduration" type = "com.fashionfree.stat.accesslog.model.memberonlineduration" /> <ypealias>
อนุญาตให้คุณกำหนดนามแฝงเพื่อหลีกเลี่ยงการป้อนข้อมูลซ้ำ ๆ ของชื่อที่ยาวมากเกินไป
15. remap
<select id = "testforRemap" parameterClass = "hashmap" resultclass = "hashmap" remapresults = "true"> เลือก userId <isequal property = "tag" compareValue = "1"> ชื่อผู้ใช้ </isequal> id = "testforRemap" parameterClass = "hashmap" resultclass = "hashmap" remapResults = "true"> เลือก userId <isequal property = "tag" comperEvalue = "1"> ชื่อผู้ใช้ </isequal>
ในตัวอย่างนี้จะได้รับชุดผลลัพธ์ที่แตกต่างกันตามค่าของแท็กพารามิเตอร์ หากไม่มีแอตทริบิวต์ remapresults = "true" Ibatis จะแคชชุดผลลัพธ์ในระหว่างการสืบค้นแรก การแมปชุดผลลัพธ์จะไม่ดำเนินการในครั้งต่อไป (จะต้องอยู่ในกระบวนการ) แต่จะใช้ชุดผลลัพธ์แคช
ดังนั้นหากในตัวอย่างข้างต้น remapresult เป็นคุณสมบัติเท็จเริ่มต้นและโปรแกรมจะถูกเขียนเช่นนี้:
hashmap <string, integer> hashmap = new hashmap <string, integer> (); hashmap.put ("แท็ก", 1); SQLClient.QueryForList ("TestForRemap", HASHMAP); hashmap.put ("แท็ก", 2); SQLClient.QueryForList ("TestForRemap", HASHMAP); รหัส Java
hashmap <string, integer> hashmap = new hashmap <string, integer> (); hashmap.put ("แท็ก", 1); SQLClient.QueryForList ("TestForRemap", HASHMAP); hashmap.put ("แท็ก", 2); SQLClient.QueryForList ("TestForRemap", HASHMAP);โปรแกรมจะรายงานข้อผิดพลาดเมื่อดำเนินการค้นหาแบบสอบถามล่าสุด เหตุผลก็คือ Ibatis ใช้ชุดผลลัพธ์ของแบบสอบถามแรกและชุดผลลัพธ์ของสองครั้งแรกและสองครั้งสุดท้ายนั้นแตกต่างกัน: (userId, ชื่อผู้ใช้) และ (userId, userPassword) ซึ่งนำไปสู่ข้อผิดพลาด หากใช้คุณสมบัติ remapResults = "true" Ibatis จะทำการแมปชุดผลลัพธ์ทุกครั้งที่มีการดำเนินการแบบสอบถามดังนั้นจึงหลีกเลี่ยงข้อผิดพลาด (จะมีค่าใช้จ่ายมากมาย)
16. แอตทริบิวต์ prepend ของแท็กแบบไดนามิกจะถูกเพิ่มเป็นคำนำหน้าไปยังเนื้อหาผลลัพธ์ เมื่อเนื้อหาผลลัพธ์ของฉลากว่างเปล่าแอตทริบิวต์ prepend จะไม่ทำงาน
เมื่อแอตทริบิวต์ prepend มีอยู่ในแท็กแบบไดนามิกแอตทริบิวต์ prepend แรกของคำบรรยายที่ซ้อนกันจะถูกละเว้น ตัวอย่างเช่น:
<sql id = "wheresql"> <dynamic prepend = "โดยที่"> <isnotNull property = "userId" prepend = "bogus"> userId = # userId # </isnotNull> <isNotEmpty Property = "ผู้ใช้" prepend = "> username = # username # <dynamic prepend = "โดยที่"> <isnotNull property = "userId" prepend = "bogus"> userId = # userId # </isNotNull> <isNotEmpty Property = "ชื่อผู้ใช้" prepend = "และ"> username = # username # <
ในตัวอย่างนี้แท็กแบบไดนามิกมีสองป้ายย่อย <isnotnull> และ <SotNotEmpty> ตามหลักการที่อธิบายไว้ข้างต้นหากแอตทริบิวต์เท็จ prepend = "bogus" ไม่ได้อยู่ในแท็ก <isnotnull> เพื่อลบไดนามิกและและในแท็ก <isnotempty> จะถูกละเว้นทำให้เกิดข้อผิดพลาดทางไวยากรณ์ SQL
หมายเหตุ: เมื่อแท็กแบบไดนามิกไม่มีแอตทริบิวต์ prepend แอตทริบิวต์ prepend แรกของแท็กลูกจะไม่ถูกละเว้นโดยอัตโนมัติ
ข้างต้นเป็นคำสั่ง 16 SQL ที่ Ibatis ใช้เพื่อแนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!