4. Configurando iBatis Crear el SqlMapConfig.xml Crear el db.properties Crear la clase java Crear el mapping para esa clase
5. El SqlMapConfig.xml <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd" > < sqlMapConfig > < properties resource = "db.properties" /> < settings useStatementNamespaces = "false" cacheModelsEnabled = "true" enhancementEnabled = "true" lazyLoadingEnabled = "true" maxRequests = "32" maxSessions = "10" maxTransactions = "5" /> < transactionManager type = "JDBC" > < dataSource type = "SIMPLE" > < property name = "JDBC.Driver" value = "${driver}" /> < property name = "JDBC.ConnectionURL" value = "${url}" /> < property name = "JDBC.Username" value = "${user}" /> < property name = "JDBC.Password" value = "${pword}" /> </ dataSource > </ transactionManager > < sqlMap resource = "test/Encuesta.xml" /> </ sqlMapConfig >
6. El db.properties driver= com . mysql . jdbc .Driver url=jdbc:mysql:// localhost :3306/ encuesta user=root pword= mysql
7. La clase Encuesta.java package enitity; import java.util.Vector; public class Encuesta { private int codigoEncuesta ; private String descripcionEncuesta ; private Vector preguntas ; public int getCodigoEncuesta() { return codigoEncuesta ; } public void setCodigoEncuesta( int codigoEncuesta) { this . codigoEncuesta = codigoEncuesta; } public String getDescripcionEncuesta() { return descripcionEncuesta ; } public void setDescripcionEncuesta(String descripcionEncuesta) { this . descripcionEncuesta = descripcionEncuesta; } public Vector getPreguntas() { return preguntas ; } public void setPreguntas(Vector preguntas) { this . preguntas = preguntas; } }
8. El mapa de la clase Encuesta.java <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" > < sqlMap namespace = "Encuesta" > <!-- Use type aliases to avoid typing the full classname every time. --> < typeAlias alias = "Encuesta" type = "enitity.Encuesta" /> < resultMap id = " EncuestaResult " class = "Encuesta" > < result property = " codigoEncuesta " column = " codigo_encuesta " /> < result property = " descripcionEncuesta " column = " descripcion_encuesta " /> </ resultMap > <!-- Select with no parameters using the result map for Encuesta class. --> < select id = " selectAllEncuestas " resultMap = "EncuestaResult" > select * from encuesta </ select > < select id = " selectEncuestaById " parameterClass = "int“ resultClass = "Encuesta" > select codigo_encuesta as codigoEncuesta, descripcion_encuesta as descripcionEncuesta from encuesta where codigo_encuesta = #codigoEncuesta# </ select >
9. El mapa de la clase Encuesta.java <!-- Insert example, using the Encuesta parameter class --> < insert id = " insertEncuesta " parameterClass = "Encuesta" > insert into encuesta ( descripcion_encuesta values ( #descripcionEncuesta# ) </ insert > <!-- Update example, using the Encuesta parameter class --> < update id = " updateEncuesta " parameterClass = "Encuesta" > update encuesta set descripcion_encuesta = #descripcionEncuesta# where codigo_encuesta = #codigoEncuesta# </ update > <!-- Delete example, using an integer as the parameter class --> < delete id = " deleteEncuestaById " parameterClass = "int" > delete from encuesta where codigo_encuesta = #codigoEncuesta# </ delete > </ sqlMap >
10. Test del bean Encuesta try { Reader reader = Resources. getResourceAsReader ( "test/SqlMapConfig.xml" ); sqlMapper = SqlMapClientBuilder. buildSqlMapClient (reader); reader.close(); } catch (IOException e) { // Fail fast. throw new RuntimeException( "Something bad happened while building the SqlMapClient instance." + e, e); } . . . public static List selectAllAccounts () throws SQLException { return sqlMapper .queryForList ( "selectAllEncuestas" , new ArrayList ()); } public static Encuesta selectEncuestaById ( int id) throws SQLException { return (Encuesta) sqlMapper .queryForObject ( "selectEncuestaById" , id); } public static void insertEncuesta (Encuesta Encuesta) throws SQLException { sqlMapper .insert ( "insertEncuesta" , Encuesta); } public static void updateEncuesta (Encuesta Encuesta) throws SQLException { sqlMapper .update ( "updateEncuesta" , Encuesta); } public static void deleteEncuesta ( int id) throws SQLException { sqlMapper .delete ( "deleteEncuesta" , id); }
13. El elemento <sql> < sql id = "select-order" > select * from order </ sql > < sql id = "select-count" > select count(*) as value from order </ sql > < sql id = "where-shipped-after-value" > <![CDATA[ where shipDate > #value:DATE# ]]> </ sql > < select id = "getOrderShippedAfter" resultClass = "map" > < include refid = " select-order " /> < include refid = " where-shipped-after-value " /> </ select > < select id = "getOrderCountShippedAfter" resultClass = "int" > < include refid = " select-count " /> < include refid = " where-shipped-after-value " /> </ select >
14. How do I use LIKE in my WHERE clauses?” < select id = "getByLikeCity" resultClass = "Account" > select accountId, username , password, firstName, lastName, address1, address2, city, state, postalCode, country from Account where city like '%$value$%' </ select >
16. Mapping parameters mode typeHandler nullValue jdbcType javaType property Attribute <select id="getOrderShippedAfter" resultClass="java.util.HashMap"> select * from order where shipDate > #value:DATE# </select>
17. Ejemplo < select id = "getOrderShippedAfter" resultClass = "hashmap" > select * from "order" where shipDate > #value,jdbcType=DATE# </ select >
18. iBATIS does not allow you to get a primitive result directly, Integer count = (Integer)sqlMap.queryForObject( "Account.getOrderCountByAccount", new Integer(1)); <select id="getOrderCountByAccount" resultClass=" java.lang.Integer " > select count(*) as value from order where accountId = #value# </select>
19. public class PrimitiveResult { private int orderCount; public int getOrderCount() { return orderCount; } public void setOrderCount(int orderCount) { this.orderCount = orderCount; } } <resultMap id="primitiveResultMapExample“ class="PrimitiveResult"> <result property="orderCount“ column="orderCount" /> </resultMap> <select id="getPrimitiveById“ resultMap="primitiveResultMapExample"> select count(*) as orderCount from order where accountId = #accountId# </select>
30. Updating or deleting child records public void saveOrder(SqlMapClient sqlMapClient, Order order) throws SQLException { if ( null == order.getOrderId()) { sqlMapClient.insert( "Order.insert" , order); } else { sqlMapClient.update( "Order.update" , order); } sqlMapClient.delete( "Order.deleteDetails" , order); for ( int i = 0; i < order.getOrderItems().size(); i++) { OrderItem oi = (OrderItem) order.getOrderItems().get(i); oi.setOrderId(order.getOrderId()); sqlMapClient.insert( "OrderItem.insert" , oi); } }
31. Running batch updates public void saveOrder( SqlMapClient sqlMapClient, Order order) throws SQLException { sqlMapClient.startTransaction(); try { if ( null == order.getOrderId()) { sqlMapClient.insert( "Order.insert" , order); } else { sqlMapClient.update( "Order.update" , order); } sqlMapClient.startBatch(); sqlMapClient.delete( "Order.deleteDetails" , order); for ( int i = 0; i < order.getOrderItems().size(); i++) { OrderItem oi = ( OrderItem ) order.getOrderItems().get(i); oi.setOrderId(order.getOrderId()); sqlMapClient.insert( "OrderItem.insert" , oi); } sqlMapClient.executeBatch(); sqlMapClient.commitTransaction(); } finally { sqlMapClient.endTransaction(); } }
32. Working with stored procedures CREATE OR REPLACE FUNCTION max_in_example (a float4, b float4) RETURNS float4 AS $BODY$ BEGIN if (a > b) then return a; else return b; end if; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
33. Working with stored procedures // En el Mapping ML <parameterMap id="pm_in_example" class="java.util.Map"> <parameter property="a" /> <parameter property="b" /> </parameterMap> <procedure id="in_example" parameterMap="pm_in_example“ resultClass="int" > { call max_in_example(?, ?) } </procedure> // EN Java Map m = new HashMap(2); m.put("a", new Integer(7)); m.put("b", new Integer(5)); Integer val = (Integer)sqlMap.queryForObject("Account.in_example", m);
34. Working with stored procedures create or replace procedure maximum (a in integer, b in integer, c out integer) as begin if (a > b) then c := a; end if; if (b >= a) then c := b; end if; end;
35. Working with stored procedures <parameterMap id="maxOutProcedureMap" class="java.util.Map"> <parameter property="a" mode="IN" /> <parameter property="b" mode="IN" /> <parameter property="c" mode="OUT" /> </parameterMap> <procedure id="maxOutProcedure" parameterMap="maxOutProcedureMap"> { call maximum (?, ?, ?) } </procedure> // Call maximum function Map m = new HashMap(2); m.put("a", new Integer(7)); m.put("b", new Integer(5)); sqlMap.queryForObject("Account.maxOutProcedure", m); // m.get("c") should be 7 now.
36. XML parameters < select id = "getByXmlId" resultClass = "Account" parameterClass = "xml" > select accountId, username , password, firstName, lastName, address1, address2, city, state, postalCode, country from Account where accountId = #accountId# </ select > String parameter = "<parameter><accountId>3</accountId></parameter>" ; Account account = ( Account ) sqlMapClient .queryForObject( "Account.getByXmlId" , parameter) ;
64. The readOnly attribute The <cacheModel> tag provides a readOnly attribute. This attribute is simply an indicator that provides instruction to the cache model, telling it how it should retrieve and store the cached object. Setting this attribute to true does not prevent retrieved objects from having their contents altered. When specifying a cache as read only, you tell the cache model that it is allowed to pass back a reference to the object that exists in the cache because it is not going to be altered by the application that is requesting it. If the readOnly attribute is set to false, this ensures that more than one user does not retrieve the same instance of a cached reference. The readOnly attribute works in conjunction with the serialize attribute. It is important to understand how these two attributes work together.
65. The serialize attribute The serialize attribute is used to instruct how cached objects are returned. When serialize is set to true, each object requested from the cache is returned as a deep copy. This means that the object you retrieve from the cache will have an identical value but will not be the same instance. This ensures that the actual version that is stored in the cache is never returned. It is important to call attention to the fact that this is not serialization as most would think of it. The objects do not get serialized to disk. This is memory-based serialization that creates deep copies of the cached objects that are in memory.