Ketika kolega saya sedang mempelajari mybatis, ia mengalami masalah bahwa ketika menggunakan bidang jenis char sebagai kondisi kueri, ia tidak dapat menemukan data, dan jenis lainnya baik -baik saja.
Basis data yang digunakan adalah Oracle, tipe bidang kondisi kueri adalah char (50), dan kode java sesuai dengan jenis string.
Kemudian, setelah diselidiki, itu karena di Oracle, jika panjang konten bidang tipe char tidak cukup, panjangnya akan secara otomatis diisi ruang. Jika arang nama bidang (5), jika nilainya SGL, maka Oracle akan secara otomatis mengisi panjang dengan spasi, dan nilai akhir adalah SGL.
1. Solusi:
Metode 1: Pertama gunakan fungsi trim () untuk menghilangkan spasi di kedua sisi nilai dan kemudian gunakan sebagai kueri bersyarat, seperti:
SELECT * Dari data Where Data.name =#{name}Ubah ke:
Pilih * dari data di mana trim (data.name) =#{name}Metode 2: Ubah tipe tipe bidang () ke tipe varchar2 (). Secara umum, tipe char () hanya digunakan ketika semua nilai memiliki panjang yang sama. Misalnya, ketika bidang gender digunakan untuk mewakili pria dan 1 digunakan untuk mewakili betina, char (1) dapat digunakan. Jika panjang nilainya tidak diperbaiki, itu panjang dan pendek, sebaiknya tidak menggunakan tipe char ().
2. Sangat mengerti mybatis kembali nol
Mengesampingkan kerangka kerja Mybatis, kembali ke kueri JDBC asli, saat menggunakan jenis orcle oracle sebagai kondisi untuk meminta data, data hanya dapat ditemukan ketika nilainya persis sama.
Misalnya, buat tabel tes:
Buat tabel t_user (user_name char (5)); masukkan ke dalam nilai t_user (user_name) ('sgl'); select '"'||user_name||'"' from t_user ; - Hasil kueri adalah "SGL", dapat dilihat bahwa Oracle secara otomatis mengisi dua spasi
Data kueri melalui metode persiapan JDBC:
conn = getConnection (); ps = conn.prepareStatement ("Select * from t_user di mana user_name =?"); ps.setstring (1, "sgl"); hasil rs = ps.executeQuery ();Data tidak dapat ditemukan melalui metode di atas, karena nilai kondisi kueri "SGL" dan nilai database "SGL" tidak sama.
Jika nilainya "SGL" Anda dapat menemukan data:
conn = getConnection (); ps = conn.prepareStatement ("Select * from t_user di mana user_name =?"); ps.setstring (1, "sgl"); - Tambahkan dua spasi kurang dari 5 bit Hasil Panjang RS = Ps.ExecuteQuery ();Jika Anda menggunakan metode trim (), Anda juga dapat meminta data, seperti:
conn = getConnection (); ps = conn.prepareStatement ("SELECT * from t_user di mana trim (user_name) =?"); - henti pertama user_name di database, dan kemudian bandingkan ps.setstring (1, "sgl"); hasil rs = ps.executeQuery ();Sekarang kembali ke Mybatis, file mapper kolega adalah sebagai berikut:
<pilih id = "selectbyname" resultType = "com.entity.data" parameTerType = "java.lang.string"> Pilih * dari data di mana data.name =#{name} </pilih>Konten metode utama adalah:
public static void main (string [] args) {applicationContext ctx = new classpathxmlapplicationContext ("applicationContext.xml"); DataService d = (DataService) ctx.getBean ("DataSerViceImpl"); Data data = D.SelectByName ("SGL"); System.out.println (data);}Faktanya, dengan melihat kode sumber atau mengubah log ke level debug, dapat dilihat bahwa di bagian bawah mybatis, pernyataan kueri akan dikompilasi dengan menggunakan preparystatement, dan kemudian parameter akan diatur. Sebagai berikut, log yang dicetak oleh mybatis:
==> Mempersiapkan: Pilih * dari data di mana data.name =?
==> Parameter: SGL (String)
Berdasarkan kueri JDBC sebelumnya, kami tahu alasannya, jadi mudah untuk memahami masalah di Mybatis.
Selain itu, di bawah MySQL, ketika nilai bidang tipe char tidak cukup, tampaknya nilainya tidak secara otomatis diisi dengan spasi. Meskipun demikian, ketika panjang nilai tidak diperbaiki, tidak disarankan untuk menggunakan jenis char.
Kode lengkap untuk kueri JDBC adalah sebagai berikut:
Kelas Alat JDBC:
Paket com.songguoliang.url; impor java.sql.connection; impor java.sql.driverManager; impor java.sql.preparedstatement; impor java.sql.results; java.util.ArrayList;import java.util.List;import java.util.ResourceBundle;/** * Pure jdbc connection data class* @author sgl * */public class PureJdbcDao { private static ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); recount int statis pribadi = 0; / *** Dapatkan koneksi* @return*/ private static connection getConnection () {connection conn = null; coba {class.forname (bundle.getString ("driverclassname")); conn = driverManager.getConnection (bundle.getString ("url"), bundle.getString ("nama pengguna"), bundle.getString ("kata sandi")); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (sqlexception e) {e.printstacktrace (); } akhirnya {if (null == conn && recount <5) {coba {thread.sleep (10000); } catch (InterruptedException e) {E.PrintStackTrace (); } recount ++; System.out.println ("Database"+Recount+"Second Reconnect"); conn = getConnection (); }} return conn; } / ** * Data kueri * @param sql * @return * / Daftar statis publik <string []> kueri (string sql) {daftar <string []> hasil = arraylist baru <string []> (); Koneksi conn = null; Pernyataan stmt = null; Coba {//system.out.println("#purejdbcdao] Pernyataan kueri: " + sql); conn = getConnection (); stmt = conn.createStatement (); Hasil rs = stmt.executeQuery (sql); HasilTmetadata rsmeta = rs.getMetadata (); while (rs.next ()) {int columnNum = rsmeta.getColumnCount (); String [] field = string baru [columnNum]; String fieldValue = null; untuk (int i = 1; i <= columnnum; i ++) {fieldValue = rs.getString (i); if (fieldValue == null) {fieldValue = ""; } bidang [i-1] = FieldValue; } result.add (bidang); }} catch (sqlexception e) {e.printstacktrace (); } akhirnya {coba {if (stmt! = null) {stmt.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }} hasil pengembalian; } Daftar statis publik <string []> kueri (String SQL, Daftar <string> params) {Daftar <string []> hasil = ArrayList baru <string []> (); Koneksi conn = null; Disiapkan ps = null; coba {conn = getConnection (); ps = conn.preparestatement (SQL); untuk (int i = 0; i <params.size (); i ++) {ps.setstring (i+1, params.get (i)); } Hasil rs = ps.executeQuery (); HasilTmetadata rsmeta = rs.getMetadata (); while (rs.next ()) {int columnNum = rsmeta.getColumnCount (); String [] field = string baru [columnNum]; String fieldValue = null; untuk (int i = 1; i <= columnnum; i ++) {fieldValue = rs.getString (i); if (fieldValue == null) {fieldValue = ""; } bidang [i-1] = FieldValue; } result.add (bidang); }} catch (sqlexception e) {e.printstacktrace (); } akhirnya {coba {if (ps! = null) {ps.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }} hasil pengembalian; } / ** * Jalankan pernyataan SQL * @param sql * / public static void execute (string sql) {koneksi conn = null; Pernyataan stmt = null; Coba {//system.out.println("$PureJdbcdao A pernyataan: " + sql); conn = getConnection (); Conn.setAutocommit (false); stmt = conn.createStatement (); stmt.execute (SQL); Conn.Commit (); } catch (sqlexception e) {coba {conn.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); } e.printstacktrace (); } akhirnya {coba {if (stmt! = null) {stmt.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }}}}Kelas Tes:
Paket com.songguoliang; impor java.util.arrays; import java.util.list; import com.songguoliang.url.purejdbcdao; tes kelas publik {public static void main (string [] args) {//list<string media $list=pureJdbcdbc) {//list <stringöööografi=pureJdbcdbc) {//list <string media MeM=pureJdbc) {//list <string[list=pureJdbcdbc) {//list <stringööografi=pureJdbcdbc) {//list <string media $list=pureJdbcdbc. args) {//list<string media $list=pureJdbcdbc. args) {//list<stringöuarkan daftar=pureJdBcbc. user_name =? ", arrays.aslist (" sgl ")); // Sejumlah entri yang ditemukan: 0 //list<string media >list=purejdbcdao.query("select * dari t_user di mana user_name =? ", Arrays.aslist (" sgl ")); // query Jumlah entri: 1 Daftar <string []> Daftar = PUREJDBCDAO.QUERY ("SELECT * DARI T_USER WHERE TRIM (user_name) =?", Arrays.aslist ("sgl")); // query Jumlah entri: 1 system.out.println ("query Jumlah entri:"+list.size ()); }}Meringkaskan
Di atas adalah solusi yang diperkenalkan oleh editor untuk menyelesaikan masalah null ketika mybatis menggunakan bidang jenis char untuk menanyakan database Oracle. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!