Pengantar Mybatis
Mybatis telah ditentukan sebelumnya oleh IBATIS, yang merupakan kerangka kerja pemetaan pemetaan/pemetaan relasional objek (ORM).
Mybatis adalah enkapsulasi JDBC, yang memungkinkan pengembang untuk hanya fokus pada SQL itu sendiri tanpa menghabiskan terlalu banyak upaya untuk memproses kode prosedural JDBC seperti mendaftarkan driver, menetapkan parameter, menciptakan koneksi/pernyataan, penguraian hasil, dll. Mybatis Mengkonfigurasi Pernyataan Berdasarkan XML/Annotation, Execute SQL, dan Poaps The Execution.
Mybatis adalah kerangka kerja kegigihan kelas satu dengan dukungan untuk SQL khusus, prosedur tersimpan dan pemetaan lanjutan. Mybatis menghilangkan hampir semua kode JDBC dan pengaturan manual parameter dan pengambilan hasil. Mybatis dapat menggunakan XML sederhana atau anotasi untuk konfigurasi dan peta primitif, antarmuka peta dan pojos java (objek java tua biasa) ke catatan database.
Alamat Proyek MyBatis/Dokumentasi Online.
Pertama bertemu mybatis
Menggunakan mybatis membutuhkan penambahan dependensi berikut di pom.xml:
<code> <dependency> <GroupId> org.mybatis </groupId> <ArtifactId> mybatis </t Artifactid> <version> 3.3.0 </version> </dependency> <dependency> <groupid> MySQL </groupid> <ArtifacTid> MySQL-Connector-java </Articid </groupid> <Artifactid> MySQL-Connector-java </ArticiCl
Memilih
Konfigurasikan mybatis/mybatis-configuration.xml
Sebagai file konfigurasi global MyBatis, dikonfigurasi dengan informasi lingkungan MyBatis yang berjalan (seperti sumber data/file mapper, dll.).
<code> <code> <!-{cke_protected} {c}%3c!%2d%2d%3fxml%20version%3d%221,0%22%20Encoding%3d%22utf-8%22%20%3f%2d%2d%3e-> <Configuration> Default = Lingkungan = " id = "Development"> <!-{CKE_Protected} {C}%3c!%2d%2d%20%E9%85%8d%E7%BD%AEJDBC%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86%8A%A1%E7%AE%A1%E7%90%86%86%86%A1%2d 2de 2d 2d <1%a1%a1%a1%E7%90%90%86%2d 2 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%3E--><datasource type="POOLED"><property name="driver" value = "com.mysql.jdbc.driver"> <name properti = "url" value = "jdbc: mysql: // host: port/db? karakterencoding = utf-8"> <nama properti = "nama pengguna"> <name properti = "kata sandi" value = "password"> </pruptent> </property> </property> </dateSource> </transactionManager> </vervence> </preensment> <!-{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%3e-> <> <mapper> mapper> mapper resource = "mybatis/mapper/userdao.xml"> </mapper> </phappers> </configuration> </code>Menulis Userdao (Mapper Map)
Bagian paling inti dari MyBatis dikonfigurasi dengan pernyataan SQL yang mengoperasikan database:
<code> <code> <code> <!-{CKE_Protected} {c}%3c!%2d%2d%3fxml%20version%3d%221,0%22%20Encoding%3d%22utf-8%22%20%3f%2d%2d%3e-<mapper namping "" nampape = "naMpace =" naMpace = "NaPACE =" NaPACE 2D "NOMPACE = NAMPACE 2D (NAMPACE 2D (NAMPACE 22% ParameterType = "java.lang.integer" resultType = "com.fq.domain.user"> pilih * dari pengguna di mana id = #{id}; </pilih> <pilih id = "selectUserByName" parameterType = "java.lang.string" name like = "com.fq.userpe." java. '%$ {value}%'; </select> </mapper> </code> </code> Deskripsi atribut
namespace namespace, digunakan untuk mengisolasi pernyataan SQL
ParameterType mendefinisikan tipe pemetaan input SQL, dan MyBatis memperoleh parameter dari objek input melalui OGNL untuk masuk ke dalam pernyataan SQL.
HasilType mendefinisikan tipe pemetaan output SQL. Mybatis memetakan deretan catatan hasil kueri SQL ke jenis yang ditentukan oleh hasil.
Nama file pemetaan mapper termasuk userdao.xml/usermapper.xml/user.xml dan formulir lainnya. Mereka umumnya disimpan di direktori mapper dengan tingkat yang sama dengan mybatis-configuration.xml. Karena fungsi utamanya adalah untuk menentukan hubungan antara pernyataan SQL dan pemetaan, umumnya secara kolektif disebut file pemetaan mapper.
Tentukan kelas PO
Fungsi utama kelas PO adalah pemetaan SQL (input/output), yang biasanya sesuai dengan tabel database:
<code> <code> <code> <code> <code>/*** @Author Jifang*@since 15/12/31 2:27 PM.*/Pengguna kelas publik {ID integer privat; nama string pribadi; kata sandi string pribadi; ini. {return id;} public void setId (integer id) {this.id = id;} public string getName () {return name;} public void setName (string name) {this.name = name;} public string getPassword () {return password;} public void setPassword (string password) {this.password () {return password; "User {" + "id =" + id + ", name = '" + name +'/'' + ", password = '" + Password +'/'' + '};}} </code> </code> </code> </code>Userdao (objek java)
Dapatkan SQLSession, jalankan pernyataan SQL, dan dapatkan hasil pemetaan:
<code><code><code><code><code><code><code>/*** @author jifang* @since 16/2/24 6:15 pm.*/public class UserDAO {private SqlSessionFactory factory;@Beforepublic void setUp() throws IOException {String resource = "mybatis/mybatis-configuration.xml";factory = SQLSessionFactoryBuilder baru (). Build (Resources.GetResourCeAsstream (Resource));}@testpublic void selectUserbyId () {try (sqlSession session = factory.opensession ()) {user user = session.selectone ("nambespace.selectusesession ()) {user user = sessi 1); System.out.println (user);}}@testpublic void selectUserByName () {coba (sqlSession session = factory.opensession ()) {list <user> user = session.selectlist ("namespace.selectuserbyname", "student"); untuk (pengguna pengguna: pengguna) {System.out.println (user);}}}} </user> </code> </code> </code> </code> </code>Menyisipkan
mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <masukkan id = "insertUser" parameTerType = "com.fq.domain.user"> Masukkan ke dalam pengguna (nama, kata sandi) value ( #{name}, #{kata sandi}); </insert> </code> </code> </code> </name}, #{{}); </masukkan> </code> </code> </code> </code> </code> </code> </code>Userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void insertUser () {try (sqlSession session = factory.opensession ()) {user user = new User (); user.setname ("new_name1"); user.setpassword ("new_password"); session.insert ("namespace.inserTuser", user); session.commit ();}} </code> </code> </code> </code> </code> </code> Kembali dengan kunci primer penumpang otomatis
Ubah file mapper dan tambahkan, dan Anda dapat mengembalikan kunci primer penumpang otomatis mySQL (mis. ID yang dihasilkan ketika data baru saja dimasukkan):
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <masukkan id = "insertUser" parameterType = "com.fq.domain.user"> <selectKey keyproperty = "id order =" aftertype. " Last_insert_id (); </selectkey> masukkan ke dalam nilai pengguna (nama, kata sandi) ( #{name}, #{password}); </sert> </code> </code> </code> </code> </code>Userdao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>@Testpublic void insertUser() {try (SqlSession session = factory.openSession()) {System.out.println(session);User user = new User(null, "new_name", "new_password"); session.insert ("namespace.inserTuser", user); // Anda perlu mendapatkan kunci primer autoincrement.Fungsi ini juga dapat diselesaikan melalui properti UsegeneratedKeys/KeyProperty, silakan merujuk ke dokumentasi MyBatis untuk detailnya.
Memperbarui
mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <update id = "updateUserById" parameTerType = "com.fq.domain.user"> Update User Name = #{name}, kata sandi = #{Id {} where} where {{{{{{{{{ #{{{{{{{{{{{{{{{{ #{{{ #{{{{{{ #{ #{ #{{ #{ #{ #{{ #{ #{ #{ #{ #{ #{ # # #{ID}; </barui> </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> @testpublic void updateUserDyId () {try (sqlsession sesion = factory.opensession (true) {Sesi) (SQLSESSESS SESESION = FacRory.Opensession (true) {Sesi) {Sesion. " "feiqing", "icy5yqxzb1uwswcvlsnlca =="));}} </code> </code> </code> </code> </code> </code> </code> </code> </code>Menghapus
mapper
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <delete id = "deleteUserId" parameTertype = "java.lang.integer"> delete dari parameterType = "java.lang.integer"> Delete dari ParameterType = "java.lang.integer"> DeleteAdbyId "ParameTerType =" java.lang.integer "> DeleteAdbyId" ParameTertype = "java.lang.integer "> #{id}; </belete> </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> @testpublic void deleteUseD () {try sqlsession = factory. {session.delete ("namespace.deleteUserById", 51615);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>ringkasan
#{}/$ {}
#{}: Mewakili placeholder, mengimplementasikan penetapan nilai ke placeholder persiapan ( #{} mewakili placeholder?), Dan secara otomatis mengonversi tipe Java ke tipe JDBC (jadi #{} dapat secara efektif mencegah injeksi SQL). #{} dapat menerima nilai atribut tipe atau PO sederhana. Jika ParameTerType mentransmisikan nilai tipe sederhana tunggal, #{} dapat berupa nilai atau nama lain dalam kawat gigi keriting #{}. $ {} dapat digunakan untuk menyambungkan string SQL. Konten ParameterType dapat disambung dalam SQL tanpa konversi tipe JDBC. $ {} dapat digunakan untuk menerima nilai atribut tipe atau PO sederhana. Jika ParameterType mentransmisikan nilai tipe sederhana tunggal, $ {} hanya dapat digunakan untuk menilai dalam kawat gigi $ {} curly.
Meskipun $ {} tidak dapat mencegah injeksi SQL, kadang -kadang $ {} sangat nyaman (seperti pesanan dengan menyortir, nama kolom perlu diteruskan ke SQL melalui parameter, lalu pesan dengan $ {kolom} digunakan, dan #{} tidak dapat digunakan untuk mengimplementasikan fungsi ini (lihat JDBC Diskusi Dasar tentang disiapkan untuk detail).
Sqlsession
Menyediakan metode untuk mengoperasikan database (seperti: SelecterOne/SelectList). Namun, SQLSession adalah utas-tidak aman, jadi yang terbaik adalah mendefinisikannya sebagai variabel lokal untuk digunakan.
Keuntungan Mybatis (dibandingkan dengan JDBC)
SQL ditulis dalam kode Java, yang membuatnya sulit untuk dipertahankan. Mybatis menulis SQL di Mapper, dan XML dipisahkan dari kode Java. Rumit untuk meneruskan parameter ke pernyataan SQL (seperti: SQL di mana kondisinya berbeda, tipe data SQL berbeda dari Java). MyBatis secara otomatis memetakan objek Java ke pernyataan SQL melalui ParameterType. Hasil set parsing merepotkan (perubahan SQL menyebabkan perubahan kode parsing, tipe data SQL berbeda dari java). MyBatis secara otomatis memetakan hasil eksekusi SQL ke objek Java melalui HasilType.
Lampiran: Yang terbaik adalah menambahkan implementasi sistem log (logback/log4j) ke pom.xml, sehingga informasi log akan dicetak saat men -debug program, membuatnya lebih mudah untuk memeriksa kesalahan. Ambil logback sebagai contoh:
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> <dep dependency> <groupid> ch.qos.logb ACK </GROPID> LOGBACK-CLASSIC </artifactId> <version> 1.1.2 </version> </dependency> </code> </code> </code> </code> </code> </code> </code> </code> </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> <configuration> <name name = "LOGRoot" value = "/data" <code> <code "<configuration> <configuration =" name logRoot "value" value = " %d {hh: mm: ss.sss} [ %thread] %-5Level %logger {0} - %msg %n"> <appender name = "stdout"> <coderer> <poler> $ {pola} </pater> </scoder> </appentender> name = "File"> <lollingpolicy> <filenamepattern> $ {logRoot} /Common-server.%d {yyyy-mm-dd} .log </filenamepattern> <maxhistory> 7 </maxhistory> </rollingpolicy> <sencoder> </{} </rollingpolicy> </encoder> </pattern LEVEL = "DEBUG"> <appender-ref ref = "stdout"> <appender-ref Ref = "File"> </applent-ref> </appender-ref> </soot> </property> </property> </configuration> </code> </code> </code> </code> </code> </code> </code> </code> </kode> </code> </code> </code> </code> </code> </Untuk detail lain tentang log mybatis, silakan merujuk ke bagian log dokumen mybatis.
Pengembangan DAO
Ada dua cara untuk mengembangkan DAO menggunakan mybatis, pengembangan DAO asli dan pemetaan mapper pengembangan DAO.
Pengembangan DAO asli Pengembangan DAO asli mengharuskan pengembang untuk menulis antarmuka DAO dan implementasi DAO, seperti menanyakan informasi pengguna berdasarkan ID:
mapper (sama seperti sebelumnya)
<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> <pilih ID = "SelecteSerById" ParameType = "java." resultType = "com.fq.domain.user"> Pilih * dari pengguna di mana id = #{id}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </kode> </code> </code> </code> </code> </code> < Antarmuka 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>/*** @Author Jifang*@since 16 SelectUserById (ID Integer) melempar Exception;} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
Implementasi userdao
<code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <codecser> <codeclinger> <code> <code> <code> <code> <code> <code> <codecs Class> <codecpler> <code <code> <code> <code> <code> <code> Public Classones Pabrik; Public UsusdaoImpl (pabrik SQLSessionFactory) {this.factory = factory;}@overridepublic pengguna selectUserById (integer id) melempar pengecualian {sqlsession session = factory.opensession (); user user = session.selectone ("nameespace.selectuseD. user;}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Klien
<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>public class MyBatisClient {@Testpublic void originalClient () melempar Exception {userdao dao = UserdaoImpl baru (SQLSessionFactoryBuilder baru (). Build (ClassLoader.getSystemResourCeAsstream ("MyBatis/Mybatis-Configuration.xml"))); pengguna pengguna = dao.selectuserbyId (1); System.out.println (user);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Masalah dalam pengembangan DAO asli:
1) Ada banyak kode prosedural dalam badan metode implementasi DAO.
2) Memanggil metode SQLSESSION (Pilih/Sisipkan/Perbarui) memerlukan menentukan ID dari pernyataan, yang merupakan kode keras, yang tidak kondusif untuk pemeliharaan kode.
Pengembangan Pemetaan Mapper
Metode pengembangan pemetaan mapper hanya membutuhkan penulisan antarmuka DAO, dan MyBatis secara dinamis membuat implementasi antarmuka berdasarkan definisi antarmuka dan pernyataan SQL dalam file mapper.
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-!-<code "versi xml Versi =" 1.0 "encod =" namespace = "com.fq.mybatis.userdao"> <pilih id = "selectUserById" parameterType = "java.lang.integer" resultType = "com.fq.domain.user"> Pilih * dari pengguna di mana id = " #{ID}; </dectle> </mapper> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Catatan: Saat ini, namespace harus sama dengan nama yang sepenuhnya memenuhi syarat dari antarmuka Userdao.
Antarmuka userdao sama seperti sebelumnya, tetapi klien UserdaoImpl tidak lagi digunakan.
<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> <codes> <code JTHOM pm.*/public class MyBatisClient {private SqlSession session;private SqlSessionFactory factory;@Beforepublic void setUp() {factory = new SqlSessionFactoryBuilder().build(ClassLoader.getSystemResourceAsStream("mybatis/mybatis-configuration.xml"));session = factory.opensession ();}@testpublic void mappperclient () melempar pengecualian {userdao dao = session.getMapper (userdao.class); pengguna pengguna = dao.selectuserbyid (1); System.out.println (user);} afterpublic void teardown () {session.close ();}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Metode pengembangan pemetaan mapper perlu mengikuti spesifikasi berikut:
Namespace dalam file mapper sama dengan nama antarmuka DAO yang sepenuhnya memenuhi syarat; ID pernyataan dalam file mapper sama dengan nama metode antarmuka DAO; ParameTerType/resultType dari pernyataan dalam file mapper sama dengan parameter/hasil dari metode DAO.
Pemetaan Mapper
Fungsi utama file pemetaan mapper (seperti userdao.xml) adalah untuk mendefinisikan pernyataan SQL (masing -masing SQL adalah pernyataan), yang merupakan inti dari mybatis.
Mybatis secara resmi merekomendasikan penggunaan metode pemetaan mapper untuk mengembangkan DAO, jadi kami tidak akan memperkenalkan terlalu banyak tentang pengembangan DAO asli di masa depan.
Pemetaan input
Beberapa parameter formal
Contoh sebelumnya dari passing tipe sederhana telah digunakan, jadi saya tidak akan mengulanginya di sini. Ketika beberapa parameter formal perlu dilewati, parameter parameterType tidak lagi diperlukan:
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><code><code><code><code><code><code><code><update id="updateUserById">UPDATE user SET name = #{1}, kata sandi = #{2} di mana id = #{0}; </dendate> </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>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> <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(Integer id, String name, String password) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>
PO yang masuk
MyBatis menggunakan ekspresi OGNL untuk parse nilai atribut objek:
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> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <pilih id = "selectUserBynamepassword" parameTerType = "com.fq.domain.user" resultType = "com.fq.domain.user"> pilih *dari nama userwhere = #{name} dan kata sandi = #{password}; </dectle> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </kode> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </codeUserdao
<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>User SelectUserBynamepassword (pengguna pengguna) melempar Pengecualian; </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>
mapper
<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> <pilih id = "selectUserByMap" parameTerType = "java.util.map" resultType = "com.fq.domain.user"> pilih *dari userwhere name = #{name} dan kata sandi = #{password}; </dectle> </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>#{} Kunci yang sesuai dari peta di kawat gigi keriting.
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><code><code><code><code><code><code><code><code><code><code>User SyfectUserByMap (peta <string, object = ""> peta) lemparan Pengecualian; </string ,> </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>
Pemetaan output
Output tipe sederhana
mapper
<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> <pilih id = "selectUserCount" parameTerType = "java.lang.string" resultType = "java.lang.integer"> pilih count (*) dari nama pengguna seperti seperti '%$ {value}%'; </sfect> </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>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><code><code><code><code><code><code><code>Integer selectUserCount(String name) throws Pengecualian; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code </code> </kode> </kode> </kode> </kode </
Mengembalikan tipe sederhana harus memastikan bahwa hasil kueri hanya memiliki satu baris catatan, dan nilai bidang pertama akhirnya dikonversi ke jenis output.
Output Objek/Daftar PO
Dua jenis output telah ditunjukkan sebelumnya (SelectUserByID/SelectUserbyName menggunakan metode pengembangan DAO asli pada waktu itu, tetapi formulir definisi mapper serupa), jadi saya hanya akan membuat ringkasan sederhana di sini:
Hasil Hasil yang didefinisikan dalam mapper saat mengeluarkan objek PO tunggal sama dengan hasil yang ditentukan dalam mapper; Hasil kueri SQL harus dijamin menjadi satu bagian data, dan itu disebut secara internal menggunakan metode selectone; Daftar PO output menunjukkan bahwa hasil kueri mungkin banyak, dan disebut secara internal menggunakan metode selectList, dan nilai pengembalian antarmuka dapat di -host dengan daftar/set.
Peta keluaran
Objek Output PO dapat digunakan sebagai gantinya untuk menggunakan output peta, dengan nama bidang sebagai kunci dan nilai bidang sebagai nilai.
mapper
<code> <pilih id = "selectUserLikeName" resultType = "java.util.map"> pilih *dari nama pengguna seperti '%$ {value}%'; </select> </code>Userdao
<code> <code> Daftar <peta <string, object = "" >> selectUserLikeName (nama string) melempar pengecualian; </pap <string,> </code> </code>
Hasilmap
Hasil Hasil dapat memetakan hasil kueri ke PO, tetapi premisnya adalah bahwa nama properti PO dan nama bidang SQL harus sama. Jika tidak konsisten, pemetaan yang sesuai dapat dilakukan melalui HasilMap:
mapper
<code> <code> <code> <resultMap id = "userMap" type = "com.fq.domain.user"> <id kolom = "user_id" properti = "id"> <columur hasil = "user_name" properti = "name"> <hasil hasil = "user_password" properti = "kata sandi"> </hasil "</id </ID </IDS =" ID = "ID =" IDNAME> </ID </ID> </ID> </ID </ID " parameterType = "java.lang.string" resultMap = "userMap"> selectid user_id, name user_name, kata sandi user_password dari userwhere name = #{name}; </schect> </code> </code> </code>Antarmuka userdao sama seperti sebelumnya.