Когда мой коллега изучал Mybatis, он столкнулся с проблемой, которая при использовании поля типа Char в качестве условия запроса он не мог найти данные, и другие типы из них были в порядке.
Используемая база данных - это Oracle, тип поля запроса - Char (50), а код Java соответствует типу строки.
Позже, после расследования, это произошло потому, что в Oracle, если длины контента поля типа символа недостаточно, длина будет автоматически заполнена в пространстве. Если имя поля char (5), если значение является SGL, то Oracle автоматически заполнит длину пробелами, а конечное значение - SGL.
1. Решение:
Метод 1: сначала используйте функцию TRIM (), чтобы удалить пространства с обеих сторон значения, а затем используйте ее в качестве условного запроса, например:
Выберите * из данных, где data.name =#{name}Изменить на:
Выберите * из данных, где trim (data.name) =#{name}Метод 2: Измените тип поля char () на тип varchar2 (). Вообще говоря, тип char () используется только тогда, когда все значения имеют одинаковую длину. Например, когда гендерное поле используется для представления мужчины, а 1 используется для представления самки, можно использовать char (1). Если длина значения не фиксирована, она длинная и короткая, лучше не использовать тип char ().
2. Глубоко понять, что Mybatis возвращает NULL
Откладывая платформу Mybatis, вернемся к исходному запросу JDBC, при использовании типа Oracle в качестве условия для запроса данных можно найти только тогда, когда значения точно такие же.
Например, создайте тестовую таблицу:
Создать таблицу t_user (user_name char (5)); вставьте в значения t_user (user_name) ('sgl'); select '"'||user_name||'"' from t_user ; - Результат запроса- «SGL», можно увидеть, что Oracle автоматически заполняет два пространства
Данные запроса с помощью метода подготовленного статации JDBC:
conn = getConnection (); ps = conn.prepareStatement ("select * from t_user, где user_name =?"); ps.setstring (1, "sgl"); Resultset rs = ps.executequery ();Данные не могут быть найдены с помощью приведенного выше метода, поскольку значение условия запроса «SGL» и значение базы данных «SGL» не равны.
Если значение «SGL», вы можете найти данные:
conn = getConnection (); ps = conn.prepareStatement ("select * from t_user, где user_name =?"); ps.setstring (1, "sgl"); - Добавить два пространства менее 5 бит в длинуЕсли вы используете метод trim (), вы также можете запросить данные, например:
conn = getConnection (); ps = conn.prepareStatement ("select * From t_user, где TRIM (user_name) =?"); - сначала отмените user_name в базе данных, а затем сравните ps.setstring (1, «sgl»); Resultset rs = ps.executequery ();Теперь вернемся к Mybatis, файл Mapper в коллеге выглядит следующим образом:
<select id = "selectByName" resultType = "com.entity.data" parameterType = "java.lang.string"> select * из данных, где data.name =#{name} </select>Содержание основного метода:
public static void main (String [] args) {ApplicationContext ctx = new classPathxMlapplicationContext ("ApplicationContext.xml"); DataService D = (DataService) ctx.getbean ("dataServiceImpl"); Данные данные = D.SelectByName ("sgl"); System.out.println (data);}Фактически, просмотрев исходный код или изменяя уровень журнала на уровень отладки, можно видеть, что в нижней части Mybatis оператор запроса будет предварительно считывается с использованием подготовленного предприятия, а затем параметры будут установлены.
==> Подготовка: выберите * из данных, где data.name =?
==> Параметры: sgl (строка)
Основываясь на предыдущем запросе JDBC, мы знаем причину, поэтому легко понять проблему в Mybatis.
Кроме того, под MySQL, когда значение поля типа символа недостаточно, кажется, что значение не заполнено автоматически. Несмотря на это, когда длина значения не фиксирована, не рекомендуется использовать тип ChAR.
Полный код для запроса JDBC заключается в следующем:
JDBC Tool Class:
пакет com.songguoliang.url; импорт java.sql.connection; import java.sql.drivermanager; import java.sql.preparedStatement; импорт java.sql.resultset; import.sql.sresl java.util.arraylist; import java.util.list; import java.util.resourcebundle;/** * Pure JDBC Connection Class * @author sgl * */public purejdbcdao {private static resourcebundle bundle = resourcebundle.getbundle ("jdbc"); Частный статический int recount = 0; / *** Получить соединение* @return*/ private static connection getConnection () {connection conn = null; try {class.forname (bundle.getString ("DriverClassName")); conn = drivermanager.getConnection (bundle.getString ("url"), bundle.getString ("username"), bundle.getString ("пароль")); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } наконец {if (null == conn && recount <5) {try {thread.sleep (10000); } catch (прерванное искусство e) {e.printstacktrace (); } recount ++; System.out.println ("база данных"+recount+"second Reconnect"); conn = getConnection (); }} return conn; } / ** * Запрос данных * @param sql * @return * / public Static List <string []> Query (string sql) {list <string []> result = new ArrayList <string []> (); Соединение conn = null; Утверждение stmt = null; try {//system.out.println("цин 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; for (int i = 1; i <= colunnum; i ++) {fieldValue = rs.getString (i); if (fieldValue == null) {fieldValue = ""; } field [i-1] = FieldValue; } result.add (Field); }} catch (sqlexception e) {e.printstacktrace (); } наконец {try {if (stmt! = null) {stmt.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }} return result; } public Static List <String []> Query (String SQL, List <string> params) {list <string []> result = new ArrayList <string []> (); Соединение conn = null; Подготовленное предприятие PS = NULL; try {conn = getConnection (); ps = conn.preprestatement (sql); for (int i = 0; i <params.size (); i ++) {ps.setString (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; for (int i = 1; i <= colunnum; i ++) {fieldValue = rs.getString (i); if (fieldValue == null) {fieldValue = ""; } field [i-1] = FieldValue; } result.add (Field); }} catch (sqlexception e) {e.printstacktrace (); } наконец {try {if (ps! = null) {ps.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }} return result; } / ** * Выполнить оператор SQL * @param sql * / public static void execute (string sql) {connect conn = null; Утверждение stmt = null; try {//system.out.println("цин 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 (); } наконец {try {if (stmt! = null) {stmt.close (); } if (conn! = null) {conn.close (); }} catch (sqlexception e) {e.printstacktrace (); }}}}Тестовый класс:
Пакет com.songguoliang; импорт java.util.arrays; import java.util.list; import com.songguoliang.url.purejdbcdao; public clus user_name =? ", arrays.aslist (" sgl ")); // найдено количество записей: 0 //List<String®> list=purejdbcdao.query("select * от t_user, где user_name =? », Arrays.aslist (" sgl ")); // Запросить количество записей: 1 список <string []> list = pureJdbcdao.query ("select * from t_user, где trim (user_name) =?", Arrays.aslist ("sgl")); // Запросить количество записей: 1 System.out.println ("Запросить количество записей:"+list.size ()); }}Суммировать
Выше приведено решение, введенное редактором для решения проблемы NULL, когда Mybatis использует поле типа Char для запроса базы данных Oracle. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!