/* * Copyright 2004 Clinton Begin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ibatis.sqlmap.client; import java.sql.Connection; /** * A thread safe client for working with your SQL Maps (Start Here). This interface inherits transaction control * and execution methods from the SqlMapTransactionManager and SqlMapExecutor interfaces. * <p/> * The SqlMapClient is the central class for working with SQL Maps. This class will allow you * to run mapped statements (select, insert, update, delete etc.), and also demarcate * transactions and work with batches. Once you have an SqlMapClient instance, everything * you need to work with SQL Maps is easily available. * <p/> * The SqlMapClient can either * be worked with directly as a multi-threaded client (internal session management), or you can get a single threaded * session and work with that. There may be a slight performance increase if you explicitly * get a session (using the openSession() method), as it saves the SqlMapClient from having * to manage threads contexts. But for most cases it won't make much of a difference, so * choose whichever paradigm suits your needs or preferences. * <p/> * An SqlMapClient instance can be safely made <i>static</i> or applied as a <i>Singleton</i>. * Generally it's a good idea to make a simple configuration class that will configure the * instance (using SqlMapClientBuilder) and provide access to it. * <p/> * <b>The following example will demonstrate the use of SqlMapClient.</b> * <pre> * <i><font color="green"> * // * // autocommit simple query --these are just examples...not patterns * // * </font></i> * Employee emp = (Employee) <b>sqlMap.queryForObject("getEmployee", new Integer(1))</b>; * <i><font color="green"> * // * // transaction --these are just examples...not patterns * // * </font></i> * try { * <b>sqlMap.startTransaction()</b> * Employee emp2 = new Employee(); * // ...set emp2 data * Integer generatedKey = (Integer) <b>sqlMap.insert ("insertEmployee", emp2)</b>; * emp2.setFavouriteColour ("green"); * <b>sqlMap.update("updateEmployee", emp2)</b>; * <b>sqlMap.commitTransaction()</b>; * } finally { * <b>sqlMap.endTransaction()</b>; * } * <i><font color="green"> * // * // session --these are just examples...not patterns * // * </font></i> * try { * <b>SqlMapSession session = sqlMap.openSession()</b> * <b>session.startTransaction()</b> * Employee emp2 = new Employee(); * // ...set emp2 data * Integer generatedKey = (Integer) <b>session.insert ("insertEmployee", emp2)</b>; * emp2.setFavouriteColour ("green"); * <b>session.update("updateEmployee", emp2)</b>; * <b>session.commitTransaction()</b>; * } finally { * try { * <b>session.endTransaction()</b>; * } finally { * <b>session.close()</b>; * } * // Generally your session scope would be in a wider context and therefore the * // ugly nested finally block above would not be there. Realize that sessions * // MUST be closed if explicitly opened (via openSession()). * } * <i><font color="green"> * // * // batch --these are just examples...not patterns * // * </font></i> * try { * <b>sqlMap.startTransaction()</b> * List list = (Employee) <b>sqlMap.queryForList("getFiredEmployees", null)</b>; * <b>sqlMap.startBatch ()</b>; * for (int i=0, n=list.size(); i < n; i++) { * <b>sqlMap.delete ("deleteEmployee", list.get(i))</b>; * } * <b>sqlMap.executeBatch()</b>; * <b>sqlMap.commitTransaction()</b>; * } finally { * <b>sqlMap.endTransaction()</b>; * } * </pre> * * @see SqlMapClientBuilder * @see SqlMapSession * @see SqlMapExecutor */ public interface SqlMapClient extends SqlMapExecutor, SqlMapTransactionManager { /** * Returns a single threaded SqlMapSession implementation for use by * one user. Remember though, that SqlMapClient itself is a thread safe SqlMapSession * implementation, so you can also just work directly with it. If you do get a session * explicitly using this method <b>be sure to close it!</b> You can close a session using * the sqlMapSession.close() method. * <p/> * * @return An SqlMapSession instance. */ public SqlMapSession openSession(); /** * Returns a single threaded SqlMapSession implementation for use by * one user. Remember though, that SqlMapClient itself is a thread safe SqlMapSession * implementation, so you can also just work directly with it. If you do get a session * explicitly using this method <b>be sure to close it!</b> You can close a session using * the SqlMapSession.close() method. * <p/> * This particular implementation takes a user provided connection as a parameter. This * connection will be used for executing statements, and therefore overrides any * configured datasources. Using this approach allows the developer to easily use an externally * supplied connection for executing statements. * <p/> * <b>Important:</b> Using a user supplied connection basically sidesteps the datasource * so you are responsible for appropriately handling your connection lifecycle (i.e. closing). * Here's a (very) simple example (throws SQLException): * <pre> * try { * Connection connection = dataSource.getConnection(); * SqlMapSession session = sqlMap.openSession(connection); * // do work * connection.commit(); * } catch (SQLException e) { * try { * if (connection != null) commit.rollback(); * } catch (SQLException ignored) { * // generally ignored * } * throw e; // rethrow the exception * } finally { * try { * if (connection != null) connection.close(); * } catch (SQLException ignored) { * // generally ignored * } * } * </pre> * * @param conn - the connection to use for the session * * @return An SqlMapSession instance. */ public SqlMapSession openSession(Connection conn); /** * TODO : Deprecated and will be removed. * * @return A session (DEPRECATED) * @deprecated Use openSession() instead. THIS METHOD WILL BE REMOVED BEFORE * FINAL RELEASE. */ public SqlMapSession getSession(); /** * Flushes all data caches. */ public void flushDataCache(); /** * Flushes the data cache that matches the cache model ID provided. * cacheId should include the namespace, even when * useStatementNamespaces="false". * * @param cacheId The cache model to flush */ public void flushDataCache(String cacheId); /** * Returns a generated implementation of a cusom mapper class as specified by the method * parameter. The generated implementation will run mapped statements by matching the method * name to the statement name. The mapped statement elements determine how the statement is * run as per the following: * <ul> * <li><insert> -- insert() * <li><update> -- update() * <li><delete> -- delete() * <li><select> -- queryForObject, queryForList or queryForMap, as determined by signature (see below) * <li><procedure> -- determined by method name (see below) * </ul> * * How select statements are run is determined by the method signature, * as per the following: * <ul> * <li> Object methodName (Object param) -- queryForObject * <li> List methodName (Object param [, int skip, int max | , int pageSize]) -- queryForList * <li> Map methodName (Object param, String keyProp [,valueProp]) -- queryForMap * </ul> * * How stored procedures are run is determined by the method name, * as per the following: * <ul> * <li> insertXxxxx -- insert() * <li> createXxxxx -- insert() * <li> updateXxxxx -- update() * <li> saveXxxxx -- update() * <li> deleteXxxxx -- delete() * <li> removeXxxxx -- delete() * <li> selectXxxxx -- queryForXxxxxx() determined by method signature as above * <li> queryXxxxx -- queryForXxxxxx() determined by method signature as above * <li> fetchXxxxx -- queryForXxxxxx() determined by method signature as above * <li> getXxxxx -- queryForXxxxxx() determined by method signature as above * </ul> * * @param iface The interface that contains methods representing the mapped statements contained. * @return An instance of iface that can be used to call mapped statements directly in a typesafe * manner. */ //public Object getMapper(Class iface); }