MyBatis เป็นเฟรมเวิร์กเลเยอร์การคงอยู่ที่ยอดเยี่ยมที่รองรับการสืบค้น SQL ทั่วไปขั้นตอนที่เก็บไว้และการทำแผนที่ขั้นสูง MyBatis กำจัดการตั้งค่าด้วยตนเองของรหัส JDBC และพารามิเตอร์เกือบทั้งหมดและค้นหาชุดผลลัพธ์ MyBatis ใช้ XML อย่างง่ายหรือคำอธิบายประกอบสำหรับการกำหนดค่าและการแมปดั้งเดิมเพื่อแมปอินเทอร์เฟซและ pojos ของ Java (วัตถุ Java เก่าธรรมดา) ลงในบันทึกในฐานข้อมูล
MyBatis เป็นโครงการโอเพ่นซอร์สของ Apache ในปี 2010 โครงการนี้ถูกย้ายจาก Apache Software Foundation เป็น Google Code และถูกเปลี่ยนชื่อ MyBatis
ย้ายไปยัง GitHub ในเดือนพฤศจิกายน 2013 ที่อยู่ MyBatis 'GitHub: https://github.com/mybatis/mybatis-3
คำว่า Ibatis มาจากการรวมกันของ "อินเทอร์เน็ต" และ "abatis" และเป็นกรอบการคงอยู่ของจาวา Ibatis จัดเตรียมเฟรมเวิร์กเลเยอร์การคงอยู่รวมถึงแผนที่ SQL และวัตถุการเข้าถึงข้อมูล (DAO)
แอปพลิเคชัน MyBatis แต่ละตัวส่วนใหญ่ใช้อินสแตนซ์ SQLSessionFactory และอินสแตนซ์ SQLSessionFactory สามารถรับได้ผ่าน SQLSessionFactoryBuilder SQLSessionFactoryBuilder สามารถรับได้จากไฟล์การกำหนดค่า XML หรืออินสแตนซ์ของคลาสการกำหนดค่าที่กำหนดไว้ล่วงหน้า
1. ใช้เครื่องกำเนิดไฟฟ้าเพื่อสร้างเลเยอร์ DAO โดยอัตโนมัติเลเยอร์รุ่นและเลเยอร์ Mapper
MyBatis Generator ดาวน์โหลดที่อยู่: http://www.mybatis.org/generator/
MyBatis Generator บทนำภาษาจีน: http://generator.sturgeon.mopaas.com/
ต่อไปนี้ใช้ปลั๊กอิน MyBatis-Generator-Core-1.3.2.jar เพื่อเพิ่มแพ็คเกจการเชื่อมต่อฐานข้อมูล JDBC เพื่อส่งออกแพ็คเกจ DAO แบบเพรสต์เลเวล, แพ็คเกจโมเดลและแพ็คเกจ Mapper โดยอัตโนมัติ
แพ็คเกจ Java ที่ต้องใช้คือ:
mybatis-generator-core -1.3.2.jar
mysql-connector-java-5.1.34.jar
ojdbc14-10.2.0.1.0.jar
SQLJDBC4-4.0.JAR
ไฟล์กำหนดค่า: generator.xml
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! DOCTYPE GENERATORATONCONTURAUNT POVER "-// MyBatis.org//dtd MyBatis Generation 1.0 // en" "http://mybatis.org/dtd/MyBatis <!-ไฟล์คุณสมบัติการกำหนดค่าใช้เพื่อแนะนำการแสดงออกของตัวแปร EL ในไฟล์การกำหนดค่า-> <!-หากคุณเรียกใช้ใน CMD คุณควรเขียนเส้นทางเต็มใน URL เนื่องจากไม่สามารถพบ classPath ได้ สำหรับทรัพยากร-> <!-<properties url = "ไฟล์: /// d:/workspaces/mybatisgen/bin/generatorconfig.properties"/>-> <!-แพ็คเกจไดรเวอร์ฐานข้อมูล-> <! <!-แพ็คเกจไดรเวอร์ Data Oracle-> <!-<classpathentry location = "d:/java/m2/repository/com/oracle/ojdbc14/10.2.0.1.0/ojdbc14-10.2.0.1.0.jar"/>-> <! location = "d:/javaproject/generator/mysql-connector-java-5.1.34.jar"/>-> <!-ที่นี่ระบุว่า dao สำหรับ mybatis3-> <!-id: ต้องกำหนดค่า ตัวระบุที่ไม่ซ้ำกันของบริบทนี้ ค่านี้จะถูกใช้ในข้อความแสดงข้อผิดพลาดบางอย่าง DefaultModelType: ใช้เพื่อกำหนดนโยบายประเภทรุ่น Generative 1. นโยบายเริ่มต้นของเงื่อนไขสร้างคลาสรุ่นสำหรับแต่ละตาราง 2. ฟลัต: สร้างคลาสโมเดลจากทุกตารางนั่นคือคลาสนี้จะช่วยประหยัดฟิลด์ทั้งหมดจากตาราง 3.Hierarchical: หากตารางมีคีย์หลักโมเดลจะสร้างคลาสหลัก นี่คือความสัมพันธ์ที่เหมาะสมระหว่างคลาสที่สืบทอดมา TargetRuntime: คุณสมบัตินี้ใช้เพื่อระบุรหัสที่สร้างโดยเป้าหมายรันไทม์ 1. MyBatis3 ค่าเริ่มต้นจะสร้างวัตถุที่เข้ากันได้กับ MyBatis เวอร์ชัน 3.0 และใหม่กว่าและ JSE 5.0 และใหม่กว่า (ตัวอย่างเช่นรุ่น Java และอินเทอร์เฟซ Mapper จะใช้ประเภททั่วไป) วิธีการ "โดยตัวอย่าง" รองรับไดนามิกเกือบไม่ จำกัด โดยที่ประโยคบนวัตถุที่สร้างขึ้นเหล่านี้ นอกจากนี้วัตถุ Java ที่มีเครื่องกำเนิดไฟฟ้าเหล่านี้รองรับคุณสมบัติ JSE 5.0 จำนวนมากรวมถึงประเภทและความคิดเห็นที่กำหนดพารามิเตอร์ 2.Ibatis2Java2 3.Ibatis2java5-> <context id = "mysqltables" targetRuntime = "myBatis3" defaultModelType = "เงื่อนไข"> <!-<plugin type = "org.mybatis.generator.plugins. ใช้เพื่อระบุว่าความคิดเห็นใด ๆ จะรวมอยู่ในรหัสที่สร้างขึ้นหรือไม่ หากตั้งค่าเป็น TRUE จะไม่มีการสร้างความคิดเห็น 2. SUPRESSDATE ค่าเริ่มต้นเป็นเท็จคุณสมบัตินี้ใช้เพื่อระบุว่าความคิดเห็นที่สร้างขึ้นจะรวมถึงการประทับเวลาการสร้าง MBG หรือไม่ -> <PinmentGenerator> <property name = "suppressAllComments" value = "true" /> < /commentGenerator> <!-URL ลิงค์ฐานข้อมูลชื่อผู้ใช้รหัสผ่าน-> <! ConnectionUrl = "JDBC: MySQL: //127.0.0.1: 3310/ทดสอบ" userId = "ทดสอบ" รหัสผ่าน = "1234"> </ jdbcconnection>-> <! ConnectionUrl = "JDBC: Oracle: Thin:@127.0.0.1: 1521: ORCL" userId = "ทดสอบ" รหัสผ่าน = "1234"> </jdbcconnection>-> <! driverclass = "com.microsoft.sqlserver.jdbc.sqlserverdriver" การเชื่อมต่อ = "jdbc: sqlserver: //127.0.0.1: 1433; databasename = test" userid = "ทดสอบ" key = "jdbc.url"> jdbc: h2: tcp: // localhost/test </entry> <entry key = "jdbc.driver"> org.h2.driver </entry>-> <!-sqlserver2000 <รายการ key = "jdbc.url"> jdbc: microsoft: sqlserver: // localhost: 1433; databasename = [ฐานข้อมูล] </entry> <entry = "jdbc.driver"> com.microsoft.jdbc.sqlserver.sqlserververtriver key = "jdbc.url"> jdbc: sqlserver: //192.168.0.98: 1433; databasename = [database] </entry> <entry key = "jdbc.driver"> com.microsoft.sqlserver.jdbc.sqlerververververververver vertriver key = "jdbc.url"> jdbc: jtds: sqlserver: //192.168.0.102: 1433/[ฐานข้อมูล]; tds = 8.0; lastupdateCount = true </entry> key = "jdbc.url"> jdbc: postgreSql: // localhost/[ฐานข้อมูล] </entry> <entry key = "jdbc.driver"> org.postgresql.driver </entry>-> <! key = "jdbc.driver"> com.sybase.jdbc.sybdriver </entry>-> <!-db2 <entry key = "jdbc.url"> jdbc: db2: // localhost: 5000/[database] hsqldb <entry key = "jdbc.url"> jdbc: hsqldb: mem: generatordb </entry> <entry key = "jdbc.driver"> org.hsqldb.jdbcdriver </entry>-> <! key = "jdbc.driver"> org.apache.derby.jdbc.clientdriver </entry>-> <!-Java Type Parser ตัวเลือกการกำหนดค่าตัวเลือก-> <!-<Javatyperesolver Type = "" ประเภทคุณสมบัติ: สิ่งนี้สามารถใช้เพื่อระบุประเภท Java คลาสนี้จะต้องใช้อินเตอร์เฟส org.mybatis.generator.api Javatyperesolver จะต้องมีตัวสร้างเริ่มต้นสาธารณะ คุณสมบัติสามารถยอมรับค่าพิเศษโดยค่าเริ่มต้นในกรณีนี้การใช้งานเริ่มต้นจะถูกใช้ (เอฟเฟกต์เดียวกันไม่ได้ระบุประเภท) คุณสมบัติที่รองรับโดยแท็กนี้: ForceBigDecimals: ค่าเริ่มต้นเป็นเท็จไม่ว่าจะเป็นการบังคับ BigDecimal เพื่อเป็นตัวแทนของเขตข้อมูลทศนิยมและตัวเลขทั้งหมด •หากเครื่องชั่งมีขนาดใหญ่และมีความยาวมากกว่า 18 จะใช้ประเภท bigdecimal •หากความยาวของมันคือ 10 ถึง 18 ตัวแยกวิเคราะห์ประเภท Java จะแทนที่ java.lang.long •หากความยาวคือ 5 ถึง 9 ตัวแยกวิเคราะห์ประเภท Java จะถูกแทนที่ด้วย java.lang.integer •หากความยาวของมันน้อยกว่า 5 ตัวแยกวิเคราะห์ประเภท Java จะถูกแทนที่ด้วย java.lang.Sthort -> <javatyperesolver> <property name = "forceBigDecimals" value = "false" /> </javatyperesolver> <!-สร้างวัตถุ VO-> <! ตัวสร้างโมเดล Java สร้างตารางที่ตรงกับคลาสคีย์หลักคลาสบันทึกและคลาสตัวอย่างแบบสอบถามสำหรับการวิปัสสนา องค์ประกอบนี้เป็นองค์ประกอบของเด็กที่ต้องการ <บริบท> องค์ประกอบ คุณสมบัติที่รองรับ: ConstructorBased: คุณสมบัตินี้ใช้เพื่อเลือกว่าเครื่องกำเนิด myBatis จะสร้างตัวสร้างคลาสซึ่งยอมรับแต่ละฟิลด์ในคลาสค่าหรือไม่ ในขณะเดียวกันแผนที่ผลลัพธ์ SQL จะถูกสร้างขึ้นในแต่ละฟิลด์โดยใช้ตัวสร้างแทน "setter" คุณสมบัตินี้ใช้ได้เฉพาะกับ MyBatis3 และจะถูกละเว้นสำหรับ Ibatis2 ค่าเริ่มต้นเป็นเท็จ ไม่เปลี่ยนรูป: ไม่เปลี่ยนรูปคุณสมบัตินี้ใช้เพื่อเลือกว่าเครื่องกำเนิด MyBatis จะสร้างคลาสโมเดลที่ไม่เปลี่ยนรูปหรือไม่ซึ่งหมายความว่าคลาสจะไม่มีวิธี "setter" และตัวสร้างจะยอมรับค่าของแต่ละฟิลด์ในชั้นเรียน ค่าเริ่มต้นเป็นเท็จ TRIMSTRINGS: คุณสมบัตินี้ใช้เพื่อเลือกว่าตัวสร้าง MyBatis จะเพิ่มรหัสเพื่อตัดแต่งพื้นที่ว่างที่ส่งคืนจากฐานข้อมูลหรือไม่ สิ่งนี้มีประโยชน์หากฐานข้อมูลของคุณเก็บข้อมูลในฟิลด์อักขระแทนฟิลด์ Varchar เครื่องกำเนิด mybatis จะแทรกรหัสเพื่อตัดฟิลด์อักขระ ค่าเริ่มต้นเป็นเท็จ -> <!-สร้างชื่อแพ็คเกจและตำแหน่งของคลาสเอนทิตี ที่นี่วางคลาสเอนทิตีที่สร้างขึ้นไว้ใต้แพ็คเกจ com.ouc.model-> <javamodelgenerator targetPackage = "com.ouc.model" targetProject = "d:/javaproject/generator/src"> <property name = "enablesubpackages" value = "true"/> < สร้างวัตถุการแมปสำหรับการสืบค้น-> <!-สร้างชื่อแพ็คเกจและตำแหน่งของไฟล์แผนที่ SQL ที่สร้างขึ้น ที่นี่วางไฟล์แผนที่ SQL ที่สร้างขึ้นไว้ใต้แพ็คเกจ com.ouc.mapping-> <sqlmapgenerator targetPackage = "com.ouc.mapping" targetProject = "d:/javaproject/generator/src"> <property name = "enablesubpackages JavaclientGenerator> องค์ประกอบเป็นคุณลักษณะที่ใช้ในการกำหนดเครื่องกำเนิดรหัสไคลเอนต์ Java เครื่องกำเนิดไคลเอนต์ Java ใช้ในการสร้างอินเตอร์เฟสและคลาส Java เพื่อให้สามารถใช้ไฟล์ Java Model และ XML ที่สร้างขึ้นได้อย่างง่ายดาย สำหรับสภาพแวดล้อมเป้าหมายของ Ibatis2 วัตถุที่สร้างขึ้นเหล่านี้ใช้รูปแบบของอินเทอร์เฟซ DAO และคลาสการใช้งาน สำหรับ mybatis วัตถุที่สร้างขึ้นจะใช้อินเทอร์เฟซ Mapper องค์ประกอบนี้เป็นองค์ประกอบของเด็กที่เป็นตัวเลือก หากคุณไม่ได้ระบุองค์ประกอบนี้ตัวสร้าง MyBatis (MBG) จะไม่สร้างอินเตอร์เฟสและคลาสไคลเอ็นต์ Java โดยที่แอตทริบิวต์ประเภท: หาก TargetRuntime คือ MyBatis3 XMLMapper: วัตถุที่สร้างขึ้นจะเชื่อมต่ออินเทอร์เฟซ Java กับโครงสร้างพื้นฐาน MyBatis 3.x Mapper อินเทอร์เฟซจะขึ้นอยู่กับไฟล์ MAPL XML ที่สร้างขึ้น โดยทั่วไปใช้ XMLMapper นี้ -> <!-สร้างชื่อแพ็คเกจและตำแหน่งของ DAO ที่นี่คลาส DAO ที่สร้างขึ้นจะอยู่ภายใต้แพ็คเกจ com.ouc.dao-> <javaclientgenerator type = "xmlmapper" targetPackage = "com.ouc.dao" targetProject = "d:/javaproject/generator/src"> เพื่อเลือกตารางในฐานข้อมูล ตารางที่เลือกจะส่งผลให้วัตถุต่อไปนี้ถูกสร้างขึ้นสำหรับแต่ละตาราง: • mybatis/ibatis •ไฟล์การแมป SQL ที่จัดรูปแบบ•ชุดคลาสที่สร้างตาราง "โมเดล" รวมถึง: •คลาสที่จะจับคู่•คีย์หลักของตาราง (หากตารางมีคีย์หลัก) •ฟิลด์ในตารางที่ตรงกันไม่ได้อยู่ในคีย์หลักไม่ใช่ในฟิลด์ Blob คลาสนี้จะขยายคีย์หลักหากมีหนึ่ง •คลาสที่จะถือฟิลด์ Blob ในตารางใด ๆ (ถ้ามี) คลาสนี้จะขยายสองคลาสแรกของหนึ่งขึ้นอยู่กับการกำหนดค่าตาราง •คลาสที่ใช้ในการสร้างแบบไดนามิกโดยที่คำสั่งในวิธีการที่แตกต่างกัน "โดยตัวอย่าง" (SelectByExample, DELETEBYEXAMPLE) • (ไม่บังคับ) อินเตอร์เฟส DAO และชื่อ Tablename คลาส: ชื่อของตารางที่ระบุจะต้องกำหนดค่า DomainObjectName: ชื่อพื้นฐานของวัตถุ Javabean ที่สร้างขึ้น หากไม่ได้ระบุ MBG จะถูกสร้างขึ้นโดยอัตโนมัติตามชื่อตาราง ชื่อนี้ (ไม่ว่าจะระบุไว้ที่นี่หรือสร้างโดยอัตโนมัติ) จะถูกใช้เป็นชื่อคลาสโดเมนและชื่อของคลาส DAO enableInsert: จะสร้างคำสั่งแทรกหรือไม่ ค่าเริ่มต้นคือ TRUE ENABLESELECTBYPRIMARYKEY: ไม่ว่าจะสร้างคำสั่งการเลือกผ่านคีย์หลักหรือไม่ ไม่ว่าจะมีการตั้งค่าดังกล่าวหรือไม่หากตารางไม่มีคีย์หลักมันจะไม่ถูกสร้างขึ้น เปิดใช้งาน UPDATEBYPRIMARYKEY: จะสร้างคำสั่งอัปเดตผ่านคีย์หลักหรือไม่ หากตารางไม่มีคีย์หลักคำสั่งจะไม่ถูกสร้างขึ้นโดยไม่คำนึงว่าคุณสมบัติจะถูกตั้งค่าหรือไม่ เปิดใช้งาน LeeteByPrimaryKey: จะสร้างคำสั่งลบผ่านคีย์หลักหรือไม่ หากตารางไม่มีคีย์หลักไม่ว่าจะตั้งค่าคุณสมบัตินี้คำสั่งจะไม่ถูกสร้างขึ้น เปิดใช้งาน LeeteByExample: จะสร้างคำสั่งลบผ่านวัตถุตัวอย่างหรือไม่ การประกาศนี้ทำให้การลบแบบไดนามิกที่แตกต่างกันมากมายที่เกิดขึ้นในรันไทม์ enableCountByExample: ไม่ว่าจะสร้างคำสั่งเพื่อคำนวณจำนวนแถวผ่านวัตถุตัวอย่างหรือไม่ คำสั่งนี้ส่งคืนตัวอย่างที่ตรงกับจำนวนแถวในตาราง ENALIBLEUPDATEBYEXAMPLE: จะสร้างคำสั่งการอัปเดตผ่านวัตถุตัวอย่างหรือไม่ คำสั่งนี้จะอัปเดตระเบียนการจับคู่ในตาราง SelectByPrimaryKeyQueryId: ค่านี้จะถูกเพิ่มลงในรายการตัวเลือกเพื่อเลือกการประกาศโดยคีย์หลักในตารางนี้: "'<ค่า> เป็น queryId" สิ่งนี้สามารถใช้เพื่อระบุข้อสงสัยใน DBA ที่เครื่องมือติดตามรันไทม์ หากคุณต้องการใช้คุณควรระบุ ID ที่ไม่ซ้ำกันเพื่อสร้าง MBG สำหรับแบบสอบถามที่แตกต่างกัน SelectByExampleQueryId: ค่านี้จะถูกเพิ่มลงในรายการตัวเลือกเพื่อเลือกคำสั่งโดยตัวอย่างในตารางนี้: "'<ค่า> เป็น queryId" สิ่งนี้สามารถใช้เพื่อระบุข้อสงสัยใน DBA ที่เครื่องมือติดตามรันไทม์ หากคุณต้องการใช้คุณควรระบุ ID ที่ไม่ซ้ำกันเพื่อสร้าง MBG สำหรับแบบสอบถามที่แตกต่างกัน ENABLESELECTBYEXAMPLE: คำสั่งการเลือกควรสร้างผ่านตัวอย่างหรือไม่? การประกาศนี้ทำให้การสืบค้นแบบไดนามิกที่แตกต่างกันมากมายที่สร้างขึ้นในรันไทม์ ModelType: คุณสมบัตินี้ใช้เพื่อแทนที่ประเภทรุ่นเริ่มต้นหากคุณต้องการทำสิ่งนี้สำหรับตารางนี้ หากไม่ได้ระบุ MBG จะสร้างวัตถุโดเมนตามประเภทโมเดลเริ่มต้นบริบท ประเภทรุ่นนี้กำหนดวิธีการสร้างคลาสโดเมน MBG บางรุ่น MBGS จะสร้างคลาสโดเมนเดียวสำหรับแต่ละตารางและอื่น ๆ อาจสร้างคลาส MBG ที่แตกต่างกันขึ้นอยู่กับโครงสร้างของตาราง EscapewildCards: ไม่รวม Wildcards ซึ่งหมายความว่าควรหลีกเลี่ยงทั้งชื่อสคีมาและตารางของ SQL WildCards ('_' และ ' %') ในคอลัมน์การค้นหา นี่คือไดรเวอร์บางตัวที่ต้องการให้ถ้าสคีมาหรือตารางมี SQL Wildcard (ตัวอย่างเช่นหากชื่อของตารางเป็น my_table ไดรเวอร์บางตัวต้องการให้อักขระขีดล่างจะถูกหลบหนี) -> <!-เพื่อสร้างตารางเหล่านั้น (เปลี่ยนชื่อ tablename และ domainObjectName)-> <table tablename = "v_supplyUser" domainObjectName = "vSupplyUser" enableCountByExample = "false" enableUpDateByExample = /> <table tablename = "wj_gatelist" domainObjectName = "wjGatelist" enableCountByExample = "false" enableUpDateByExample = "false" enableteLetebyExample = "false" enableSelectByExample = "False เปิดบรรทัดคำสั่ง cmd ไปที่ไฟล์ที่ไฟล์กำหนดค่าอยู่และเรียกใช้คำสั่งการสร้างต่อไปนี้:
java -jar mybatis -generator -core -1.3.2.jar -configfile generator.xml -overwrite
หลังจากดำเนินการคำสั่งแล้วคุณจะเห็นได้ว่าแพ็คเกจ DAO แพ็คเกจโมเดลและแพ็คเกจ Mapper จะถูกสร้างขึ้นในเส้นทางที่สอดคล้องกัน
2. การรวมกรอบ Mybatis
1) MyBatis ใช้การกำหนดค่าพารามิเตอร์: sqlmapconfig.xml
①การกำหนดค่าแคช (แคช): Cacheenabled: Global Switch: ค่าเริ่มต้นเป็นจริง หากมีการกำหนดค่าเป็นเท็จมันไม่มีประโยชน์ที่จะกำหนดค่าไฟล์ Mapper XML อื่น ๆ เพื่อรองรับแคช
②การโหลดล่าช้า:
LazyLoadingEnabled: True ใช้การโหลดขี้เกียจ, การปิดใช้งานการโหลดขี้เกียจ, ค่าเริ่มต้นเป็นจริงเมื่อปิดใช้งานวัตถุที่เกี่ยวข้องทั้งหมดจะถูกโหลดทันที
เมื่อ aggressivelazyloading: เปิดใช้งานจริงเมื่อเข้าถึงคุณสมบัติวัตถุขี้เกียจในวัตถุเมื่อเปิดใช้งานการโหลดขี้เกียจคุณสมบัติวัตถุที่ขี้เกียจทั้งหมดของวัตถุนี้จะถูกโหลดอย่างเต็มที่ เท็จ. เมื่อโหลดความล่าช้าให้โหลดคุณสมบัติของวัตถุตามต้องการ (นั่นคือการเข้าถึงคุณสมบัติวัตถุที่ขี้เกียจในวัตถุและคุณสมบัติวัตถุที่ขี้เกียจอื่น ๆ ในวัตถุจะไม่ถูกโหลด) ค่าเริ่มต้นเป็นจริง
③ MultipleSultSetSenabled: อนุญาตและไม่อนุญาตให้คำสั่งเดียวส่งคืนชุดข้อมูลหลายชุด (ขึ้นอยู่กับข้อกำหนดของไดรเวอร์) ค่าเริ่มต้นเป็นจริง
④ USECOLUMNLABEL: ใช้คอลัมน์ฉลากแทนชื่อคอลัมน์ ไดรฟ์ที่แตกต่างกันมีวิธีการที่แตกต่างกัน อ้างถึงเอกสารประกอบไดรฟ์หรือทดสอบด้วยตัวเลือกที่แตกต่างกันสองแบบนี้
⑤ useGeneratedKeys: อนุญาตให้ JDBC สร้างคีย์หลัก จำเป็นต้องมีการสนับสนุนไดรฟ์ หากตั้งค่าเป็นจริงการตั้งค่านี้จะบังคับให้คีย์หลักที่สร้างขึ้นไดรฟ์บางตัวไม่เข้ากัน แต่ยังสามารถดำเนินการได้
⑥ AutomappingBehavior: ระบุว่า mybatis แมปฟิลด์ตารางข้อมูลและคุณสมบัติของวัตถุโดยอัตโนมัติและอย่างไร บางส่วนจะแมปโดยอัตโนมัติโดยอัตโนมัติโดยไม่มีผลลัพธ์ซ้อนกัน เต็มจะแมปผลลัพธ์ที่ซับซ้อนทั้งหมดโดยอัตโนมัติ
⑦ DefaultExecutortype: กำหนดค่าและตั้งค่าผู้ดำเนินการและผู้ดำเนินการอย่างง่ายจะเรียกใช้คำสั่งอื่น ๆ ผู้ดำเนินการนำกลับมาใช้ซ้ำอาจนำคำสั่งที่เตรียมไว้ซ้ำและผู้ดำเนินการแบทช์อาจดำเนินการซ้ำคำสั่งและการอัปเดตแบทช์ซ้ำ
⑧ DefaultStatementTimeOut: ตั้งค่าเวลา จำกัด เพื่อกำหนดระยะเวลาที่ไดรฟ์จะรอให้ฐานข้อมูลตอบสนองต่อการหมดเวลา
ไฟล์กำหนดค่า SQLMAPConfig.xml ที่สมบูรณ์มีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype configurationPublic "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd /> <การตั้งค่าชื่อ = "lazyloadingEnabled" value = "true" /> <การตั้งค่าชื่อ = "multipleSultSetSEnabled" value = "true" /> <การตั้งค่าชื่อ = "multipleSultSetSenabled" value = "true" /> <setting name = "useColumnLabel" value = "true" value = "บางส่วน" /> <การตั้งค่าชื่อ = "defaultExecutortype" value = "simple" /> <!-แบทช์นำกลับมาใช้ซ้ำอย่างง่าย-> <!-<การตั้งค่าชื่อ = "defaultExecutortype" value = "แบทช์" />-> <การตั้งค่า = "ค่าเริ่มต้น" value = " /> name = "mapunderscoretocamelcase" value = "false" /> <การตั้งค่าชื่อ = "localCachescope" value = "เซสชัน" /> <!-<การตั้งค่าชื่อ = "JDBCTYPEFORNULL" value = "อื่น ๆ " />-> <การตั้งค่า = "JDBCTYPEFORNULL value = "equals, clone, hashcode, toString"/> </settings> <sypealiases> <!-โมดูล-> <typealias alias = "user" type = "com.ouc.mkhl.platform.authority.model.user.user"/> <typealias alias = "บทบาท" type = "com.ouc.mkhl.platform.authority.model.role"/> <typealias alias = "อุปกรณ์" type = "com.ouc.mkhl.platform.basedata.model.equipment"/> <typealias alias = "โรงงาน" type = "com.ouc.mkhl.platform.basedata.model.factory"/> </typealiases> <PypeHandlers> <typeHandler handler = "com.ouc.openplatform.dao.mybatis.serializabletypehandler"/> </>
การประมวลผลค่าพิเศษแบบอนุกรม: serializableTypeHandler
แพ็คเกจ com.ouc.openplatform.dao.mybatis; นำเข้า java.io.serializable; นำเข้า java.sql.callablestatement; นำเข้า java.sql.preparedstatement; นำเข้า java.sql.resultset; org.apache.ibatis.type.basetypehandler; นำเข้า org.apache.ibatis.type.jdbctype;/*** @author การทำน้ำใต้ดิน*/คลาสสาธารณะ serializableTypehandler jdbctype jdbctype) พ่น sqlexception {ps.setObject (i, พารามิเตอร์);}@overridepublic serializable getNullableResult (ผลลัพธ์ rs, คอลัมน์สตริง) การโยน sqlexception rs, int columnindex) พ่น sqlexception {return (serializable) rs.getObject (columnindex);}@overridepublic serializable getnullableresult (callablestatement cs, int columnindex) โยน sqlexception 2) ชุดผลลัพธ์ผลลัพธ์:
เมื่อเลือกการแมปใน mybatis ประเภทการส่งคืนสามารถใช้กับผลลัพธ์หรือผลลัพธ์ได้ ResultType แสดงถึงประเภทการส่งคืนโดยตรงในขณะที่ ResultMap เป็นข้อมูลอ้างอิงถึงผลลัพธ์ภายนอก แต่ ResultType และผลลัพธ์ไม่สามารถมีอยู่ในเวลาเดียวกัน เมื่อ MyBatis กำลังค้นหาการแมปในความเป็นจริงแต่ละแอตทริบิวต์แบบสอบถามจะถูกวางไว้ในแผนที่ที่สอดคล้องกันซึ่งคีย์คือชื่อแอตทริบิวต์และค่าคือค่าที่สอดคล้องกัน เมื่อแอตทริบิวต์ประเภท Return ที่ให้มาคือ ResultType, MyBatis จะนำคู่ค่าคีย์ออกมาในแผนที่และกำหนดให้กับแอตทริบิวต์ที่สอดคล้องกันของวัตถุที่ระบุโดย ResultType ดังนั้นในความเป็นจริงประเภทการกลับมาของแผนที่แบบสอบถามแต่ละตัวของ mybatis เป็นผลลัพธ์ที่ได้ อย่างไรก็ตามเมื่อแอตทริบิวต์ Type Return เรามีให้คือ ResultType, MyBatis จะกำหนดค่าที่สอดคล้องกันโดยอัตโนมัติไปยังแอตทริบิวต์ของวัตถุที่ระบุโดย ResultType เมื่อประเภทการส่งคืนที่เราให้คือผลลัพธ์ที่ได้เนื่องจากแผนที่ไม่สามารถแสดงโมเดลโดเมนได้ดีเราจำเป็นต้องแปลงมันเป็นวัตถุที่เกี่ยวข้องเองซึ่งมักจะมีประโยชน์มากในการสืบค้นที่ซับซ้อน
ตัวอย่าง: userbaseresultmap
<resultmap id = "userbaseresultmap" type = "user"> <id column = "id" คุณสมบัติ = "id" jdbctype = "จำนวนเต็ม" /> <result column = "username" คุณสมบัติ = "username" jdbctype = "varcharcty" propture " jdbcType = "varchar" /> <result column = "truename" คุณสมบัติ = "truename" jdbctype = "varchar" /> <result column = "sex" property = "sex" jdbctype = "varchar" /> <result column = "อายุ" jdBcType = "varchar" /> < /resultmap>
คลาสรุ่น: ผู้ใช้
แพ็คเกจ com.ouc.mkhl.platform.authority.model; นำเข้า java.io.serializable; // ข้อมูลผู้ใช้ระดับสาธารณะผู้ใช้ใช้การใช้งาน serializable {ส่วนตัวคงที่ Long SerialVersionUid = 1098321123L; ID จำนวนเต็มส่วนตัว; // รหัสผู้ใช้รหัสส่วนตัวสตริงชื่อผู้ใช้; // ชื่อผู้ใช้รหัสผ่านสตริงส่วนตัว; // ชื่อผู้ใช้อีเมลสตริงส่วนตัว; // อีเมลสตริงส่วนตัว truename; // ชื่อจริงสตริงส่วนตัวเพศ; // อายุจำนวนเต็มส่วนตัว // อายุโทรศัพท์สตริงส่วนตัว; // โทรศัพท์มือถือจำนวนเต็มสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (ID จำนวนเต็ม) {this.id = id; } สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = username == null? null: username.trim (); } สตริงสาธารณะ getPassword () {ส่งคืนรหัสผ่าน; } โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {this.password = รหัสผ่าน == null? null: password.trim (); } สตริงสาธารณะ getEmail () {ส่งคืนอีเมล; } โมฆะสาธารณะ setEmail (อีเมลสตริง) {this.email = email == null? null: email.trim (); } สตริงสาธารณะ getTruename () {return truename; } โมฆะสาธารณะ setTruename (สตริง truename) {this.truename = truename == null? null: truename.trim (); } Public String getSex () {return sex; } โมฆะสาธารณะ setSex (String sex) {this.sex = sex == null? null: sex.trim (); } Public Integer Getage () {return Age; } การตั้งค่าโมฆะสาธารณะ (อายุจำนวนเต็ม) {this.age = อายุ; } สตริงสาธารณะ getTelephone () {ส่งคืนโทรศัพท์; } โมฆะสาธารณะ setTelephone (โทรศัพท์สตริง) {this.telephone = โทรศัพท์ == null? NULL: โทรศัพท์. trim (); - 3) เพิ่มลบแก้ไขและตรวจสอบ:
(1) เลือกแบบสอบถาม:
① ID: ตัวระบุที่ไม่ซ้ำกันในโหมดนี้สามารถอ้างอิงได้โดยข้อความอื่น ๆ
② ParameterType: ชื่อคลาสที่สมบูรณ์หรือนามแฝงของพารามิเตอร์ที่ส่งผ่านไปยังคำสั่งนี้
③ ResultType: คำสั่งส่งคืนชื่อคลาสทั้งหมดหรือนามแฝงของประเภทค่า โปรดทราบว่าหากเป็นคอลเลกชันแล้วชื่อคลาสทั้งหมดหรือนามแฝงของรายการในคอลเลกชันจะถูกกรอกข้อมูลที่นี่แทนที่จะเป็นชื่อคลาสของคอลเลกชันเอง (ไม่สามารถใช้ ResultType และ ResultMap ร่วมกันได้)
④ ResultSMAP: ชื่อแผนที่ผลลัพธ์ภายนอกที่อ้างอิง การทำแผนที่ชุดผลลัพธ์เป็นคุณสมบัติที่ทรงพลังที่สุดใน mybatis การแมปที่ซับซ้อนจำนวนมากสามารถแก้ไขได้ง่าย (ไม่สามารถใช้ ResultType และ ResultMap ร่วมกันได้)
⑤ Flushcache: หากตั้งค่าเป็นจริงแคชจะถูกล้างทุกครั้งที่มีการเรียกคำสั่ง คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้น
⑥ USECACHE: หากตั้งค่าเป็นจริงชุดผลลัพธ์ของคำสั่งจะถูกแคช คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้น
⑦หมดเวลา: ตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะทำการยกเว้น ค่าเริ่มต้นคือการไม่ตั้งค่าและไดรฟ์ตัดสินใจเอง
ตัวอย่าง: สอบถามข้อมูลผู้ใช้ทั้งหมด: SelectUsers
<select id = "selectusers" resultmap = "userbaseresultmap"> เลือก ID, ชื่อผู้ใช้, อีเมลจากผู้ใช้ </select>
(2) แทรกแทรก: saveUser
ที่นี่ตารางฐานข้อมูลใช้คีย์หลักเพื่อเพิ่มตัวเองและคีย์หลักคือ ID
① FetchSize: หลังจากตั้งค่าค่าไดรฟ์จะตื่นเต้นที่จะส่งคืนหลังจากจำนวนชุดผลลัพธ์ถึงค่านี้ ไม่ได้ตั้งค่าเริ่มต้นซึ่งจะถูกกำหนดโดยไดรฟ์เอง
②คำชี้แจงถึง: คำสั่ง, คำสั่งที่เตรียมไว้, callablestatement งบที่เตรียมไว้ข้อความเรียกได้
③ useGeneratedKeys: ใช้วิธี GetGeneratedKeys ของ JDBC เพื่อรับคีย์หลักที่สร้างโดยฐานข้อมูลเอง (MySQL, SQLServer และฐานข้อมูลเชิงสัมพันธ์อื่น ๆ จะมีฟิลด์ที่จะสร้างโดยอัตโนมัติ)
④ KeyProperty: ระบุค่าที่ส่งคืนโดยคีย์ที่จะตั้งค่าเป็น getGeneratedKeys โดย myBatis หรือใช้องค์ประกอบลูกเลือกสำหรับคำสั่งแทรก
<insert id = "saveUser" parameterType = "ผู้ใช้"> แทรกลงในผู้ใช้ (ชื่อผู้ใช้, รหัสผ่าน, อีเมล, truename, เพศ, อายุ, โทรศัพท์) ค่า ( #{ชื่อผู้ใช้, jdbcType = varchar}, #{รหัสผ่าน #{truename, jdbctype = varchar}, #{เพศ, jdbctype = varchar}, #{อายุ, jdbctype = จำนวนเต็ม}, #{โทรศัพท์, jdbctype = varchar}) </insert> (3) อัปเดตอัปเดต: อัปเดต SQL แบบไดนามิก: UpdateUser
<update id = "updateUser" parameterType = "ผู้ใช้"> อัปเดตผู้ใช้ <et> <ถ้า test = "ชื่อผู้ใช้! = null"> username = #{ชื่อผู้ใช้, jdBcType = varchar}, </if> <ถ้า test = "รหัสผ่าน! #{อีเมล, jdbcType = varchar}, </if> <ถ้า test = "truename! = null"> truename = #{truename, jdbcType = varchar}, </if> <ถ้า test = "sex! #{อายุ, jdbcType = จำนวนเต็ม}, </if> <ถ้า test = "โทรศัพท์! = null"> โทรศัพท์ = #{โทรศัพท์, jdbcType = varchar}, </if> </set> โดยที่ id = #{id, jdbcType = integer} (4) ลบลบ: deleteuser
<delete id = "deleteUser" parameterType = "Integer"> ลบออกจาก userwhere id = #{id, jdbcType = Integer} </delete> (5) SQL: องค์ประกอบ SQL ใช้เพื่อกำหนดส่วนคำสั่ง SQL ที่ใช้ซ้ำได้สำหรับคำสั่งอื่น ๆ ที่จะเรียก
<sql id = "userbasecolumnlist"> ชื่อผู้ใช้, รหัสผ่าน, อีเมล, โทรศัพท์ </sql> <เลือก id = "getusers" resultmap = "userbaseresultmap"> เลือก <รวม refid = "userbasecolumnlist"/> จากผู้ใช้ </เลือก>>
(6) พารามิเตอร์: พารามิเตอร์: mybatis สามารถใช้ชนิดข้อมูลพื้นฐานและชนิดข้อมูลที่ซับซ้อนของ Java
ชนิดข้อมูลพื้นฐาน, สตริง, int, วันที่, ฯลฯ
การใช้ประเภทข้อมูลพื้นฐานสามารถให้พารามิเตอร์เดียวเท่านั้นดังนั้นคุณต้องใช้คลาส Java Entity หรือประเภทแผนที่เป็นประเภทพารามิเตอร์ คุณลักษณะของมันสามารถรับได้โดยตรงผ่าน #{}
①พารามิเตอร์ประเภทข้อมูลพื้นฐาน: สตริง
<select id = "getUserByName" resultType = "ผู้ใช้" parameterType = "string"> เลือก ID, ชื่อผู้ใช้, อีเมลจากผู้ใช้ที่ใช้ชื่อผู้ใช้ = #{ชื่อผู้ใช้, jdBcType = varchar} </select> รหัส Java:
ผู้ใช้สาธารณะ getUserByName (ชื่อสตริง); // รับข้อมูลผู้ใช้ตามชื่อผู้ใช้
②พารามิเตอร์ประเภทเอนทิตี Java: ผู้ใช้
<insert id = "saveUser" parameterType = "ผู้ใช้"> แทรกลงในผู้ใช้ (ชื่อผู้ใช้, รหัสผ่าน, อีเมล, truename, เพศ, อายุ, โทรศัพท์) ค่า ( #{ชื่อผู้ใช้, jdbcType = varchar}, #{รหัสผ่าน #{truename, jdbctype = varchar}, #{เพศ, jdbctype = varchar}, #{อายุ, jdbctype = จำนวนเต็ม}, #{โทรศัพท์, jdbctype = varchar}) </insert> รหัส Java:
Public Int SaveUser (ผู้ใช้ผู้ใช้); // แทรกข้อมูลผู้ใช้
③พารามิเตอร์แผนที่: แผนที่ <string, Object> RecordMap
<select id = "SelectChildGrouptotalNum" resultType = "จำนวนเต็ม"> เลือกนับ (*) จาก GroupInfo <trim คำนำหน้า = "โดยที่" prefixOverrides = "และ | หรือ"> และ id ใน <foreach collection = "iDstr" ชื่อ! = '' "> และชื่อเช่น concat (concat ('%', #{name}), '%') </ถ้า> <ถ้าทดสอบ =" คำอธิบาย! = null และคำอธิบาย! = '' "> และคำอธิบายเช่น concat (concat ('%', #{คำอธิบาย}), '%') #{type, jdbcType = integer} </if> <ถ้า test = "หมวดหมู่! = null และหมวดหมู่! =-1"> และหมวดหมู่ = #{หมวดหมู่, jdbcType = จำนวนเต็ม} </if> </trim> รหัส Java:
// รับจำนวนระเบียนทั้งหมดในกลุ่มย่อย int selectChildGrouptotalNum (แผนที่ <สตริงวัตถุ> recordMap); แผนที่ <string, Object> recordmap = new hashmap <string, object> (); recordmap.put ("idstr", group.getChildGroupids (). แยก (","); recordMap.put ("ชื่อ", ชื่อ); recordmap.put ("คำอธิบาย", คำอธิบาย); groupdao.selectchildgrouptotalnum (recordmap); ④พารามิเตอร์หลายตัว:
วิธีที่ 1: พารามิเตอร์ผ่านตามลำดับ
<!-พารามิเตอร์แบบสอบถามตามชื่อพารามิเตอร์-> <select id = "selectsensornobysOrname" resultType = "integer" usecache = "false" flushcache = "true"> เลือก sensorno จาก sensorConfig ที่ชื่อ = #{0} และ testUnitNo = #{1} รหัส Java:
// สอบถามพารามิเตอร์ idpublic int selectsensornobysensorname (String sensorname, int testunitno, String labcode);
วิธีที่ 2: เพิ่มคำอธิบายประกอบ @param ลงในพารามิเตอร์อินเตอร์เฟส
<select id = "SelectByUserNameAnDVCode" resultMap = "UserBaserEsultMap"> เลือก ID ชื่อผู้ใช้จากผู้ใช้ <trim prefix = "ที่" prefixOverrides = "และ | หรือ"> <test = "ชื่อผู้ใช้! = null และ username! = '' #{ชื่อผู้ใช้}), '%') </ถ้า> <ถ้า test = "supplierno! = null และ supplierno! = '' '> และ supplierno ชอบ concat (concat ('%', #{supplierno}),'%') รหัส Java:
// ข้อมูลผู้ใช้แบบสอบถามตามชื่อผู้ใช้และรหัสสาธารณะรายการสาธารณะ <user> SelectByEnerAnameAnDVCode (@Param ("ชื่อผู้ใช้") สตริงผู้ใช้ชื่อ@param ("supplierno") สตริง supplierno,@param ("startindex") int startindex, @param ("PageSize") 4) คำสั่ง SQL แบบไดนามิก:
SelectKey Tag, หากแท็ก, การตัดสินตามเงื่อนไขของ IF + โดยที่, อัปเดตคำสั่งของ IF + set, ถ้า + trim แทนที่ตำแหน่ง/set tag, trim แทนที่ set, เลือก (เมื่อ, เป็นอย่างอื่น), foreach tag คำสั่ง SQL แบบไดนามิกเป็นส่วนที่ยืดหยุ่นที่สุดของ mybatis และสะดวกมากที่จะใช้งานได้ดี
ตัวอย่าง: SelectTotalNumByAccountType
<select id = "selectTotalNumByAccountType" resultType = "จำนวนเต็ม"> เลือกจำนวน (*) จากผู้ใช้ <trim คำนำหน้า = "โดยที่" prefixOverrides = "และ | หรือ"> และ id ไม่ได้อยู่ใน <foreach collection = "iDstr" null และ username! = '' "> และชื่อผู้ใช้เช่น concat (concat ('%', #{ชื่อผู้ใช้}), '%') </ถ้า> <ถ้า test =" supplierno! = null และ supplierno! truename! = '' "> และ truename ชอบ concat (concat ('%', #{truename}), '%') </if> และ accountType = #{accountType} </trim> </select>ข้างต้นเป็นบทสรุปของความรู้การใช้งานของ Mybatis Sterves Layer Framework ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!