สำหรับผู้ที่ไม่ชัดเจนเกี่ยวกับพื้นฐานของ mybatis โปรดดูบทความนี้: mybatis บทนำการเรียนรู้การเรียนรู้ (I) - mybatis บทนำอย่างรวดเร็ว
พบ mybatis
MyBatis เป็นโครงการโอเพ่นซอร์สของ Apache ในปี 2010 โครงการนี้ถูกย้ายจาก Apache Software Foundation เป็น Google Code และถูกเปลี่ยนชื่อ MyBatis อพยพไปยัง GitHub ในเดือนพฤศจิกายน 2013
คำว่า Ibatis มาจากการรวมกันของ "อินเทอร์เน็ต" และ "abatis" และเป็นกรอบการคงอยู่ของจาวา Ibatis จัดเตรียมเฟรมเวิร์กเลเยอร์การคงอยู่รวมถึงแผนที่ SQL และวัตถุการเข้าถึงข้อมูล (DAO)
อัลบั้มรูปภาพ MyBatis
การแนะนำ
ฉันพูดถึงการสืบค้นฐานข้อมูลและแบบสอบถามการจัดการมาก่อน มีการพัฒนาอุปสงค์แบบหนึ่งต่อหนึ่งแบบหนึ่งต่อหลายและหลายต่อหลายคนในข้อกำหนดการพัฒนา ตัวอย่างเช่นเมื่อพัฒนาตะกร้าสินค้าคำสั่งซื้อและผู้ใช้เป็นแบบหนึ่งต่อหนึ่งผู้ใช้และคำสั่งซื้อเป็นแบบหนึ่งต่อหลายคนและผู้ใช้และผลิตภัณฑ์มีหลายต่อหลายคน สิ่งเหล่านี้เป็นเรื่องธรรมดาในการพัฒนาไฮเบอร์เนต พวกเขาจะถูกนำไปใช้ผ่านการแมปข้อมูลในไฮเบอร์เนตและใน mybatis พวกเขาจะถูกนำไปใช้ผ่านการแมปข้อมูลในไฟล์การกำหนดค่า
แบบสอบถามแบบตัวต่อตัว
หากเราต้องการสอบถามข้อมูลการสั่งซื้อและเชื่อมโยงข้อมูลผู้ใช้แบบสอบถามสำหรับการสร้างคำสั่งซื้อนี่เป็นแบบสอบถามแบบหนึ่งต่อหนึ่งทั่วไป มีสองวิธีในการใช้แบบสอบถามแบบหนึ่งต่อหนึ่ง: ใช้ผลลัพธ์และผลลัพธ์ ResultType ต้องการคำจำกัดความ POJO เพิ่มเติมจากนั้นฟิลด์การสืบค้นจะสอดคล้องกับ pojo ที่กำหนดใหม่ทีละคน ResultSmap จำเป็นต้องใช้ความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างสอง pojos ผ่านไฟล์การกำหนดค่า มาใช้สองวิธีนี้แยกกันด้านล่าง
ผลการแข่งขัน:
1. สร้าง pojo และเพิ่มแอตทริบิวต์ใหม่ที่จำเป็นต้องแมปกับ pojo ใหม่
OrderCustom ระดับสาธารณะขยายคำสั่งซื้อ {// เพิ่มข้อมูลผู้ใช้ชื่อผู้ใช้ส่วนตัวชื่อผู้ใช้ เซ็กซ์สตริงส่วนตัว; ที่อยู่สตริงส่วนตัว สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } Public String getSex () {return sex; } โมฆะสาธารณะ setsex (String sex) {this.sex = sex; } สตริงสาธารณะ getAddress () {return address; } โมฆะสาธารณะ setAddress (ที่อยู่สตริง) {this.address = ที่อยู่; -2. ไฟล์การแมป:
<select id = "FindOrderUser" resultType = "com.luchao.mybatis.first.po.ordercustom"> เลือกคำสั่งซื้อ*, user.username, user.sex, user.address จากคำสั่ง
3. การใช้งานอินเทอร์เฟซ Mapper:
// คำสั่งค้นหาและข้อมูลผู้ใช้รายการสาธารณะ <OrderCustom> findOrderUser () โยนข้อยกเว้น;
4. รหัสทดสอบ:
Public Void finderDersuser () โยนข้อยกเว้น {// รับวัตถุ SQLSession SQLSession SQLSession = SQLSessionFactory.Opensession (); // สร้างวัตถุ OrderMapper, myBatis สร้าง mapper proxy ordermapper ordermapper = sqlsession.getMapper (ordermapper.class) โดยอัตโนมัติ // โทรเมธอด ordermapper เพื่อสอบถามคำสั่งซื้อและรายการข้อมูลผู้ใช้ <ordercustom> ordercustoms = ordermapper.findorderuser (); System.out.println (ordercustoms.size ()); -การใช้งานผลลัพธ์:
MAP ผลลัพธ์แผนที่ข้อมูลการสั่งซื้อในผลลัพธ์การสืบค้นไปยังวัตถุคำสั่งซื้อเพิ่มแอตทริบิวต์ผู้ใช้ในคลาสคำสั่งซื้อและแมปข้อมูลผู้ใช้คิวรีที่เกี่ยวข้องกับแอตทริบิวต์ผู้ใช้ในวัตถุคำสั่งซื้อ
1. สร้าง pojo และเพิ่มแอตทริบิวต์ผู้ใช้ในคลาสคำสั่งซื้อ
คำสั่งซื้อระดับสาธารณะ {ID จำนวนเต็มส่วนตัว; ผู้ใช้จำนวนเต็มส่วนตัว หมายเลขสตริงส่วนตัว วันที่ส่วนตัว createTime; หมายเหตุสตริงส่วนตัว; // ข้อมูลผู้ใช้ผู้ใช้ส่วนตัวผู้ใช้; // รายการสั่งซื้อรายการส่วนตัว <OrderDetail> orderDetails; จำนวนเต็มสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (ID จำนวนเต็ม) {this.id = id; } Public Integer GetUserId () {return userId; } โมฆะสาธารณะ setUserId (จำนวนเต็ม USERID) {this.UserId = userId; } สตริงสาธารณะ getNumber () {หมายเลขส่งคืน; } โมฆะสาธารณะ setNumber (หมายเลขสตริง) {this.number = number == null? null: number.trim (); } วันที่สาธารณะ getCreateTime () {return createTime; } โมฆะสาธารณะ setCreateTime (วันที่ createTime) {this.createTime = createTime; } สตริงสาธารณะ getNote () {return note; } โมฆะสาธารณะ setNote (หมายเหตุสตริง) {this.note = note == null? null: note.trim (); } ผู้ใช้สาธารณะ getUser () {return user; } โมฆะสาธารณะ setUser (ผู้ใช้ผู้ใช้) {this.user = ผู้ใช้; } รายการสาธารณะ <OrderDetail> getOrderDetails () {return orderDetails; } โมฆะสาธารณะ setOrderDetails (รายการ <orderDetail> orderDetails) {this.orderDetails = orderDetails; -2. ไฟล์การแมป:
<!-การสืบค้นคำสั่งซื้อผลลัพธ์ของผู้ใช้ที่เกี่ยวข้องแมปผลการสอบถามทั้งหมดกับคำสั่งซื้อ-> <resultmap type = "com.luchao.mybatis.first.po.orders" id = "ordersuserresultmap"> <id column = "id" คุณสมบัติ = "id" /> < column = "createTime" property = "createTime" /> <result column = "note" คุณสมบัติ = "note" /> <!-กำหนดค่าข้อมูลผู้ใช้ที่เกี่ยวข้องของการแมป-> <!-การเชื่อมโยง: ใช้เพื่อแมปข้อมูลสำหรับคุณสมบัติการสืบค้นวัตถุเดียวที่เกี่ยวข้อง: คุณสมบัติใดในคำสั่งซื้อ javatype = "com.luchao.mybatis.first.po.user"> <!-id: ID ที่ไม่ซ้ำกันของคอลัมน์ผู้ใช้คิวรีที่เกี่ยวข้อง: ระบุคอลัมน์ที่ระบุข้อมูลผู้ใช้ javatype: คุณสมบัติของผู้ใช้ property = "sex"/> <result column = "address" property = "address"/> </secelation> </resultmap> <select id = "findorenderUserMap" resultmap = "orderSuserResultMap"> เลือกคำสั่งซื้อ*, user.username, user.sex, ผู้ใช้
สมาคม: ใช้ในการแมปข้อมูลของวัตถุแบบสอบถามเดียวที่เกี่ยวข้องคุณสมบัติ: คุณสมบัติใดในคำสั่งซื้อเพื่อแมปข้อมูลผู้ใช้ของแบบสอบถามที่เกี่ยวข้องกับ
3. อินเตอร์เฟส Mapper
// คำสั่งซื้อแบบสอบถามและข้อมูลผู้ใช้ผ่านรายการผลลัพธ์สาธารณะ <คำสั่งซื้อ> findOrderUserMap () โยนข้อยกเว้น;
4. รหัสทดสอบ:
โมฆะสาธารณะ findordersusermap () พ่นข้อยกเว้น {// รับวัตถุ SQLSession SQLSession SQLSession = SQLSessionFactory.Opensession (); // สร้างวัตถุ OrderMapper, myBatis จะสร้าง mapper proxy ordermapper ordermapper = sqlsession.getMapper (ordermapper.class) โดยอัตโนมัติ // โทรเมธอด ordermapper เพื่อสอบถามคำสั่งซื้อและรายการข้อมูลผู้ใช้ <คำสั่งซื้อ> order = ordermapper.findorderUsermap (); System.out.println (order.size ()); -ResultType และ ResultSmap ใช้บทสรุปแบบสอบถามแบบหนึ่งต่อหนึ่ง:
ResultType: มันค่อนข้างง่ายที่จะนำไปใช้โดยใช้ ResultType หากชื่อคอลัมน์แบบสอบถามไม่รวมอยู่ใน POJO คุณจะต้องเพิ่มแอตทริบิวต์ที่เกี่ยวข้องของชื่อคอลัมน์เพื่อทำการแมปให้เสร็จสมบูรณ์ หากไม่มีข้อกำหนดพิเศษสำหรับผลลัพธ์การสืบค้นขอแนะนำให้ใช้ ResultType
ResultMap: MAP ผลลัพธ์จะต้องมีการกำหนดแยกต่างหากซึ่งเป็นปัญหาเล็กน้อย หากมีข้อกำหนดพิเศษสำหรับผลลัพธ์การสืบค้นการใช้ ResultMap สามารถทำให้แอตทริบิวต์ของการทำแผนที่การสืบค้นที่เกี่ยวข้องเสร็จสมบูรณ์ Map ResultsMap สามารถใช้งานได้อย่างขี้เกียจ ResultType ไม่สามารถใช้การโหลดขี้เกียจได้
แบบสอบถามแบบหนึ่งต่อหลายคน
หากคุณต้องการสอบถามรายละเอียดการสั่งซื้อและการสั่งซื้อนี่คือข้อกำหนดการสืบค้นแบบหนึ่งต่อหลายคน
1. Pojo เหมือนกับ pojo ของคำสั่งในผลลัพธ์ที่ได้ด้านบน ตั้งค่ารายละเอียดการสั่งซื้อเป็นรายการเป็นแอตทริบิวต์ของคำสั่งซื้อ
2. ไฟล์การแมป:
<!-แผนที่สำหรับรายละเอียดการสั่งซื้อและการสั่งซื้อและข้อมูลผู้ใช้ใช้การสืบทอดไม่จำเป็นต้องกำหนดค่าการสั่งซื้อและข้อมูลผู้ใช้-> <resultmap type = "com.luchao.mybatis.first.po.orders" id = "orderDetailResultMap OFType = "com.luchao.mybatis.first.po.orderDetail"> <result column = "orderDetail_id" คุณสมบัติ = "id" /> <result column = "items_id" คุณสมบัติ = "itemitsid" /> <select id = "finderNandorDorderDetailMap" resultmap = "orderorderDetailResultMap"> เลือกคำสั่งซื้อ*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num order.user_id = user.id และ orderdetail.orders_id = order.id </select>
แผนที่ผลลัพธ์ของคำสั่งซื้อและรายละเอียดการสั่งซื้อได้รับการสืบทอดโดยใช้ส่วนขยายและไม่จำเป็นต้องกำหนดค่าการแมปข้อมูลคำสั่งซื้อและข้อมูลผู้ใช้
คอลเลกชัน: แมปหลายระเบียนไปยังวัตถุคอลเลกชันสำหรับการสืบค้นสมาคมคุณสมบัติ: แผนที่หลายบันทึกไปยังคุณสมบัติการสั่งซื้อ
OFTYPE: ระบุประเภทที่แมปกับ POJO ในแอตทริบิวต์การรวบรวมรายการ โปรดทราบว่ายังมีความแตกต่างระหว่าง OFTYPE และ One-to-One
3. อินเทอร์เฟซ Mapper:
// การสอบถามคำสั่งซื้อรายละเอียดการสั่งซื้อและข้อมูลผู้ใช้ผ่าน ResultMap
รายการสาธารณะ <คำสั่งซื้อ> findOrderAndOrderDetailMap () โยนข้อยกเว้น;
4. รหัสทดสอบ:
โมฆะสาธารณะ findOrderNandorderDetailMap () โยนข้อยกเว้น {// รับวัตถุ SQLSession SQLSession SQLSession = SQLSessionFactory.Opensession (); // สร้างวัตถุ OrderMapper, myBatis จะสร้าง mapper proxy ordermapper ordermapper = sqlsession.getMapper (ordermapper.class) โดยอัตโนมัติ // โทรเมธอด orderMapper เพื่อสอบถามคำสั่งซื้อและรายการข้อมูลผู้ใช้ <คำสั่งซื้อ> order = orderMapper.findOrderAndOrderDetailMap (); System.out.println (order.get (). getOrderDetails (). size ()); System.out.println (order.size ()); -สรุปแบบหนึ่งต่อหลายคน:
MyBatis ใช้คอลเลกชันของ ResultMap เพื่อแมปหลายระเบียนของแบบสอบถามที่เกี่ยวข้องลงในคุณสมบัติการรวบรวมรายการ
การใช้งานโดยใช้ ResultType:
การทำแผนที่รายละเอียดการสั่งซื้อเป็นคำสั่งซื้อในคำสั่งซื้อคุณต้องจัดการด้วยตัวเองใช้ลูปสองครั้งเพื่อสำรวจลบบันทึกที่ซ้ำกันและวางรายละเอียดการสั่งซื้อใน orderdetails นี่จะเป็นปัญหามากขึ้น
หลายถึงหลายคน
หากเราสอบถามข้อมูลผู้ใช้และข้อมูลผลิตภัณฑ์ของผู้ใช้นี่เป็นแบบหลายต่อหลายครั้งและคุณสามารถใช้การทำแผนที่หลายต่อหลายครั้งของ MyBatis
แมปข้อมูลผู้ใช้เป็นผู้ใช้ เพิ่มรายการแอตทริบิวต์รายการคำสั่งซื้อ <derrders> orderlist ในคลาสผู้ใช้แผนที่คำสั่งซื้อที่สร้างโดยผู้ใช้ไปยัง orderslist เพิ่มรายละเอียดรายการรายการแอตทริบิวต์รายการ <forderdetail> orderdetials ในคำสั่งซื้อแมปรายละเอียดการสั่งซื้อไปยัง orderdetials เพิ่มแอตทริบิวต์รายการใน orderdetail
1. Pojo
Public Class OrderDetail {ID จำนวนเต็มส่วนตัว; คำสั่งซื้อจำนวนเต็มส่วนตัว รายการจำนวนเต็มส่วนตัว รายการจำนวนเต็มส่วนตัว // ข้อมูลผลิตภัณฑ์รายการส่วนตัวรายการ; จำนวนเต็มสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (ID จำนวนเต็ม) {this.id = id; } จำนวนเต็มสาธารณะ getOrdersid () {return orderId; } โมฆะสาธารณะ setordersid (คำสั่งซื้อจำนวนเต็ม) {this.ordersid = orderid; } จำนวนเต็มสาธารณะ getItemSID () {return itemitid; } โมฆะสาธารณะ setItemSID (จำนวนเต็ม itemitId) {this.itemsid = itemsId; } จำนวนเต็มสาธารณะ getItemsnum () {return itemnum; } โมฆะสาธารณะ setItemsNum (จำนวนเต็ม itemnum) {this.itemsnum = itemsNum; } รายการสาธารณะ getItems () {รายการส่งคืน; } โมฆะสาธารณะ setItems (รายการรายการ) {this.items = รายการ; } @Override สตริงสาธารณะ toString () {return "orderDetail [id =" + id + ", ordersid =" + ordersid + ", itemsId =" + itemsId + ", itemnum =" + itemnum + "]"; -2. ไฟล์การแมป:
<!-สอบถามผู้ใช้และผลิตภัณฑ์ที่ซื้อ-> <resultmap type = "com.luchao.mybatis.first.po.user" id = "orderiteMsResultMap"> <!-ข้อมูลผู้ใช้-> <id column = "user_id" คอลัมน์ = "ที่อยู่" คุณสมบัติ = "ที่อยู่" /> <!-ข้อมูลการสั่งซื้อผู้ใช้สอดคล้องกับคำสั่งซื้อหลายคำสั่งใช้การแมปคอลเลกชัน-> <การรวบรวมคุณสมบัติ = "orderslist" OFType = "com.luchao.mybatis.first.po.orders"> <id column = "id" /> <result column = "createTime" property = "createTime" /> <result column = "note" property = "note" /> <!-รายละเอียดการสั่งซื้อหนึ่งคำสั่งรวมถึงรายละเอียดหลายอย่าง-> <collection property = "orderDetails" OFType = "com.luchao.mybatis.first.po.orderdetail" property = "imitesid" /> <result column = "items_num" property = "itemsNum" /> <result column = "orders_id" คุณสมบัติ = "ordersid" /> <!-ข้อมูลผลิตภัณฑ์รายละเอียดหนึ่งคำสั่งสอดคล้องกับผลิตภัณฑ์หนึ่ง-> <การเชื่อมโยงคุณสมบัติ = "รายการ" javatype = "com.luchao.mybatis.first. column = "items_name" property = "name"/> <result column = "items_detail" คุณสมบัติ = "รายละเอียด"/> <result column = "items_price" คุณสมบัติ = "ราคา"/> </eceless> </collection> </collection> </resultmap> user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.id items_id, items.name items_name, items.detail items_detail, รายการ orderdetail.orders_id = order.id และ orderdetail.items_id = items.id </select>
จะเห็นได้ว่าหลายต่อหลายคนนั้นเป็นการรวมกันของแบบตัวต่อตัวและแบบหนึ่งต่อหนึ่ง ปัญหาที่ซับซ้อนทั้งหมดเป็นการรวมกันของปัญหาง่ายๆ ตราบใดที่คุณวิเคราะห์พวกเขาอย่างระมัดระวังคุณสามารถเข้าใจหลักการ
3. อินเทอร์เฟซ Mapper:
// คำสั่งซื้อแบบสอบถามรายละเอียดการสั่งซื้อและข้อมูลผู้ใช้ผ่านรายการ Public Public Map <ผู้ใช้> FindOrderAndItEmmap () ส่งข้อยกเว้น
4. รหัสทดสอบ:
โมฆะสาธารณะ findOrderNandItemMap () โยนข้อยกเว้น {// รับวัตถุ SQLSession SQLSession SQLSession = SQLSessionFactory.Opensession (); // สร้างวัตถุ OrderMapper, myBatis จะสร้าง mapper proxy ordermapper ordermapper = sqlsession.getMapper (ordermapper.class) โดยอัตโนมัติ // โทรเมธอด ordermapper เพื่อสอบถามคำสั่งซื้อและรายการข้อมูลผู้ใช้ <user> ผู้ใช้ = ordermapper.findorderanditeMmap (); System.out.println (users.get (). getOrderslist (). get () .getOrderDetails (). get (). getId ()); // system.out.println (order.size ()); -สรุปการสืบค้นแบบหลายต่อหลายครั้ง:
ข้อกำหนดข้างต้นใช้ผลลัพธ์ที่ได้เพื่อแมปบันทึกที่ถูกสืบค้นลงใน POJO ที่ขยายออกไปซึ่งง่ายมากที่จะใช้ฟังก์ชั่นของรายการโดยละเอียด แต่สิ่งนี้ไม่สามารถใช้การโหลดขี้เกียจได้ ใช้ ResultMap เพื่อแมปรายการรายละเอียดของรายการที่ผู้ใช้ซื้อไปยังวัตถุซึ่งอนุญาตให้โหลดขี้เกียจ การใช้ผลลัพธ์ MAP สำหรับฟังก์ชั่นเหล่านั้นที่มีข้อกำหนดพิเศษสำหรับการแมปการสืบค้นผลลัพธ์เช่นการแมปข้อกำหนดพิเศษในรายการรวมถึงรายการหลายรายการ
สรุปผลลัพธ์
1. ผลการแข่งขัน:
ผล:
แมปผลลัพธ์การสืบค้นเป็น pojo ตามชื่อคอลัมน์ SQL ชื่อแอตทริบิวต์ชื่อความสอดคล้อง
โอกาส:
การแสดงผลทั่วไปของบันทึกโดยละเอียดเช่นเมื่อผู้ใช้ซื้อรายละเอียดผลิตภัณฑ์และแสดงข้อมูลการสืบค้นที่เกี่ยวข้องทั้งหมดในหน้าคุณสามารถใช้ผลลัพธ์โดยตรงเพื่อแมปแต่ละบันทึกลงใน POJO และสำรวจรายการ (POJO ในรายการ) ในหน้าส่วนหน้า
2. ผลลัพธ์ที่ได้:
ใช้การเชื่อมโยงและคอลเลกชันเพื่อทำแผนที่ขั้นสูงแบบหนึ่งต่อหนึ่งและหนึ่งต่อหนึ่ง (มีข้อกำหนดการทำแผนที่พิเศษสำหรับผลลัพธ์)
สมาคม:
ผล:
แมปข้อมูลการสืบค้นที่เกี่ยวข้องลงในวัตถุ POJO
โอกาส:
เพื่ออำนวยความสะดวกในการสอบถามข้อมูลที่เกี่ยวข้องคุณสามารถใช้การเชื่อมโยงเพื่อทำแผนที่ข้อมูลคำสั่งซื้อที่เกี่ยวข้องลงในแอตทริบิวต์ POJO ของวัตถุผู้ใช้เช่น: คำสั่งค้นหาและข้อมูลผู้ใช้ที่เกี่ยวข้อง
การใช้ ResultType ไม่สามารถแมปผลลัพธ์การสืบค้นกับแอตทริบิวต์ POJO ของวัตถุ POJO เลือกว่าจะใช้ ResultType หรือผลลัพธ์ตามความต้องการของการสำรวจการค้นหาชุดผลลัพธ์
ของสะสม:
ผล:
แมปข้อมูลการสืบค้นที่เกี่ยวข้องลงในรายการรวบรวมรายการ
โอกาส:
เพื่ออำนวยความสะดวกในการสืบค้นข้อมูลการเชื่อมโยงการสำรวจคุณสามารถใช้คอลเลกชันเพื่อแมปข้อมูลการเชื่อมโยงกับรายการรวบรวมรายการ ตัวอย่างเช่น: การสอบถามโมดูลขอบเขตการอนุญาตผู้ใช้และเมนูภายใต้โมดูลคุณสามารถใช้คอลเลกชันเพื่อแมปรายการโมดูลเพื่อแมปคุณลักษณะรายการเมนูของวัตถุโมดูล จุดประสงค์ของสิ่งนี้คือเพื่ออำนวยความสะดวกในการสอบถามการสอบถามชุดผลลัพธ์แบบสอบถาม
หากคุณใช้ ResultType คุณไม่สามารถแมปผลลัพธ์การสืบค้นไปยังรายการรวบรวมรายการ
เนื้อหาข้างต้นเป็นบทช่วยสอนการเรียนรู้การทำแผนที่ขั้นสูง MyBatis ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณต้องการทราบข้อมูลเพิ่มเติมโปรดใส่ใจกับเว็บไซต์ Wulin.com!