Als mein Kollege MyBatis studierte, stieß er auf ein Problem, dass er die Daten nicht finden konnte, wenn er das Feld des Zeichenstyps als Abfragebedingung benutzte, und andere Arten von ihnen waren in Ordnung.
Die verwendete Datenbank ist Oracle, der Feldtyp des Abfragedondens ist char (50), und der Java -Code entspricht dem Zeichenfolge -Typ.
Später, nach der Untersuchung, lag es daran, dass in Oracle die Länge automatisch Platz ausgefüllt wird. Wenn der Feldname Zeichen (5), wenn der Wert SGL ist, füllt Oracle die Länge automatisch mit Leerzeichen und der Endwert SGL.
1. Lösung:
Methode 1: Verwenden Sie zunächst die Funktion TRIM (), um die Leerzeichen auf beiden Seiten des Wertes zu entfernen und dann als bedingte Abfrage zu verwenden, wie z. B.:
Wählen Sie * aus Daten, wobei Data.name =#{Name}Wechsel zu:
Wählen Sie * aus Daten, wobei trim (Data.name) =#{Name}}Methode 2: Ändern Sie den Feldtyp char () in varchar2 () -Typ. Im Allgemeinen wird char () -Typ nur verwendet, wenn alle Werte die gleiche Länge haben. Wenn beispielsweise das Geschlechtsfeld zur Darstellung von Männern verwendet wird und 1 zur Darstellung von Frauen verwendet wird, kann Char (1) verwendet werden. Wenn die Länge des Wertes nicht festgelegt ist, ist es lang und kurz, es ist am besten, keinen char () -Typ zu verwenden.
2. Verstehe, MyBatis kehrt null zurück
Wenn Sie das MyBatis -Framework beiseite legen, sind die Daten nur dann gefunden, wenn die Werte genau gleich sind.
Erstellen Sie beispielsweise eine Testtabelle:
Tabelle erstellen t_user (user_name char (5)); in t_user (user_name) values ('SGL') einfügen; select '"'||user_name||'"' from t_user ; - Das Abfrageergebnis ist "SGL". Es ist zu sehen, dass Oracle automatisch zwei Plätze füllt
Abfragendaten über die vorbereitete Methode von JDBC:
conn = getConnection (); ps = conn.preparestatement ("Select * von t_user wobei user_name =?");Die Daten können nicht über die obige Methode gefunden werden, da der Wert "SGL" und der Datenbankwert "SGL" nicht gleich sind.
Wenn der Wert "SGL" ist, finden Sie die Daten:
conn = getConnection (); ps = conn.preparestatement ("SELECT * von T_USER WHERE user_name =?"); - Fügen Sie zwei Plätze mit weniger als 5 Bit in Längenergebnis hinzu rs = ps.executeQuery ();Wenn Sie die TRIM () -Methode verwenden, können Sie auch die Daten abfragen, z. B.:
conn = getConnection (); ps = conn.preparestatement ("SELECT * von T_USER WHERE TRIM (user_name) =?"); - Beachten Sie zuerst den user_name in der Datenbank und vergleichen Sie dann ps.setstring (1, "sgl"); Ergebnisset rs = ps.executeQuery ();Jetzt zurück zu MyBatis ist die Mapper -Datei des Kollegen wie folgt:
<select id = "selectByName" resultType = "com.entity.data" parameterType = "java.lang.String"> auswählen * Aus Daten wobei data.name = {name} </select>Hauptmethodeninhalt ist:
public static void main (string [] args) {applicationContext ctx = new classPathXmlApplicationContext ("ApplicationContext.xml"); DataService d = (DataService) ctx.getbean ("DataServiceImpl"); Datendaten = D.SelectByName ("SGL"); System.out.println (Daten);}Durch das Anzeigen des Quellcode oder das Ändern des Protokolls auf Debug -Ebene ist ersichtlich, dass die Abfrageanweisung am Ende von MyBatis mithilfe von PrepedStatements vorkompiliert wird und dann die Parameter eingestellt werden. Wie folgt, das von MyBatis gedruckte Protokoll: Protokoll: Protokoll.
==> Vorbereitung: Wählen Sie * aus Daten, wo data.name =?
==> Parameter: SGL (String)
Basierend auf der vorherigen JDBC -Abfrage kennen wir den Grund, daher ist es leicht, das Problem in MyBatis zu verstehen.
Darüber hinaus scheint unter MySQL, wenn der Wert des Zeichenfelds des Zeichens nicht ausreicht, dass der Wert nicht automatisch mit Leerzeichen gefüllt ist. Trotzdem wird nicht empfohlen, den Zeichenentyp zu verwenden, wenn die Wertschöpfungslänge nicht festgelegt ist.
Der vollständige Code für JDBC -Abfrage lautet wie folgt:
JDBC Tool Class:
package com.songguoliang.url;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import Java.util.ArrayList; Import Java.util.List; Import java.util.resourcebundle;/** * Pure Jdbc -Verbindungsdatenklasse * @author SGL * */public class purejdbcdao {private statische Ressourcenbunddel Bunde = resosencebuntle.getbungle ("jdbc"); private statische Int -Nachzählung = 0; / *** Die Verbindung erhalten* @return*/ private statische Verbindung getConnection () {Verbindung conn = null; try {class.forname (bündel.getString ("TRAVERCLASSNAME")); conn = driverManager.getConnection (bündel.getString ("url"), bündel.getString ("username"), bündel.getString ("Passwort")); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } endlich {if (null == conn && tocount <5) {try {thread.sleep (10000); } catch (interruptedException e) {e.printstacktrace (); } Nachweis ++; System.out.println ("Datenbank"+Recount+"Second Reconnect"); conn = getConnection (); }} return conn; } / ** * Daten abfragen * @param SQL * @return * / public staticlist <string []> Abfrage (String SQL) {list <string []> result = new ArrayList <string []> (); Verbindung conn = null; Aussage STMT = NULL; try {//system.out.println(" süßesjdbcdao] Abfrageerklärung: " + SQL); conn = getConnection (); STMT = Conn.CreateStatement (); ResultSet rs = stmt.executeQuery (SQL); ResultSetmetadata rsmeta = rs.getmetadata (); while (rs.Next ()) {int columnnum = rsmeta.getColumnCount (); String [] field = new String [columnnum]; String fieldValue = null; für (int i = 1; i <= columnnum; i ++) {fieldValue = rs.getString (i); if (fieldValue == null) {fieldValue = ""; } field [i-1] = fieldValue; } result.add (field); }} catch (sqlexception e) {e.printstacktrace (); } endlich {try {if (stmt! = null) {stmt.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }} Rückgabeergebnis; } öffentliche statische Liste <string []> Abfrage (String SQL, List <string> Params) {list <string []> result = new ArrayList <string []> (); Verbindung conn = null; PrepedStatement ps = null; try {conn = getConnection (); ps = conn.preparestatement (SQL); für (int i = 0; i <params.size (); i ++) {psSetString (i+1, params.get (i)); } ResultSet rs = ps.executeQuery (); ResultSetmetadata rsmeta = rs.getmetadata (); while (rs.Next ()) {int columnnum = rsmeta.getColumnCount (); String [] field = new String [columnnum]; String fieldValue = null; für (int i = 1; i <= columnnum; i ++) {fieldValue = rs.getString (i); if (fieldValue == null) {fieldValue = ""; } field [i-1] = fieldValue; } result.add (field); }} catch (sqlexception e) {e.printstacktrace (); } endlich {try {if (ps! = null) {ps.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }} Rückgabeergebnis; } / ** * SQL Anweisung ausführen * @param SQL * / public static void execute (String SQL) {Verbindung conn = null; Aussage STMT = NULL; try {//system.out.println(" süßesjdbcdao weibsql Aussage: " + SQL); conn = getConnection (); conn.setAutocommit (false); STMT = Conn.CreateStatement (); stmt.execute (SQL); conn.commit (); } catch (sqlexception e) {try {conn.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); } e.printstacktrace (); } endlich {try {if (stmt! = null) {stmt.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }}}}Testklasse:
Paket com.songguoliang; import Java.util.arrays; import Java.util.list; Import Com.songguoliang.url.purejdbcdao; public class test {public static void main (String [] args) {//list<string user_name =? ", arrays.aslist (" sgl ")); // Anzahl der gefundenen Einträge: 0 //List<string für> list=purejdbcdao.query("select * von t_user wobei user_name =? ", Arrays.aslist (" sgl ")); // Abfragen Sie die Anzahl der Einträge: 1 Liste <string []> list = pureJdbcdao.query ("Select * von t_user wob // Die Anzahl der Einträge abfragen: 1 System.out.println ("Abfragen Sie die Anzahl der Einträge ab:"+list.size ()); }}Zusammenfassen
Die obige Lösung ist die vom Editor eingeführte Lösung, um das Problem von NULL zu lösen, wenn MyBatis das Feld char -Typ verwendet, um die Oracle -Datenbank abzufragen. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!