3939import org .apache .ibatis .mapping .ResultMap ;
4040import org .apache .ibatis .mapping .ResultMapping ;
4141import org .apache .ibatis .mapping .SqlCommandType ;
42+ import org .apache .ibatis .reflection .DefaultReflectorFactory ;
43+ import org .apache .ibatis .reflection .MetaObject ;
44+ import org .apache .ibatis .reflection .ReflectorFactory ;
45+ import org .apache .ibatis .reflection .factory .DefaultObjectFactory ;
46+ import org .apache .ibatis .reflection .factory .ObjectFactory ;
47+ import org .apache .ibatis .reflection .wrapper .DefaultObjectWrapperFactory ;
48+ import org .apache .ibatis .reflection .wrapper .ObjectWrapperFactory ;
49+ import org .apache .ibatis .scripting .xmltags .XMLLanguageDriver ;
4250import org .apache .ibatis .session .Configuration ;
4351import org .apache .ibatis .type .JdbcType ;
4452import org .apache .ibatis .type .TypeException ;
@@ -103,16 +111,93 @@ MappedStatement getMappedStatement() {
103111 }
104112
105113 @ Test
106- void testParameterObjectMetaObjectGetValue () {
114+ void testParameterObjectGetPropertyValueWithAdditionalParameter () throws SQLException {
107115 Configuration config = new Configuration ();
108116 TypeHandlerRegistry registry = config .getTypeHandlerRegistry ();
109117
110118 MappedStatement mappedStatement = new MappedStatement .Builder (config , "testSelect" , new StaticSqlSource (config , "some select statement" ), SqlCommandType .SELECT ).build ();
111119
112- Author parameterObject = mock (Author .class );
120+ Object parameterObject = 1 ;
121+
122+ BoundSql boundSql = new BoundSql (config , "some select statement" , new ArrayList <ParameterMapping >() {
123+ {
124+ add (new ParameterMapping .Builder (config , "id" , registry .getTypeHandler (int .class )).build ());
125+ }
126+ }, parameterObject ) {
127+ {
128+ setAdditionalParameter ("id" , 2 );
129+ }
130+ };
131+
132+ DefaultParameterHandler defaultParameterHandler = new DefaultParameterHandler (mappedStatement , parameterObject , boundSql );
133+
134+ PreparedStatement ps = mock (PreparedStatement .class );
135+
136+ defaultParameterHandler .setParameters (ps );
137+
138+ verify (ps , times (1 )).setInt (1 , 2 );
139+ }
140+
141+ @ Test
142+ void testParameterObjectGetPropertyValueWithNull () throws SQLException {
143+ Configuration config = new Configuration ();
144+ TypeHandlerRegistry registry = config .getTypeHandlerRegistry ();
145+
146+ MappedStatement mappedStatement = new MappedStatement .Builder (config , "testSelect" , new StaticSqlSource (config , "some select statement" ), SqlCommandType .SELECT ).build ();
147+
148+ Object parameterObject = null ;
149+
150+ BoundSql boundSql = new BoundSql (config , "some select statement" , new ArrayList <ParameterMapping >() {
151+ {
152+ add (new ParameterMapping .Builder (config , "id" , registry .getTypeHandler (int .class )).build ());
153+ }
154+ }, parameterObject );
155+
156+ DefaultParameterHandler defaultParameterHandler = new DefaultParameterHandler (mappedStatement , parameterObject , boundSql );
157+
158+ PreparedStatement ps = mock (PreparedStatement .class );
159+
160+ defaultParameterHandler .setParameters (ps );
161+
162+ verify (ps , times (1 )).setNull (1 , config .getJdbcTypeForNull ().TYPE_CODE );
163+ }
164+
165+ @ Test
166+ void testParameterObjectGetPropertyValueWithTypeHandler () throws SQLException {
167+ Configuration config = new Configuration ();
168+ TypeHandlerRegistry registry = config .getTypeHandlerRegistry ();
169+
170+ MappedStatement mappedStatement = new MappedStatement .Builder (config , "testSelect" , new StaticSqlSource (config , "some select statement" ), SqlCommandType .SELECT ).build ();
171+
172+ Object parameterObject = 1 ;
113173
114174 BoundSql boundSql = new BoundSql (config , "some select statement" , new ArrayList <ParameterMapping >() {
115175 {
176+ add (new ParameterMapping .Builder (config , "id" , registry .getTypeHandler (int .class )).build ());
177+ }
178+ }, parameterObject );
179+
180+ DefaultParameterHandler defaultParameterHandler = new DefaultParameterHandler (mappedStatement , parameterObject , boundSql );
181+
182+ PreparedStatement ps = mock (PreparedStatement .class );
183+
184+ defaultParameterHandler .setParameters (ps );
185+
186+ verify (ps , times (1 )).setInt (1 , (Integer ) parameterObject );
187+ }
188+
189+ @ Test
190+ void testParameterObjectGetPropertyValueWithMetaObject () throws SQLException {
191+ Configuration config = new Configuration ();
192+ TypeHandlerRegistry registry = config .getTypeHandlerRegistry ();
193+
194+ MappedStatement mappedStatement = new MappedStatement .Builder (config , "testSelect" , new StaticSqlSource (config , "some select statement" ), SqlCommandType .SELECT ).build ();
195+
196+ Author parameterObject = new Author (-1 , "cbegin" , "******" , "cbegin@nowhere.com" , "N/A" , Section .NEWS );
197+
198+ BoundSql boundSql = new BoundSql (config , "some select statement" , new ArrayList <ParameterMapping >() {
199+ {
200+ add (new ParameterMapping .Builder (config , "id" , registry .getTypeHandler (int .class )).build ());
116201 add (new ParameterMapping .Builder (config , "username" , registry .getTypeHandler (String .class )).build ());
117202 add (new ParameterMapping .Builder (config , "password" , registry .getTypeHandler (String .class )).build ());
118203 add (new ParameterMapping .Builder (config , "email" , registry .getTypeHandler (String .class )).build ());
@@ -127,10 +212,56 @@ void testParameterObjectMetaObjectGetValue() {
127212
128213 defaultParameterHandler .setParameters (ps );
129214
215+ verify (ps , times (1 )).setInt (1 , parameterObject .getId ());
216+ verify (ps , times (1 )).setString (2 , parameterObject .getUsername ());
217+ verify (ps , times (1 )).setString (3 , parameterObject .getPassword ());
218+ verify (ps , times (1 )).setString (4 , parameterObject .getEmail ());
219+ verify (ps , times (1 )).setString (5 , parameterObject .getBio ());
220+ verify (ps , times (1 )).setObject (6 , parameterObject .getFavouriteSection ().name (), JdbcType .VARCHAR .TYPE_CODE );
221+ }
222+
223+ @ Test
224+ void testParameterObjectGetPropertyValueWithMetaObjectAndCreateOnce () {
225+ Author parameterObject = mock (Author .class );
226+
227+ Configuration mockConfig = mock (Configuration .class );
228+
229+ final ObjectFactory objectFactory = new DefaultObjectFactory ();
230+ final ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory ();
231+ final ReflectorFactory reflectorFactory = new DefaultReflectorFactory ();
232+
233+ when (mockConfig .getTypeHandlerRegistry ()).thenReturn (new TypeHandlerRegistry (mockConfig ));
234+ when (mockConfig .getDefaultScriptingLanguageInstance ()).thenReturn (new XMLLanguageDriver ());
235+ when (mockConfig .newMetaObject (parameterObject )).thenReturn (MetaObject .forObject (parameterObject , objectFactory , objectWrapperFactory , reflectorFactory ));
236+
237+ TypeHandlerRegistry registry = mockConfig .getTypeHandlerRegistry ();
238+
239+ MappedStatement mappedStatement = new MappedStatement .Builder (mockConfig , "testSelect" , new StaticSqlSource (mockConfig , "some select statement" ), SqlCommandType .SELECT ).build ();
240+
241+ BoundSql boundSql = new BoundSql (mockConfig , "some select statement" , new ArrayList <ParameterMapping >() {
242+ {
243+ add (new ParameterMapping .Builder (mockConfig , "id" , registry .getTypeHandler (int .class )).jdbcType (JdbcType .INTEGER ).build ());
244+ add (new ParameterMapping .Builder (mockConfig , "username" , registry .getTypeHandler (String .class )).jdbcType (JdbcType .VARCHAR ).build ());
245+ add (new ParameterMapping .Builder (mockConfig , "password" , registry .getTypeHandler (String .class )).jdbcType (JdbcType .VARCHAR ).build ());
246+ add (new ParameterMapping .Builder (mockConfig , "email" , registry .getTypeHandler (String .class )).jdbcType (JdbcType .VARCHAR ).build ());
247+ add (new ParameterMapping .Builder (mockConfig , "bio" , registry .getTypeHandler (String .class )).jdbcType (JdbcType .VARCHAR ).build ());
248+ add (new ParameterMapping .Builder (mockConfig , "favouriteSection" , registry .getTypeHandler (Section .class )).jdbcType (JdbcType .VARCHAR ).build ());
249+ }
250+ }, parameterObject );
251+
252+ DefaultParameterHandler defaultParameterHandler = new DefaultParameterHandler (mappedStatement , parameterObject , boundSql );
253+
254+ PreparedStatement ps = mock (PreparedStatement .class );
255+
256+ defaultParameterHandler .setParameters (ps );
257+
258+ verify (parameterObject , times (1 )).getId ();
130259 verify (parameterObject , times (1 )).getUsername ();
131260 verify (parameterObject , times (1 )).getPassword ();
132261 verify (parameterObject , times (1 )).getEmail ();
133262 verify (parameterObject , times (1 )).getBio ();
134263 verify (parameterObject , times (1 )).getFavouriteSection ();
264+
265+ verify (mockConfig , times (1 )).newMetaObject (parameterObject );
135266 }
136267}
0 commit comments