ความสัมพันธ์ที่เราเรียนรู้เป็นหลักในวันนี้คือความสัมพันธ์แบบตัวต่อตัวและความสัมพันธ์แบบตัวต่อตัว
1. ความสัมพันธ์แบบตัวต่อตัว
มาอธิบายผ่านตัวอย่าง (ภรรยาสอดคล้องกับสามี)
1) ข้อมูลฐานข้อมูล
สร้างตาราง t_wife (ID int คีย์หลัก auto_increment, wife_name varchar (), fk_husband_id int); สร้างตาราง t_husband (id int คีย์หลักอัตโนมัติ auto_increment, husker_name varchar ()); แทรกลงใน t_husband
2) รหัส Javabean ที่เกี่ยวข้อง
แม้ว่าจะมีคีย์ต่างประเทศเพียงหนึ่งเดียวที่กำหนดโดยฝ่ายหนึ่งในฐานข้อมูล แต่ความสัมพันธ์แบบหนึ่งต่อหนึ่งนี้เป็นความสัมพันธ์แบบสองทาง
สามี. java
แพ็คเกจ com.cy.mybatis.beans; นำเข้า java.io.serializable;/*** หนึ่งต่อหนึ่ง*@author acer **/ชนชั้นสาธารณะสามีชาวสามีใช้สามีที่เป็นอนุกรม {super (); this.id = id; this.name = name; this.wife = wife;} public Integer getid () {return id;} โมฆะสาธารณะ setid (จำนวนเต็ม id) {this.id = id;} สตริงสาธารณะ getName () {ชื่อกลับ; SetWife (ภรรยาภรรยา) {this.wife = ภรรยา;}@verridepublic String toString () {return "สามี [id =" + id + ", name =" + name + ", wife =" + wife + "]";}}}}} wifebean.java
แพ็คเกจ com.cy.mybatis.beans; นำเข้า java.io.serializable;/*** หนึ่งต่อหนึ่ง*@author acer **/ชั้นเรียนสาธารณะ Wifebean ใช้ serializable {private static long long long long long hushing; {super (); this.id = id; this.name = name; this.husband = สามี;} public Integer getid () {return id;} โมฆะสาธารณะ setid (จำนวนเต็ม ID) {this.id = id;} public String getName () {return name; โมฆะ Sethusband (สามีสามี) {this.husband = สามี;}@verridepublic String toString () {return "ภรรยา [id =" + id + ", ชื่อ =" + ชื่อ + ", สามี =" + สามี + "]";}}} " 3) ถัดไปสร้างอินเทอร์เฟซสองตัวคือชาวนาและ Wifemapper
ชาวนา
แพ็คเกจ com.cy.mybatis.mapper; นำเข้า com.cy.mybatis.beans.husbandbean; อินเทอร์เฟซสาธารณะ huskermapper {/*** ข้อมูลสามีแบบสอบถามตาม ID*@param id* @return*@throws ยกเว้น Husberbean SelecthusbandandWife (ID int) โยนข้อยกเว้น;} 4) กำหนดไฟล์ hasmapper.xml
<? xml version = "." encoding = "utf-"?> <! Doctype Mapper สาธารณะ "-// mybatis.org/dtd mapper" "http://mybatis.org/dtd/mybatis--mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.husbandmapper "> <resultmap type =" huskerbean "id =" huskerandwife " javatype = "java.lang.integer"/> <property result = "name" คอลัมน์ = "name" javatype = "java.lang.string"/> <!- เชื่อมโยงประเภทการเชื่อมโยงที่ซับซ้อน; ผลลัพธ์จำนวนมากจะถูกบรรจุลงในการเชื่อมโยงของแผนที่ผลลัพธ์แบบฝังตัวนี้หรืออ้างอิงถึงคอลัมน์ = "id" ID ที่นี่หมายถึงรหัสคีย์หลักจากตาราง t_wife ภรรยาแบบสอบถามคนนี้ดังนั้นจึงมีวิธีการใน Mapper ภรรยา-> <Association Property = "Wife" คอลัมน์ = "id" javatype = "Wifebean" select = "com.cy.mybatis.mapper.wifemapper.selectwifyhusbandid" -> <select id = "selecthusbandById" resultType = "huskerbean"> เลือก * จาก t_husband โดยที่ id =#{id} </select> <! ส่งคืนคอลเลกชัน -> <select id = "selecthusbandandwife" resultmap = "huskerandwife"> เลือก * จาก t_husband โดยที่ id =#{id} </select> </ mapper>มีวิธีการใน wifemapper.xml
<? xml version = "." encoding = "utf-"?> <! Doctype Mapper สาธารณะ "-// mybatis.org/dtd mapper" "http://mybatis.org/dtd/mybatis--mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.wifemapper "> <select id =" selectwifyhushusbandid #{id} </select> </mapper> 5) เขียนการใช้งาน
แพ็คเกจ com.cy.mybatis.service; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า com.cy.mybatis.beans.husbandbean; นำเข้า com.cy.mybatis.mapper.husbandmapper; args) {selecthusbandandwife ();} โมฆะคงที่ส่วนตัว selecthusbandandwife () {sqlsession session = dbtools.getSession (); ชาวนา hmper hm = เซสชัน. getMapper Catch (Exception E) {E.printStackTrace ();}}} หมายเหตุ: คลาสเครื่องมือถูกเขียนในบทก่อนหน้าซึ่งค่อนข้างคล้ายกับที่จัดตั้งขึ้นบนพื้นฐานของเมื่อวานนี้
สังเกต:
MyBatis ใช้งานได้จริงใน XML วิธีการทั้งหมดของเราถูกกำหนดโดยตรงใน XML การเขียนอินเทอร์เฟซเป็นเพียงเพื่อให้สอดคล้องกับความคิดสามชั้นของเรา หากคุณไม่ได้เขียนอินเทอร์เฟซคุณสามารถใช้วิธีการใน XML โดยตรงผ่านเซสชัน
ตราบใดที่มีวิธีการใน XML สามารถใช้งานได้และวิธีการโทรคือ: Namespace+ Method Method;
เมื่อใช้ ResultType สำหรับข้อยกเว้นตรวจสอบให้แน่ใจว่าชื่อแอตทริบิวต์ของคุณเหมือนกับชื่อฟิลด์
หากไม่เหมือนกันให้ใช้ผลลัพธ์
2. ความสัมพันธ์แบบหนึ่งถึงหลายคน
มาอธิบายผ่านตัวอย่าง (ล็อคหนึ่งอันสอดคล้องกับหลายปุ่ม)
2.1) ไม่มีการเพิ่มข้อมูลที่นี่ในข้อมูลฐานข้อมูลเราใช้แบทช์เพื่อเพิ่มข้อมูล
สร้างตาราง t_key (ID int คีย์หลัก auto_increment, key_name varchar (), fk_lock_id int); สร้างตาราง t_lock (ID int คีย์หลัก auto_increment, lock_name varchar ());
2.2) คลาสเอนทิตี
keybean.java
แพ็คเกจ com.cy.mybatis.beans; นำเข้า java.io.serializable;/*** manytoone ** **/คลาสสาธารณะ Keybean ใช้ serializable {ส่วนตัวคงที่ความยาวคงสุดท้าย serialversionuid = l; ID INTEGER ส่วนตัว {super (); this.id = id; this.key = key; this.lock = lock;} public integer getId () {return id;} โมฆะสาธารณะ setId (จำนวนเต็ม id) {this.id = id;} สตริงสาธารณะ getKey () {return key; setLock (ล็อคล็อค) {this.lock = lock;}@overridepublic สตริง toString () {return "keyBean [id =" + id + ", key =" + key + ", lock =" + lock + "]";}}}}}}}} java.util.list;/*** onetomany***/คลาสสาธารณะ lockbean ใช้ serializable {ส่วนตัวคงสุดท้ายสุดท้าย serialversionuid = l; ID จำนวนเต็มส่วนตัว; ล็อคสตริงส่วนตัว; id; this.lock = lock; this.keys = keys;} public integer getId () {return id;} โมฆะสาธารณะ setId (Integer id) {this.id = id;} สตริงสาธารณะ getLock () {return lock; setKeys (รายการ <seybean> คีย์) {this.keys = keys;}@overridepublic สตริง toString () {return "lockebean [id =" + id + ", keys =" + keys + ", lock =" + lock + "]";}}}}} 2.3) สร้างอินเทอร์เฟซ
keymapper.javapackage com.cy.mybatis.mapper; นำเข้า java.util.list; นำเข้า org.apache.ibatis.annotations.param; นำเข้า com.cy.mybatis.beans.keybean; batchsavekeys (@param ("keys") รายการ <seybean> keys);} lockmapper.javapackage com.cy.mybatis.mapper; นำเข้า org.apache.ibatis.annotations.param; นำเข้า com.mybatis.beans.lockbeans savelock (@param ("ล็อค") ล็อคล็อค);/*** สอบถามข้อมูลของล็อคตาม ID* @param id* @return*/ล็อคสาธารณะ findlockbyid (int id);/*** สอบถามข้อมูลของล็อคและคีย์ตาม ID* onemany* @param id* @return* 2.4) สร้างไฟล์ XML
keymapper.xml
<? xml version = "." encoding = "utf-"?> <! Doctype Mapper สาธารณะ "-// mybatis.org/dtd mapper" "http://mybatis.org/dtd/mybatis--mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.keymapper "> <resultmap id =" keymap "type =" keybean " javatype = "java.lang.integer"/> <property result = "key" คอลัมน์ = "key_name" javatype = "java.lang.string"/> </resultmap> <! -> <!-ตัวคั่นระบุว่าสัญลักษณ์ใดที่ใช้เป็นตัวคั่นระหว่างการวนซ้ำแต่ละครั้ง -> <แทรก id = "batchsavekeys"> แทรกลงในค่า t_key <foreach collection = "keys" item = "key" ตัวแยก = ","> (null,#{key.key},#{key.lock.id}) #{id} </select> </mapper> lockmapper.xml <? xml version = "." encoding = "utf-"?> <! Doctype Mapper สาธารณะ "-// mybatis.org/dtd mapper" "http://mybatis.org/dtd/mybatis--mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.lockmapper "> <! javatype = "java.lang.integer"/> <property result = "lock" คอลัมน์ = "lock_name" javatype = "java.lang.string"/> <result property = "lock" คอลัมน์ = "lock_name" javatype = "java.lang.string" select = "com.cy.mybatis.mapper.keymapper.findkeysbylockid"> </collection> </resultmap> <แทรก id = "savelock"> แทรกลงในค่า t_lock (null,#{lock.lock}) #{id} </select> <select id = "findlockandkeys" resultmap = "lockandkeysmap"> เลือก * จาก t_lock โดยที่ id = #{id} </select> </mapper> 2.5) การดำเนินการ
แพ็คเกจ com.cy.mybatis.service; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า com.cy.mybatis.beans.keybean; com.cy.mybatis.mapper.lockmapper; นำเข้า com.cy.mybatis.tools.dbtools; ชั้นเรียนสาธารณะ onetomanyservice {โมฆะสาธารณะคงที่ (สตริง [] args) {// savelock (); // batchsavekeys (); FindlockandKeys ();} โมฆะคงที่ส่วนตัว FindlockandKeys () {sqlsession session = dbtools.getSession (); lockmapper lm = session.getMapper (lockmapper.class); lockbean lock = lm.findlockandkeys () = dbtools.getSession (); lockmapper lm = session.getMapper (lockmapper.class); keymapper km = session.getMapper (keymapper.class); lockbean lock = lm.findlockbyid (); keybean (null, "key"+i, lock); keys.add (key);} km.batchsavekeys (คีย์); session.commit ();} โมฆะคงที่ส่วนตัว savelock () {sqlsession session = dbtools.getSession (); lockmapper lmper. "ล็อค", null); lm.savelock (ล็อค); session.commit ();}} ผลลัพธ์แสดง:
3. การดำเนินการแบทช์และการแบ่งแยก
ที่นี่ฉันจะใช้ผู้ใช้จากบทก่อนหน้าและเขียนรหัสหลัก
ก่อนกำหนดวัตถุเพจ
แพ็คเกจ com.cy.mybatis.beans; นำเข้า java.util.list;/*** กำหนดวัตถุ pagination** @ผู้แต่ง*/page คลาสสาธารณะ {private int pageno; // หมายเลขหน้าปัจจุบันส่วนตัว int pagetotal pagetotal; // จำนวนหน้าทั้งหมด ชุดข้อมูลที่ส่งคืนสาธารณะ int getpageno () {return pageno;} โมฆะสาธารณะ setpageno (int pageno) {this.pageno = pageno;} int สาธารณะ int getPagetotal () {return pagetotal; getRowStotal () {return rowstotal;} โมฆะสาธารณะ setRowStotal (int rowstotal) {this.rowStotal = rowstotal; pagetotal = rowstotal % pagesize ==? rowstotal / pagesize: rowstotal / pagesize +;} public int getPagesize () {return pagesize;} โมฆะสาธารณะ setPagesize (หน้า int pageSize) {this.pagesize = pagesize;} รายการสาธารณะ < toString () {return "pager [pageno =" + pageno + ", pagetotal =" + pagetotal + ", rowstotal =" + rowstotal + ", pageize =" + pageize + ", list =" + list + "]";}}}}}}}}}}}} แพ็คเกจ com.cy.mybatis.mapper; นำเข้า java.util.list; นำเข้า java.util.map นำเข้า org.apache.ibatis.annotations.param; นำเข้า com.cy.mybatis.beans.userbean; ผู้ใช้ InsertUser (@Param ("ผู้ใช้") ผู้ใช้เบียน) พ่นข้อยกเว้น;/*** ใช้* @param ผู้ใช้* @param id* @return* @throws Exception*/public int updateUser (@param ("u") ผู้ใช้ UserBean, @param ("id") ข้อมูลตาม ID* @param id* @return* @throws Exception*/ผู้ใช้สาธารณะ SelectUserById (int id) พ่นข้อยกเว้น;/*** query ข้อมูลผู้ใช้ทั้งหมด* @return* @throws Exception*/รายการสาธารณะ <userbean> selectalluser () การโยนข้อยกเว้น โยนข้อยกเว้น;/*** แบทช์ลบ* @param list* @return* @throws Exception*/public int batchdeleteuser (@param ("list") รายการ <จำนวนเต็ม> รายการ) โยนข้อยกเว้น;/*** ข้อมูลการสืบค้นเพจ* parma* @return* @throws exception*/public int countuser (แผนที่ <string, object> parmas) โยนข้อยกเว้น;} ไฟล์ xml <? xml version = " encoding = "utf-"?> <! Doctype Mapper สาธารณะ "-// mybatis.org/dtd mapper" "http://mybatis.org/dtd/mybatis--mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.usermapper "> <! javatype = "java.lang.integer"> </id> <property result = "ชื่อผู้ใช้" คอลัมน์ = "ชื่อผู้ใช้" javatype = "java.lang.string"> </result> <result property = "รหัสผ่าน" รหัสผ่าน "รหัสผ่าน" JavaType = "java.lang.string" javatype = "java.lang.double"> </result> </resultmap> <!- แอตทริบิวต์ ID ในแท็กต่างๆจะต้องเหมือนกับชื่อวิธีในอินเทอร์เฟซและค่าแอตทริบิวต์ ID จะต้องไม่ซ้ำกันและไม่สามารถนำกลับมาใช้ใหม่ได้ คุณสมบัติพารามิเตอร์ของฉันระบุประเภทพารามิเตอร์ที่ใช้เมื่อสอบถามและคุณสมบัติของผลลัพธ์จะระบุประเภทชุดผลลัพธ์ที่ส่งคืนโดยการสืบค้น-> <!-useGeneratedKeys: (มันมีประโยชน์สำหรับการแทรกเท่านั้น) ซึ่งจะบอกให้ใช้ข้อมูลการจัดการระดับภายใน SQLServer) ค่าเริ่มต้น: เท็จ -> <!-KeyProperty: (มีประโยชน์สำหรับการแทรกเท่านั้น) ทำเครื่องหมายคุณสมบัติ MyBatis จะตั้งค่าผ่าน GetGeneratedKeys หรือผ่านองค์ประกอบลูก SelectKey ของคำสั่ง INSERT ค่าเริ่มต้น: ไม่ได้ตั้งค่า -> <!-#{} เนื้อหาเป็นตัวยึดตำแหน่ง เมื่อพารามิเตอร์เป็น javabean มันจะระบุค่าคุณสมบัติของวัตถุถั่วที่วางไว้-> <insert id = "InsertUser" useGeneratedKeys = "true" keyProperty = "user.id"> แทรกลงใน t_user (ชื่อผู้ใช้รหัสผ่าน id = "updateUser"> อัปเดต t_user set username =#{u.username}, รหัสผ่าน =#{u.password}, บัญชี =#{u.account} โดยที่ id =#{id} </update> <delete id = "deleteuser parameterType = "int" resultmap = "usermap"> เลือก * จาก t_user โดยที่ id =#{id} </select> <select id = "selectalluser" resultmap = "usermap"> เลือก * จาก t_user </select> <! ค่า t_user <foreach collection = "users" item = "users" separator = ","> (null,#{users.username},#{users.password},#{users.account}) </foreach> </insert> <ลบ id = "batchDeleteUser" separator = ",">#{id} </foreach>) </delte> <!-คอลเลกชันเป็นองค์ประกอบที่ใช้สำหรับ Traversal (จำเป็น), อาร์เรย์ที่รองรับ, รายการ, ชุด-> <!-รายการแทนนามแฝงเมื่อแต่ละองค์ประกอบในชุดถูกทำซ้ำ -> <!-ตัวคั่นแสดงว่าสัญลักษณ์ที่ใช้เป็นตัวคั่นระหว่างการวนซ้ำแต่ละครั้ง -> <select id = "pageruser" parameterType = "java.util.map" resultmap = "usermap"> เลือก * จาก t_user where = <ถ้า test = "ชื่อผู้ใช้! parameterType = "java.util.map" resultType = "int"> เลือกนับ (*) จาก t_user where = <ถ้า test = "ชื่อผู้ใช้! = null"> และชื่อผู้ใช้เช่น '%$ {ชื่อผู้ใช้ $ เมื่อสร้าง SQL คำพูดจะไม่ถูกรวมเข้าด้วยกัน มันสามารถใช้สำหรับคลาสทดสอบการประกอบพารามิเตอร์เช่นการสั่งซื้อโดยแพ็คเกจ com.cy.mybatis.service; นำเข้า java.util.arraylist; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map; com.cy.mybatis.beans.userbean; นำเข้า com.cy.mybatis.tools.dbtools นำเข้า com.cy.mybatis.mapper.usermapper; ผู้ใช้ระดับสาธารณะ {/*** @param args*/โมฆะสาธารณะ SelectUserById (); // selectalluser (); // batchinsertuser (); // batchdeleteuser (); // countuser (); pageruser ();} โมฆะส่วนตัว countuser () {sqlsession session = dbtools.getSession () ใหม่ hashmap <string, object> (); params.put ("ชื่อผู้ใช้", "kitty"); int index =; params.put ("ดัชนี", ดัชนี); // จากหน้าใดที่จะเริ่ม MySQL เริ่มต้นด้วย params.put ("pagesize",); // จำนวนแถบข้อมูลที่แสดงต่อหน้า int county; ลอง {count = mapper.countuser (params); system.out.println (นับ);} catch (ยกเว้น e) {E.printstacktrace (); dbtools.getSession (); usermapper mapper = session.getMapper (usermapper.class); แผนที่ <string, object> params = new hashmap <string, object> (); params.put ("ชื่อผู้ใช้", "kitty"); params.put ("ดัชนี",); // MySQL เริ่มต้นด้วย params.put ("pageSize",); // จำนวนแถบข้อมูลที่แสดงต่อหน้าลอง {list <userbean> u = mapper.pageruser (params); สำหรับ (UserBean UserBean: U) {System.out.println ("----------"+UserBean);}} catch (Exception E) {E.printStackTrace ();}} void batchdeleteuser () {sqlsession session = dbtools.getSession () session.getMapper (usermapper.class); รายการ <จำนวนเต็ม> ids = new ArrayList <จำนวนเต็ม> (); สำหรับ (int i =; i <; i ++) {ids.add (i);} ลอง {mapper.batchdeleteuser (ids); batchinsertuser () {sqlsession session = dbtools.getSession (); usermapper mapper = session.getMapper (usermapper.class); รายการ <userbean> ผู้ใช้ = new ArrayList <UserBean> () สำหรับ (int i =; i <; i ++) .); users.add (ผู้ใช้);} ลอง {mapper.batchinsertuser (ผู้ใช้); session.commit ();} catch (ยกเว้น e) {e.printstacktrace ();}}/*** ผู้ใช้ใหม่ session.getMapper (usermapper.class); ผู้ใช้ userbean = ผู้ใช้ใหม่ ("yi", "",.); ลอง {mapper.insertuser (ผู้ใช้); system.out.println (user.toString (); session.Commit (); โมฆะคงที่ deleteUser () {sqlsession session = dbtools.getSession (); usermapper mapper = session.getMapper (usermapper.class); ลอง {mapper.deleteuser ()*}}} {E.printstacktrace void updateUser () {sqlsession session = dbtools.getSession (); usermapper mapper = session.getMapper (usermapper.class); ผู้ใช้ userbean = ผู้ใช้ใหม่ ("Xiao Ming", "",.); ลอง {mapper.updateuser {E.PrintStackTrace (); session.rollback ();}}/*** ผู้ใช้การสืบค้นโดย ID*/โมฆะส่วนตัวคงที่ SelectUserById () {SQLSession เซสชัน = dbtools.getSession (); usermapper mapper = session.getMapper (usermapper.class); mapper.selectuserbyid (); system.out.println (user.toString ()); session.commit ();} catch (ข้อยกเว้น e) {e.printstacktrace (); session.rollback ();}}/*** queery ผู้ใช้ทั้งหมด*/ส่วนตัว mapper = session.getMapper (usermapper.class); ลอง {list <userbean> user = mapper.selectalluser (); system.out.println (user.toString ()); session.commit ();} catch (Exception e) {e.printstacktrace () ดูโครงการโดยรวม:
ทุกอย่างจะต้องคงอยู่!