Metode bawaan untuk mapper
Lapisan model adalah kelas entitas, sesuai dengan tabel database. Lapisan pengontrol adalah servlet, yang terutama bertanggung jawab atas kontrol proses modul bisnis, memanggil metode antarmuka layanan, dan di Struts2 adalah tindakan. Lapisan layanan terutama membuat penilaian logis, dan lapisan DAO adalah lapisan akses data, yang terhubung dengan database. Sedangkan untuk Mapper, file pemetaan mapper digunakan di lapisan DAO.
Berikut adalah deskripsi metode mapper bawaan:
1. CountByExample ===> permintaan kuantitas sesuai dengan kondisinya
int countbyexample (contoh userexample); // Berikut ini adalah daftar kasus lengkap. Contoh Userexample = Userexample baru (); Kriteria kriteria = contoh.createCriteria (); kriteria.andusernamequalto ("joe"); int count = userdao.countByExample (contoh); Setara dengan: pilih count (*) dari pengguna di mana nama pengguna = 'joe'
2. DeleteByExample ===> Hapus banyak item sesuai dengan kondisinya
int deleteByExample (Contoh AccountExample); // Berikut ini adalah contoh contoh Userexample = UserExample baru (); Kriteria kriteria = contoh.createCriteria (); kriteria.andusernamequalto ("joe"); userdao.deleteebyexample (contoh); setara dengan: hapus dari pengguna di mana nama pengguna = 'joe' 3. deletebyprimarykey ===> hapus satu item sesuai dengan kondisinya
int deletebyprimarykey (integer id); userdao.deletyprimarykey (101);
Setara dengan:
hapus dari pengguna di mana id = 101
4. Masukkan ===> Masukkan data
INS INSERT (Catatan Akun); // Berikut ini adalah pengguna kasus lengkap = pengguna baru (); //user.setid(101); user.setusername ("test"); user.setpassword ("123456") user.setemail ("[email protected]"); userdao.insert (pengguna);Setara dengan:
Sisipkan ke Nilai Pengguna (ID, Nama Pengguna, Kata Sandi, Email) (101, 'Tes', '123456', '[email protected]');
5. INSERTSELEKSI ===> Sisipkan data
int insertSelective (catatan akun);
6. SelectByExample ===> Data kueri berdasarkan kondisi
Daftar <Account> SelectByExample (Contoh AccountExample); //The following is a complete case UserExample example = new UserExample();Criteria criteria = example.createCriteria();criteria.andUsernameEqualTo("joe");criteria.andUsernameIsNull();example.setOrderByClause("username asc,email desc");List<?>list = userDAO.selectByExample(example);equivalent: select * Dari pengguna di mana nama pengguna = 'joe' dan nama pengguna adalah nol pesanan dengan nama pengguna ASC, email desc // Catatan: File userexample.java yang dihasilkan oleh Ibator berisi kriteria kelas internal statis. Ada banyak metode dalam kriteria, terutama untuk menentukan kondisi kueri setelah pernyataan SQL di mana.7. SelectByPrimaryKey ===> Data kueri berdasarkan kunci utama
Akun SelectByPrimaryKey (ID Integer); // setara dengan memilih * dari pengguna di mana id = ID variabel
8. UpdateByExampselective ===> Perbarui bidang dengan nilai bukan nol menurut kondisi
Int UpdateByExplampselective (@param ("Record") Record, @param ("Contoh") Contoh AccountExample); // Berikut ini adalah daftar kasus lengkap contoh Userexample = UserExample baru (); Kriteria kriteria = contoh.createCriteria (); kriteria.andusernamequalto ("joe"); Pengguna pengguna = pengguna baru (); user.setPassword ("123"); userdao.updatebyprimarykeyselective (pengguna, contoh); Setara dengan: Perbarui Pengguna Set Kata Sandi = '123' di mana nama pengguna = 'Joe'
9. UPDATEYEXAMPLECLEKSIR ===> UPDATE BEWA KONDISI
Int UpdateByExample (@param ("Record") Rekaman, @param ("Contoh") Contoh Contoh AccountExample);10. UPDATEYBYPRIMARYKEYSELECTIF ===> UPDATE sesuai dengan kondisinya
Int UpdateByPrimaryKeyselective (Rekaman Akun); // Berikut ini adalah pengguna kasus lengkap pengguna = pengguna baru (); user.setId (101); user.setpassword ("joe"); userdao.updatebyprimarykeyselective (user);Setara dengan:
Perbarui Pengguna Set Kata Sandi = 'Joe' di mana id = 101
Int UpdateByPrimaryKeySelective (catatan akun); // Berikut ini adalah pengguna kasus lengkap = pengguna baru (); user.setid (101); user.setPassword ("joe"); userdao.updatebyprimarykeyselective (user);Setara dengan: Perbarui Pengguna Set Kata Sandi = 'Joe' di mana id = 101
11. UPDATEBYPRIMARYKEY ===> Tekan tombol utama untuk memperbarui
Int UpdateByPrimaryKey (catatan akun); // Berikut ini adalah pengguna kasus lengkap = pengguna baru (); user.setid (101); user.setusername ("joe"); user.setPassword ("joe"); user.setemail ("[email protected]"); userdao.updatebyprimarykey (pengguna);Setara dengan:
Perbarui Pengguna Set UserName = 'Joe', Password = 'Joe', Email = '[email protected]' Where ID = 101
Int UpdateByPrimaryKey (catatan akun); // Berikut ini adalah pengguna kasus lengkap = pengguna baru (); user.setid (101); user.setusername ("joe"); user.setPassword ("joe"); user.setemail ("[email protected]"); userdao.updatebyprimarykey (pengguna);Setara dengan:
Perbarui Pengguna Set UserName = 'Joe', Password = 'Joe', Email = '[email protected]' Where ID = 101
Parsing file konfigurasi XML mapper
Mari kita lihat bagaimana MyBatis membaca file konfigurasi XML Mapper dan mem -parsing pernyataan SQL di dalamnya.
Kami masih ingat mengkonfigurasi SQLSessionFactory seperti ini:
<bean id = "sqlSessionFactory"> <name properti = "DataSource" ref = "DataSource"/> <name properti = "configLocation" value = "classpath: configuration.xml"> </property> <Property name = "mapperlocations" value = "clemtpath: com/xxx/mybatis/mapper =*. value = "com.Tiantian.mybatis.model" /> </tac>
Berikut adalah properti mapperlocations, yang merupakan ekspresi. SQLSessionFactory akan membaca semua file format XML di bawah paket com.xxx.mybaits.mapper sesuai dengan ekspresi ini. Jadi bagaimana Anda membaca file konfigurasi berdasarkan atribut ini?
Jawabannya ada dalam metode buildsqlsessionFactory di kelas SQLSessionFactoryBean:
if (! isEmpty (this.mapperlocations)) {for (sumber daya mapperlocation: this.mapperlocations) {if (mapperlocation == null) {lanjutkan; } coba {xmlmapperbuilder xmlmapperbuilder = xmlmapperbuilder baru (mapperlocation.getInputStream (), konfigurasi, mapperlocation.toString (), configuration.getSqlFragments ()); xmlmapperbuilder.parse (); } Catch (Exception e) {Throw NEW NEDSIOEXCEPTION ("Gagal Parse Mapping Sumber: '" + MapperLocation + "'", e); } akhirnya {errorContext.Instance (). Reset (); } if (logger.isdebugeNabled ()) {logger.debug ("file mapper parsed: '" + mapperlocation + "'"); }}}MyBatis menggunakan instance kelas XMLMapperBuilder untuk menguraikan file konfigurasi mapper.
PUBLIK XMLMAPPERBUILDER (Pembaca Pembaca, Konfigurasi Konfigurasi, Sumber Daya String, Peta <String, Xnode> SQLFragments) {this (XPathParser baru (pembaca, true, configuration.getVariables (), xmlmappertityResolver ()), konfigurasi, sumber daya, sqlfragments); } private xmlmapperbuilder (xPathParser parser, konfigurasi konfigurasi, sumber daya string, peta <string, xnode> sqlfragments) {super (konfigurasi); this.builderAssistant = baru mapperbuilderAssistant (konfigurasi, sumber daya); this.parser = parser; this.sqlFragments = sqlFragments; this.resource = sumber daya; }Kemudian sistem memanggil metode parse xmlmapperbuilder untuk mengurai mapper.
public void parse () {// Jika objek konfigurasi belum memuat file konfigurasi XML (menghindari pemuatan duplikat, itu sebenarnya untuk mengkonfirmasi apakah properti dan konten node mapper telah diuraikan, // mempersiapkan status node dan parse dari node, sql, hancur, hasil pm, parametermap, dll.), untuk memuat if (! configuration.isResourceloaded (sumber daya)) {configurationElement (parser.evalnode ("/mapper")); configuration.addloadedResource (sumber daya); bindmapperfornamespace (); } // Parsen simpul <RancesMap> yang belum diproses saat memproses hasil Hasil dalam fungsi ConfigurationElement. ParsependingResultMaps (); // Parse simpul <cache> yang tidak ada saat memproses cache-ref pada fungsi ConfigurationElement (ini akan terjadi jika cache-ref dimuat sebelum node cache menunjuk ke) parsependingchacherefs (); // Sama seperti di atas, jika cache tidak dimuat, pengecualian juga akan dilemparkan saat memproses ParsependendStatements (); }Proses mybatis yang parsing file XML mapper sudah sangat jelas. Mari kita lihat bagaimana itu mem -parsing mapper:
private void configurationElement (konteks xnode) {coba {// Dapatkan atribut namespace dari mapper node string namespace = context.getStringAttribute ("namespace"); if (namespace.equals ("")) {lempar BuilderException baru ("Mapper's Namespace tidak bisa kosong"); } // atur namespace builderAssistant.setCurrentNamespace (namespace) saat ini; // parse mapper's <cache-ref> node cacheerefelement (context.evalnode ("cache-ref")); // parse mapper's <cache> node cacheelement (context.evalnode ("cache")); // parse mapper <parametermap> node parameterMapElement (context.evalnodes ("/mapper/parameterMap")); // parse mapper <RanceMap> node resultMapeLements (context.evalnodes ("/mapper/resultMap")); // parse mapper <sql> node sqlelement (context.evalnodes ("/mapper/sql")); // Gunakan objek xmlstatementBuilder untuk mengurai mapper <peclect>, <serter>, <dendate>, <apelete> node, // mybaits akan menggunakan kelas mappedstatement.builder untuk membangun objek mappedstatement, // jadi sql di mybaits sesuai dengan mappedstatement, // SQL di mybaits sesuai dengan mappedstatementement, // SQL di mybaits sesuai dengan mappedstatementement, // BuildStatementFromContext (Context.evalnodes ("SELECT | INSERT | UPDATE | DELETE")); } catch (Exception e) {lempar BuilderException baru ("Kesalahan parsing mapper xml. Penyebab:" + e, e); }}Fungsi ConfigurationElement mem -parsing hampir semua node anak di node mapper. Pada titik ini, MyBaits mem -parsing semua node di mapper dan menambahkannya ke objek konfigurasi untuk objek SQLSessionFactory yang akan digunakan kapan saja. Di sini kita perlu menambahkan beberapa penjelasan tentang bagaimana MyBaits menggunakan fungsi parseStatementNode dari objek kelas XMLStateMentBuilder untuk meminjam addMappedStatement dari mapperbuildersistant objek builderAssistant untuk menguraikan mappedStatement dan mengaitkannya ke kelas konfigurasi: objek kelas konfigurasi:
public void parseStAtementNode () {// id atribut ID = context.getStringAttribute ("id"); // Databaseid Atribut String DatabaseID = Context.GetStringAttribute ("DatabaseID"); if (! DataBaseIdMatchescurrent (id, databaseid, this.requiredDatabaseid)) {return; } // fetchSize atribut integer fetchSize = context.getIntattribute ("fetchSize"); // Atribut Timeout integer timeout = context.getIntAttribute ("timeout"); // ParameterMap atribut string parameterMap = context.getStringAttribute ("parameterMap"); // ParameTerType Atribut String ParameTerType = Context.GetStringAttribute ("ParameTerType"); Class <?> ParameterTypeClass = resolVeClass (parameTerType); // Atribut Hasil String HasilMap = Context.GetStringAttribute ("RACKMAP"); // resultType atribut string resultType = context.getStringAttribute ("resultType"); // Atribut Lang String Lang = Context.GetStringAttribute ("Lang"); Languagedriver langdriver = getLanguagedRiver (Lang); Class <?> resultTypeClass = resolveclass (resultType); // Atribut HasilType String HasilType = Context.GetStringAttribute ("ResultStype"); Pernyataan Pernyataan Pernyataan = Pernyataan SympaneterType.VALUEOF (Context.GetStringAttribute ("Pernyataantype", pernyataantype.prepared.toString ())); HasilStypeFipeTyPeenum = resolveresultSetType (hasil hasil); String nodeName = context.getNode (). GetNodename (); SqlCommandType sqlCommandType = sqlCommandType.valueof (nodename.touppercase (locale.English)); // apakah itu <colly> node boolean isSelect = sqlCommandType == sqlCommandType.select; // atribut flushcache boolean flushcache = context.getBooleanattribute ("flushcache" ,! Isselect); // atribut usecache boolean usecache = context.getBooleanattribute ("usecache", isSelect); // atribut yang dipesan Boolean resultanDerDed = context.getBooleanAttribute ("resultordered", false); // Sertakan fragmen sebelum parsing xmlincludetransformer includeParser = new xmlincludetransformer (konfigurasi, builderAssistant); includeParser.Applyincludes (context.getNode ()); // Parse SelectKey setelah memasukkan dan menghapusnya. ProcessSelectKeyNodes (ID, ParameterTypeClass, Langdriver); // Parse SQL (pra: <sectykey> dan <scert> diuraikan dan dihapus) SQLSource sqlsource = langdriver.createSqlsource (konfigurasi, konteks, parameterTypeClass); // resultsets Properti string hasil = context.getStringAttribute ("resultets"); // KeyProperty Properti String KeyProperty = Context.GetStringAttribute ("KeyProperty"); // KeyColumn Properti String keyColumn = Context.GetStringAttribute ("KeyColumn"); KeyGenerator KeyGenerator; String keystatementId = id + selectkygenerator.select_key_suffix; keystatementId = builderAssistant.ApplycurrentNamespace (KeystatementId, true); if (configuration.haskeyGenerator (keystatementId)) {keygenerator = configuration.getKeyGenerator (keystatementId); } else {// UsegeneratedKeys atribut keygenerator = context.getBooleanAttribute ("useGeneratedKeys", configuration.isuseGeneratedKeys () && sqlCommandType.insert.equals (sqlCommandType)))? JDBC3KeyGenerator baru (): new neygenerator (); } builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets); } Dari kode di atas, kita dapat melihat bahwa MyBaits menggunakan XPath untuk menguraikan file konfigurasi mapper dan kemudian membuat resultMap, parameterMap, cache, pernyataan dan node lainnya di dalamnya menggunakan pembangun yang terkait dan mengaitkan objek yang diperoleh ke dalam objek konfigurasi. Objek konfigurasi ini dapat diperoleh dari SQLSession, yang menjelaskan masalah bagaimana MyBaits mendapatkan mapper dan menjalankan pernyataan SQL di dalamnya ketika kita menggunakan SQLSession untuk mengoperasikan database.