第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

我發(fā)現(xiàn)了一個TypeHandler的bug你怎么看

<typeHandler?handler="com.user.type.UserTypeHandler"?javaType="com.user.model.User"/>?
<typeHandler?handler="com.user.type.SchoolTypeHandler"?javaType="com.user.model.School"/>

<select?id="selectUser"?resultMap="selectOneResult"?parameterType="user">
????select?*?from?user?where?id?=?#{id}?and?school=#{school,typeHandler=com.user.type.SchoolTypeHandler}
</select>
這樣運行時會先調(diào)用UserTypeHandler然后調(diào)用SchoolTypeHandler
UserTypeHandler調(diào)用沒有問題,但是SchoolTypeHandler調(diào)用時會發(fā)現(xiàn)傳入的parameterObject是User而不是School。。。。你怎么看?


正在回答

7 回答

但如果是你來設(shè)計typeHandler的解析過程,它首先是要對你的User參數(shù)進行類型轉(zhuǎn)換的,轉(zhuǎn)換后肯定不再是User了(要不然你也不會進行類型轉(zhuǎn)換了),這個時候你又如何用#{school}來和轉(zhuǎn)換后的類型進行匹配呢,你可能會說,當(dāng)我用typeHandler=com.user.type.SchoolTypeHandler的時候它就不應(yīng)該再做類型轉(zhuǎn)換而把原來的類型給我,可這樣另一處#{id}應(yīng)該是用轉(zhuǎn)換后的類型,那這樣經(jīng)過UserTypeHandler后,竟然還需要同時保持轉(zhuǎn)換前與轉(zhuǎn)換后兩種類型,如果是你你會這樣設(shè)計嗎?不敢說mybaits的方式是perfect,但你該如何設(shè)計才能即達(dá)到你說的局部配置覆蓋全局的效果,又能不讓typeHandler的效果讓人感到歧義?不管討論的結(jié)果如何,我個人很贊賞你這種鉆研的精神和清晰的分析思路,用不了多久你就不用在這里和我討論了。:)

0 回復(fù) 有任何疑惑可以回復(fù)我~

我明白你的代碼結(jié)構(gòu)與邏輯了,不能說是他邏輯上有問題,只能說你的代碼結(jié)構(gòu)導(dǎo)致了這樣互相干擾的情況

你的類型轉(zhuǎn)換器的javaType與parameterType是同一個,這是問題的根源

你應(yīng)該知道,無論是parameterType還是#{}中,只要出現(xiàn)java類型與類型轉(zhuǎn)換器中指定的javaType相同就會自動調(diào)用,這樣問題就來了,你的參數(shù)是User,他會自動調(diào)用UserTypeHandler中的setParameter方法來為SQL語句中所有的#{}賦值,一切要注意,我這說的是為“所有”的#{}賦值,當(dāng)然,這個時候setParameter的參數(shù)parameter是User,從這個時候開始已經(jīng)和你想的不一樣了,你用typeHandler=com.user.type.SchoolTypeHandler來改變了其中一個#{}的類型轉(zhuǎn)換器,但是沒用,你只是改變了類型轉(zhuǎn)換器,但參數(shù)是經(jīng)過了UserTypeHandler傳給你的,所以是User,所以這個時候無所謂你寫的是#{school,typeHandler=com.user.type.SchoolTypeHandler}也好,還是寫成#{adsfdsafafdsdsaffdsafdsafdsafdsa,typeHandler=com.user.type.SchoolTypeHandler}也好,這已經(jīng)不重要了,他們拿到的類型都是UserTypeHandler拿到的類型,為這些#{}賦值的控制,已經(jīng)和你想的不一樣了。

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

鏡幻 提問者

但是按照我們正常的思維方式,如果我修改一個主要配置文件,那么他將對全局其作用,但是如果我在一個子配置里覆蓋主配置文件的設(shè)置,那么他應(yīng)該能在這個子配置起作用的范圍內(nèi)覆蓋全局的配置才對,這兒明顯是違背這種常規(guī)做法的
2014-12-15 回復(fù) 有任何疑惑可以回復(fù)我~

我需要看下user的類結(jié)構(gòu)

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

鏡幻 提問者

代碼已經(jīng)在下面了
2014-12-11 回復(fù) 有任何疑惑可以回復(fù)我~

我也碰到相同的問題,User的所有屬性都用UserTypeHandler去處理,請問樓主最后怎么解決的

0 回復(fù) 有任何疑惑可以回復(fù)我~

我已經(jīng)查過了mybatis的源碼,他確實是邏輯上有問題

public?void?setParameters(PreparedStatement?ps)?throws?SQLException?{
????ErrorContext.instance().activity("setting?parameters").object(mappedStatement.getParameterMap().getId());
????List<ParameterMapping>?parameterMappings?=?boundSql.getParameterMappings();
????if?(parameterMappings?!=?null)?{
??????for?(int?i?=?0;?i?<?parameterMappings.size();?i++)?{
????????ParameterMapping?parameterMapping?=?parameterMappings.get(i);
????????if?(parameterMapping.getMode()?!=?ParameterMode.OUT)?{
??????????Object?value;
??????????String?propertyName?=?parameterMapping.getProperty();
??????????if?(boundSql.hasAdditionalParameter(propertyName))?{?//?issue?#448?ask?first?for?additional?params
????????????value?=?boundSql.getAdditionalParameter(propertyName);
??????????}?else?if?(parameterObject?==?null)?{
????????????value?=?null;
??????????}?else?if?(typeHandlerRegistry.hasTypeHandler(parameterObject.getClass()))?{//如果根據(jù)parameterObject可以找到轉(zhuǎn)換器,那么value就賦值為parameterObject了
????????????value?=?parameterObject;
??????????}?else?{
????????????MetaObject?metaObject?=?configuration.newMetaObject(parameterObject);
????????????value?=?metaObject.getValue(propertyName);
??????????}
??????????TypeHandler?typeHandler?=?parameterMapping.getTypeHandler();//這兒獲得的轉(zhuǎn)換器是school的轉(zhuǎn)換器
??????????JdbcType?jdbcType?=?parameterMapping.getJdbcType();
??????????if?(value?==?null?&&?jdbcType?==?null)?jdbcType?=?configuration.getJdbcTypeForNull();
??????????typeHandler.setParameter(ps,?i?+?1,?value,?jdbcType);//轉(zhuǎn)換器是school的?但是傳值是User
????????}
??????}
????}
??}


0 回復(fù) 有任何疑惑可以回復(fù)我~
public?class?User?{
private?long?id?;
private?String?name;
private?String?password;
private?String?sex;
private?String?email;
private?String?tel;
private?String?department_name;
private?String?department_id;
private?School?school;
.......
}
public?class?School?{
private?String?name;
private?String?address;
......
@Override
public?String?toString()?{
//?TODO?Auto-generated?method?stub
return?name+":"+address;
}
}
public?class?SchoolTypeHandler?extends?BaseTypeHandler<School>?{
@Override
public?void?setNonNullParameter(PreparedStatement?ps,?int?i,
School?parameter,?JdbcType?jdbcType)?throws?SQLException?{
System.out.println("SchoolTypeHandlers??setParameter被調(diào)用了?i="+i+"\tjavaType="+parameter.getClass()+"\tjdbcType="+jdbcType);
ps.setString(i,?parameter.toString());
}
@Override
public?School?getNullableResult(ResultSet?rs,?String?columnName)
throws?SQLException?{
System.out.println("SchoolTypeHandlers??ResultSet?columnName");
School?school?=?new?School();
school.setName(rs.getString(columnName).split(":")[0]);
school.setAddress(rs.getString(columnName).split(":")[1]);
return?school;
}
@Override
public?School?getNullableResult(ResultSet?rs,?int?columnIndex)
throws?SQLException?{
System.out.println("SchoolTypeHandlers??ResultSet?columnIndex");
School?school?=?new?School();
school.setName(rs.getString(columnIndex).split(":")[0]);
school.setAddress(rs.getString(columnIndex).split(":")[1]);
return?school;
}
@Override
public?School?getNullableResult(CallableStatement?cs,?int?columnIndex)
throws?SQLException?{
System.out.println("CallableStatement?columnIndex被調(diào)用了");
return?null;
}
}
public?class?UserTypeHandler?implements?TypeHandler?{
@Override
public?void?setParameter(PreparedStatement?ps,?int?i,?Object?parameter,
JdbcType?jdbcType)?throws?SQLException?{
System.out.println("One?setNonNullParameter被調(diào)用了?i="+i+"\tjavaType="+parameter.getClass()+"\tjdbcType="+jdbcType);
if?(i?==?1)
ps.setLong(i,?((User)parameter).getId());
else
ps.setString(i,?((User)parameter).getName());
}
@Override
public?User?getResult(ResultSet?rs,?String?columnName)
throws?SQLException?{
System.out.println("One?ResultSet?columnName被調(diào)用了");
User?u?=?new?User();
u.setName(rs.getString("name"));
return?u;
}
@Override
public?User?getResult(ResultSet?rs,?int?columnIndex)?throws?SQLException?{
System.out.println("One?ResultSet?columnIndex");
User?u?=?new?User();
u.setName(rs.getString("name"));
return?u;
}
@Override
public?User?getResult(CallableStatement?cs,?int?columnIndex)
throws?SQLException?{
System.out.println("One?CallableStatement?columnIndex被調(diào)用了");
return?null;
}
}


0 回復(fù) 有任何疑惑可以回復(fù)我~

public class User {

private long id ;

private String name;

private String password;

private String sex;

private String email;

private String tel;

private String department_name;

private String department_id;

private School school;

.......

}

public class School {

private String name;

private String address;

......

@Override
public?String?toString()?{
//?TODO?Auto-generated?method?stub
return?name+":"+address;
}
}
public?class?SchoolTypeHandler?extends?BaseTypeHandler<School>?{
@Override
public?void?setNonNullParameter(PreparedStatement?ps,?int?i,
School?parameter,?JdbcType?jdbcType)?throws?SQLException?{
System.out.println("SchoolTypeHandlers??setParameter被調(diào)用了?i="+i+"\tjavaType="+parameter.getClass()+"\tjdbcType="+jdbcType);
ps.setString(i,?parameter.toString());
}
@Override
public?School?getNullableResult(ResultSet?rs,?String?columnName)
throws?SQLException?{
System.out.println("SchoolTypeHandlers??ResultSet?columnName");
School?school?=?new?School();
school.setName(rs.getString(columnName).split(":")[0]);
school.setAddress(rs.getString(columnName).split(":")[1]);
return?school;
}
@Override
public?School?getNullableResult(ResultSet?rs,?int?columnIndex)
throws?SQLException?{
System.out.println("SchoolTypeHandlers??ResultSet?columnIndex");
School?school?=?new?School();
school.setName(rs.getString(columnIndex).split(":")[0]);
school.setAddress(rs.getString(columnIndex).split(":")[1]);
return?school;
}
@Override
public?School?getNullableResult(CallableStatement?cs,?int?columnIndex)
throws?SQLException?{
System.out.println("CallableStatement?columnIndex被調(diào)用了");
return?null;
}
}
public?class?UserTypeHandler?implements?TypeHandler?{
@Override
public?void?setParameter(PreparedStatement?ps,?int?i,?Object?parameter,
JdbcType?jdbcType)?throws?SQLException?{
System.out.println("One?setNonNullParameter被調(diào)用了?i="+i+"\tjavaType="+parameter.getClass()+"\tjdbcType="+jdbcType);
if?(i?==?1)
ps.setLong(i,?((User)parameter).getId());
else
ps.setString(i,?((User)parameter).getName());
}
@Override
public?User?getResult(ResultSet?rs,?String?columnName)
throws?SQLException?{
System.out.println("One?ResultSet?columnName被調(diào)用了");
User?u?=?new?User();
u.setName(rs.getString("name"));
return?u;
}
@Override
public?User?getResult(ResultSet?rs,?int?columnIndex)?throws?SQLException?{
System.out.println("One?ResultSet?columnIndex");
User?u?=?new?User();
u.setName(rs.getString("name"));
return?u;
}
@Override
public?User?getResult(CallableStatement?cs,?int?columnIndex)
throws?SQLException?{
System.out.println("One?CallableStatement?columnIndex被調(diào)用了");
return?null;
}
}


0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報

0/150
提交
取消

我發(fā)現(xiàn)了一個TypeHandler的bug你怎么看

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號