รู้เบื้องต้นเกี่ยวกับ mybatis
MyBatis ได้รับการควบคุมโดย Ibatis ซึ่งเป็นกรอบการคงอยู่ของข้อมูลการคงอยู่ของ Layer/Object Relational Layer/Object (ORM)
MyBatis เป็น encapsulation ของ JDBC ช่วยให้นักพัฒนาสามารถมุ่งเน้นเฉพาะ SQL เองโดยไม่ต้องใช้ความพยายามมากเกินไปในการประมวลผลรหัสขั้นตอน JDBC เช่นการลงทะเบียนไดรเวอร์การตั้งค่าพารามิเตอร์การสร้างการเชื่อมต่อ/คำสั่ง
MyBatis เป็นเฟรมเวิร์กการคงอยู่ของชั้นเรียนแรกพร้อมการสนับสนุนสำหรับ SQL ที่กำหนดเองขั้นตอนที่เก็บไว้และการแมปขั้นสูง MyBatis กำจัดรหัส JDBC เกือบทั้งหมดและการตั้งค่าพารามิเตอร์และการดึงผลลัพธ์ด้วยตนเองเกือบทั้งหมด MyBatis สามารถใช้ XML อย่างง่ายหรือคำอธิบายประกอบสำหรับการกำหนดค่าและแผนที่ดั้งเดิมอินเทอร์เฟซแผนที่และ Java Pojos (วัตถุ Java เก่าธรรมดา) ไปยังระเบียนฐานข้อมูล
ที่อยู่โครงการ MyBatis/เอกสารออนไลน์
พบ mybatis ก่อน
การใช้ mybatis ต้องเพิ่มการพึ่งพาต่อไปนี้ใน pom.xml:
<code> <predency> <roupId> org.mybatis </groupId> <ratifactid> mybatis </artifactid> <cersion> 3.3.0 </version> endency> <roupId> mysql </groupId> <ratifactId> mysql-connector-java </artifactid> <version> 5.1.36 </version>
เลือก
กำหนดค่า mybatis/mybatis-configuration.xml
ในฐานะไฟล์การกำหนดค่าส่วนกลางของ MyBatis ได้รับการกำหนดค่าด้วยข้อมูลสภาพแวดล้อมการทำงานของ MyBatis (เช่นไฟล์แหล่งข้อมูล/mapper ฯลฯ )
<code> <code> <!-{cke_protection} {c}%3c!%2d%2d%3fxml%20version%3d%221.0%22%20encoding%3d%22utf-8%22%20%3F%2d%2d%3e- id = "การพัฒนา"> <!-{cke_protection} {c}%3c!%2d%2d%20%e9%85%8d%e7%bd%aejdbc%e4%Ba%8b%e5%8a%a1%e7% type = "jdbc"> <!-{cke_protected} {c}%3c!%2d%2d%20%e9%85%8d%e7%bd%ae%e6%95%b0%e6%8d%ae%e6%ba%90%2d%2d value = "com.mysql.jdbc.driver"> <property name = "url" value = "jdbc: mysql: // โฮสต์: พอร์ต/db? ตัวละคร = UTF-8"> <property name = "ชื่อผู้ใช้"> <property name = "รหัสผ่าน" value = "รหัสผ่าน"> </คุณสมบัติ> </porement> </porement> </ataSource> </scainactionManager> </environment> </environments> <!-{C ke_protected} {c}%3c!%2d%2d%20%e5%8a%a0%e8%bd%bdmapper%e6%98%a0%e5%b0%84%e6%96%87%e4%bb%b6%20%2d%2d Resource = "mybatis/mapper/userdao.xml"> </mapper> </mappers> </configuration> </code>การเขียน userdao (แผนที่แผนที่)
ส่วนสำคัญที่สุดของ MyBatis ได้รับการกำหนดค่าด้วยคำสั่ง SQL ที่ใช้งานฐานข้อมูล:
<code> <code> <code> <!-{cke_protected} {c}%3c!%2d%2d%3fxml%20version%3d%221.0%22%20Encoding%3d%22utf-8%22%20%3F%2d% parameterType = "java.lang.integer" resultType = "com.fq.domain.user"> เลือก * จากผู้ใช้ที่ id = #{id}; </select> <select id = "selectUserByName" parameterType = "java.lang.string" '%$ {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.*/ผู้ใช้ระดับสาธารณะ {ID INTEGER ส่วนตัว; ชื่อสตริงส่วนตัว; รหัสผ่านส่วนตัว; ผู้ใช้สาธารณะ () {} ผู้ใช้สาธารณะ {return id;} public void setId (Integer id) {this.id = id;} สตริงสาธารณะ getName () {ชื่อคืน;} โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name;} public String getPassword () {return password; "ผู้ใช้ {" + "id =" + id + ", name = '" + ชื่อ +'/'' + ", password = '" รหัสผ่าน +'/'' + '}'userdao (วัตถุ Java)
รับ SQLSession ดำเนินการคำสั่ง SQL และรับผลการแมป:
<code> <code> <code> <code> <code> <code> <code>/*** @author jifang*@Since 16/2/24 6:15 PM.*/คลาสสาธารณะ UserDao {Private SQLSessionFactory Factory; SQLSessionFactoryBuilder (). build (resources.getResourceasstream (ทรัพยากร));}@testpublic void selectUserById () {ลอง (sqlsession session = factory.opensession ()) {ผู้ใช้ = session.selectone ("namespace.selectuserbyid" SelectUserByName () {ลอง (SQLSession Session = Factory.OpenSession ()) {รายการ <Suser> ผู้ใช้ = Session.SelectList ("Namespace.SelectUserByName", "Student"); สำหรับ (ผู้ใช้: ผู้ใช้: ผู้ใช้) {System.out.println (ผู้ใช้);}}}} </user> </code> </code> </code> </code> </code>แทรก
ผู้ทำแผนที่
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "Insertuser" parameterType = "com.fq.domain.user"> แทรกลงในผู้ใช้ (ชื่อรหัสผ่าน)
ผู้ใช้
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic เป็นโมฆะ Insertuser () {ลอง (SQLSession Session = Factory.OpenSession ()) {ผู้ใช้ = ใหม่ user (); user.setName ("new_name1"); user.setPassword ("new_password"); session.insert ("namespace.insertuser", user); session.commit ();}} กลับมาโดยคีย์หลักการเพิ่มค่าอัตโนมัติ
แก้ไขไฟล์ Mapper และเพิ่มและคุณสามารถส่งคืนคีย์หลักของการเพิ่มค่าอัตโนมัติของ MySQL (เช่น ID ที่สร้างขึ้นเมื่อข้อมูลถูกแทรก):
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "insertuser" parameterType = "com.fq.domain.user.user" selectKey KeyProperty = "ord =" last_insert_id (); </selectkey> แทรกลงในผู้ใช้ (ชื่อรหัสผ่าน) ค่า ( #{name}, #{รหัสผ่าน}); </insert> </code> </code> </code> </code> </code>ผู้ใช้
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic เป็นโมฆะ Insertuser () {ลอง "new_password"); session.insert ("namespace.insertuser", ผู้ใช้); // คุณต้องได้รับคีย์หลักของ autoincrement session.commit (); system.out.println (user.getId ());}} </code>ฟังก์ชั่นนี้สามารถเสร็จสิ้นได้ผ่านคุณสมบัติ UseGeneratedKeys/KeyProperty โปรดดูเอกสาร MyBatis สำหรับรายละเอียด
อัปเดต
ผู้ทำแผนที่
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <อัปเดต id = "updateUserById" parameterType = "com.fq.domain.user" #{id}; </update> </doy> </doy> </doy> </do Code> </code> </code> </code> </do code> </do codeผู้ใช้
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> "feiqing", "ICY5YQXZB1UWSWCVLSNLCA =="));}} </รหัส> </รหัส> </รหัส> </code>
ลบ
ผู้ทำแผนที่
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <delete id = "deleteUserById" #{id}; </deLete> </code> </code> </code> </do Code> </do 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> {session.delete ("namespace.deleteUserById", 51615);}} </code> </code> </code> </code> </code> </code> </code> </code>สรุป
-
#{}: แสดงถึงตัวยึดตำแหน่งการตั้งค่าการตั้งค่าให้กับตัวยึดตำแหน่งที่เตรียมไว้ ( #{} หมายถึงตัวยึดตำแหน่ง?) และแปลงประเภท Java เป็นประเภท JDBC โดยอัตโนมัติ (ดังนั้น #{} สามารถป้องกันการฉีด SQL ได้อย่างมีประสิทธิภาพ) #{} สามารถรับค่าแอตทริบิวต์ประเภทหรือ PO อย่างง่าย หากพารามิเตอร์ transmits ประเภทง่าย ๆ เพียงอย่างเดียว #{} สามารถเป็นค่าหรือชื่ออื่น ๆ ในวงเล็บปีกกา #{} $ {} สามารถใช้เพื่อแยกสตริง SQL เนื้อหา ParameterType สามารถเชื่อมต่อใน SQL โดยไม่ต้องแปลงประเภท JDBC $ {} สามารถใช้เพื่อรับค่าแอตทริบิวต์ประเภทหรือ PO อย่างง่าย หากพารามิเตอร์ TEMANT ค่าประเภทง่าย ๆ เดียว $ {} สามารถใช้เพื่อค่าในการจัดฟัน $ {}
แม้ว่า $ {} ไม่สามารถป้องกันการฉีด SQL ได้ แต่บางครั้ง $ {} ก็สะดวกมาก (เช่นคำสั่งซื้อโดยการเรียงลำดับชื่อคอลัมน์จะต้องส่งผ่านไปยัง SQL ผ่านพารามิเตอร์จากนั้นสั่งซื้อโดย $ {คอลัมน์} และ #{} ไม่สามารถใช้ฟังก์ชั่นนี้ได้
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 เพื่อให้ข้อมูลบันทึกจะถูกพิมพ์เมื่อทำการดีบักโปรแกรมทำให้ง่ายต่อการตรวจสอบข้อผิดพลาด ใช้ logback เป็นตัวอย่าง:
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> ACK </groupId> logback-classic </artifactid> <cersion> 1.1.2 </เวอร์ชัน> </การพึ่งพาอาศัย> </code> </code> </doy> </code> </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> value = " %d {hh: mm: ss.sss} [ %เธรด] %-5level %logger {0} - %msg %n"> <appender name = "stdout"> <coder> name = "file"> <RollingPolicy> <pilenamePattern> $ {logrot} /common-server.%D {yyyy-mm-dd} .log </filenamepattern> <maxhistory> 7 </maxhistory> </rollingpolicy> level = "debug"> <appender-ref ref = "stdout"> <appender-ref ref = "file"> </appender-ref> </appender-ref> </root> </คุณสมบัติ> </คุณสมบัติ> </การกำหนดค่า> </รหัส> </รหัส> </code> </code> </code> </code> </code> </code> </code> </code>สำหรับรายละเอียดอื่น ๆ เกี่ยวกับบันทึก MyBatis โปรดดูส่วนบันทึกเอกสาร MyBatis
การพัฒนา DAO
มีสองวิธีในการพัฒนา DAO โดยใช้ mybatis การพัฒนา DAO ดั้งเดิมและการพัฒนา Mapper Mapping DAO
การพัฒนา DAO ดั้งเดิมการพัฒนา DAO ดั้งเดิมต้องการให้นักพัฒนาต้องเขียนอินเทอร์เฟซ DAO และการใช้งาน DAO เช่นการสืบค้นข้อมูลผู้ใช้ตาม ID:
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> resultType = "com.fq.domain.user"> เลือก * จากผู้ใช้โดยที่ id = #{id}; </select> </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> SelectUserById (ID จำนวนเต็ม) พ่นข้อยกเว้น;} </code> </code> </code> </doy> </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> โรงงาน; UserDaoImpl (SQLSessionFactory Factory) {this.factory = โรงงาน;}@overridepublic ผู้ใช้ SelectUserById (จำนวนเต็ม ID) โยนข้อยกเว้น {SQLSession Session = Factory.OpenSession () ผู้ใช้ user;}} </code> </code> </code> </code> </code> </code> </code> </code> </doy> </do 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> OriginalClient () โยนข้อยกเว้น {userdao dao = ใหม่ userdaoimpl (ใหม่ sqlsessionfactorybuilder (). build (classloader.getSystemResourceasstream ("mybatis/mybatis-configuration.xml"))); dao.selectuserbyid (1); system.out.println (ผู้ใช้);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code code> </code> </code> </code>ปัญหาในการพัฒนา DAO ดั้งเดิม:
1) มีรหัสขั้นตอนมากมายในร่างกายวิธีการใช้งาน DAO
2) การเรียกใช้วิธี SQLSession (เลือก/แทรก/อัปเดต) ต้องระบุ ID ของคำสั่งซึ่งเป็นรหัสยากซึ่งไม่เอื้อต่อการบำรุงรักษารหัส
การพัฒนาแผนที่แผนที่
วิธีการพัฒนาการทำแผนที่ Mapper ต้องการการเขียนอินเทอร์เฟซ DAO เท่านั้นและ MyBatis จะสร้างการใช้งานอินเตอร์เฟสแบบไดนามิกตามคำจำกัดความของอินเตอร์เฟสและคำสั่ง SQL ในไฟล์ 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> <! namespace = "com.fq.mybatis.userdao"> <select id = "selectUserById" parameterType = "java.lang.Integer" resultType = "com.fq.domain.user" เลือก * จากผู้ใช้ #{id}; </select> </mapper> </code> </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> <code> <code> PM.*/คลาสสาธารณะ mybatisclient {เซสชั่น SQLSession ส่วนตัว; SQLSessionFactory ส่วนตัวโรงงาน; @BeforePublic การตั้งค่าการตั้งค่า () {โรงงาน = ใหม่ SQLSessionFactoryBuilder () สร้าง factory.opensession ();}@testpublic โมฆะ mappperclient () โยนข้อยกเว้น {userdao dao = session.getMapper (userdao.class) ผู้ใช้ = dao.selectuserbyid (1); system.out.println (ผู้ใช้); {session.close ();}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>วิธีการพัฒนาแผนที่การทำแผนที่จำเป็นต้องปฏิบัติตามข้อกำหนดต่อไปนี้:
เนมสเปซในไฟล์ Mapper นั้นเหมือนกับชื่อที่ผ่านการรับรองอย่างสมบูรณ์ของอินเตอร์เฟส DAO; ID ของคำสั่งในไฟล์ Mapper นั้นเหมือนกับชื่อวิธีของอินเตอร์เฟส DAO ParameterType/resultType ของคำสั่งในไฟล์ mapper นั้นเหมือนกับพารามิเตอร์/ผลลัพธ์ของวิธี DAO
การทำแผนที่แผนที่
ฟังก์ชั่นหลักของไฟล์การแมป Mapper (เช่น userdao.xml) คือการกำหนดคำสั่ง SQL (แต่ละ SQL เป็นคำสั่ง) ซึ่งเป็นแกนหลักของ mybatis
MyBatis แนะนำอย่างเป็นทางการโดยใช้วิธีการทำแผนที่ Mapper เพื่อพัฒนา DAO ดังนั้นเราจะไม่แนะนำมากเกินไปเกี่ยวกับการพัฒนา DAO ดั้งเดิมในอนาคต
การทำแผนที่อินพุต
พารามิเตอร์ที่เป็นทางการหลายตัว
ตัวอย่างก่อนหน้าของการผ่านประเภทง่าย ๆ ถูกนำมาใช้ดังนั้นฉันจะไม่ทำซ้ำที่นี่ เมื่อต้องผ่านพารามิเตอร์อย่างเป็นทางการหลายตัวพารามิเตอร์พารามิเตอร์ ParameterType ไม่จำเป็นอีกต่อไป:
ผู้ทำแผนที่
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> #{1}, password = #{2} โดยที่ id = #{0}; </update> </code> </doy> </doy> </do Code> </do 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 (ID จำนวนเต็ม, ชื่อสตริง, รหัสผ่านสตริง) พ่นข้อยกเว้น; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code code> </code> </code> </code
PO ที่เข้ามา
MyBatis ใช้นิพจน์ OGNL เพื่อแยกวิเคราะห์ค่าแอตทริบิวต์วัตถุ:
ผู้ทำแผนที่
<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} และรหัสผ่าน = #{รหัสผ่าน}; </select> </code> </code> </code> </code> </code> </code> </code> </doy> </do 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 (ผู้ใช้ผู้ใช้) โยน Exception; </code> </code> </code> </code> </code> </code> </code> </code> </code> </do> </do 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> <co de> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <เลือก id = "selectuserByMap" parameterType = "java.util.map" resultType = "com.fq.domain.user"> เลือก *จาก userwhere name = #{ชื่อ} และรหัสผ่าน = #{รหัสผ่าน}; </select> </code> </code> </code> </code> </code> </code> </code> </doy> </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 (แผนที่ <string, object = ""> แผนที่) โยน ข้อยกเว้น; </string,> </code> </code> </code> </doy> </doy> </doy> </doy> </do 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> <co de> <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> <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> </do> </do code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
การส่งคืนประเภทง่าย ๆ จะต้องตรวจสอบให้แน่ใจว่าผลลัพธ์การสืบค้นมีเพียงหนึ่งแถวของระเบียนและค่าของฟิลด์แรกจะถูกแปลงเป็นประเภทเอาต์พุตในที่สุด
Output Object/List
มีการสาธิตเอาต์พุตสองประเภทมาก่อน (SelectUserById/SelectUserByName ใช้วิธีการพัฒนา DAO ดั้งเดิมในเวลานั้น แต่แบบฟอร์มคำจำกัดความของ MAPPER นั้นคล้ายกัน) ดังนั้นฉันจะสรุปได้ง่ายๆที่นี่:
ผลลัพธ์ที่กำหนดไว้ใน Mapper เมื่อเอาท์พุทวัตถุ PO เดียวจะเหมือนกับผลลัพธ์ที่กำหนดไว้ใน Mapper; ผลการสอบถาม SQL จะต้องรับประกันว่าจะเป็นข้อมูลชิ้นเดียวและเรียกว่าภายในโดยใช้วิธีการเลือก รายการ PO เอาท์พุทระบุว่าผลลัพธ์การสืบค้นอาจมีหลายรายการและเรียกว่าภายในโดยใช้เมธอด SelectList และค่าการส่งคืนอินเทอร์เฟซสามารถโฮสต์ตามรายการ/ชุด
แผนที่เอาต์พุต
วัตถุ Output PO สามารถใช้แทนการใช้เอาต์พุต MAP โดยมีชื่อฟิลด์เป็นคีย์และค่าฟิลด์เป็นค่า
ผู้ทำแผนที่
<code> <select id = "selectuserlikename" resultType = "java.util.map"> เลือก *จากชื่อผู้ใช้เช่น '%$ {value}%'; </select> </code>ผู้ใช้
<code> <code> list <map <string, object = "" >> selectUserLikEname (ชื่อสตริง) พ่นข้อยกเว้น; </map <String,> </code> </code>
MAP ผลลัพธ์
ResultType สามารถแมปผลลัพธ์การสืบค้นกับ PO แต่หลักฐานคือชื่อคุณสมบัติ PO และชื่อฟิลด์ SQL ต้องเหมือนกัน หากไม่สอดคล้องกันการแมปที่สอดคล้องกันสามารถทำได้ผ่านผลลัพธ์ที่ได้:
ผู้ทำแผนที่
<code> <code> <code> <resultmap id = "usermap" type = "com.fq.domain.user"> <id column = "user_id" คุณสมบัติ = "id"> <result column = "user_name" คุณสมบัติ = "name"> <result = "user_password" parameterType = "java.lang.string" resultmap = "usermap"> เลือก user_id ชื่อ user_name รหัสผ่าน user_passwordfrom userwhere name = #{name};อินเทอร์เฟซ UserDao นั้นเหมือนกับก่อนหน้านี้