|
1 | 1 | <?xml version="1.0" encoding="UTF-8"?>
|
2 | 2 | <!--
|
3 | 3 |
|
4 |
| - Copyright 2009-2022 the original author or authors. |
| 4 | + Copyright 2009-2023 the original author or authors. |
5 | 5 |
|
6 | 6 | Licensed under the Apache License, Version 2.0 (the "License");
|
7 | 7 | you may not use this file except in compliance with the License.
|
@@ -359,10 +359,10 @@ SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environ
|
359 | 359 | localCacheScope
|
360 | 360 | </td>
|
361 | 361 | <td>
|
362 |
| - MyBatis usa una cache local para evitar dependencias circulares y acelerar ejecuciones repeticas de queries anidadas. |
363 |
| - Por defecto (SESSION) todas las queries ejecutadas en una sesión se cachean. Si localCacheScope=STATEMENT |
364 |
| - la sesión local solo se usará durante la ejecución de un statement, no se comparten datos entre distintas llamadas |
365 |
| - a SqlSession. |
| 362 | + MyBatis usa una cache local para evitar dependencias circulares y acelerar ejecuciones repeticas de queries anidadas. |
| 363 | + Por defecto (SESSION) todas las queries ejecutadas en una sesión se cachean. Si localCacheScope=STATEMENT |
| 364 | + la sesión local solo se usará durante la ejecución de un statement, no se comparten datos entre distintas llamadas |
| 365 | + a SqlSession. |
366 | 366 | </td>
|
367 | 367 | <td>
|
368 | 368 | SESSION | STATEMENT
|
@@ -1476,7 +1476,7 @@ public class ExampleTypeHandler extends BaseTypeHandler<String> {
|
1476 | 1476 | Añadiendo un atributo <code>jdbcType</code> al lemento typeHandler (por ejemplo: <code>jdbcType="VARCHAR"</code>).
|
1477 | 1477 | </li>
|
1478 | 1478 | <li>Añadiendo una anotación <code>@MappedJdbcTypes</code> a tu clase TypeHandler especificando la lista de tipos JDBC a la que asociarlo.
|
1479 |
| - Esta anotación será ignorada si se ha especificado también un atributo <code>jdbcType</code>. |
| 1479 | + Esta anotación será ignorada si se ha especificado también un atributo <code>jdbcType</code>. |
1480 | 1480 | </li>
|
1481 | 1481 | </ul>
|
1482 | 1482 |
|
@@ -1521,93 +1521,93 @@ public class GenericTypeHandler<E extends MyObject> extends BaseTypeHandler<E> {
|
1521 | 1521 | ...
|
1522 | 1522 | ]]></source>
|
1523 | 1523 |
|
1524 |
| - <p><code>EnumTypeHandler</code> y <code>EnumOrdinalTypeHandler</code> son TypeHandlers genéricos. |
1525 |
| - Conoceremos más sobre ellos en la próxima sección. |
1526 |
| - </p> |
| 1524 | + <p><code>EnumTypeHandler</code> y <code>EnumOrdinalTypeHandler</code> son TypeHandlers genéricos. |
| 1525 | + Conoceremos más sobre ellos en la próxima sección. |
| 1526 | + </p> |
1527 | 1527 |
|
1528 | 1528 | </subsection>
|
1529 | 1529 |
|
1530 | 1530 | <subsection name="Handling Enums">
|
1531 |
| - <p> |
1532 |
| - Si quires mapear un <code>Enum</code>, debes usar bien un |
1533 |
| - <code>EnumTypeHandler</code> o un <code>EnumOrdinalTypeHandler</code>. |
1534 |
| - </p> |
1535 |
| - |
1536 |
| - <p>Por ejemplo, digamos que quieres guardar el modo de reondeo que debe |
1537 |
| - usarse con un número determinado que debe redondearse. Por defecto MyBatis |
1538 |
| - usa un <code>EnumTypeHandler</code> para comvertir los valores del <code>Enum</code> |
1539 |
| - a sus nombres. |
1540 |
| - </p> |
1541 |
| - |
1542 |
| - <b>Observa que el <code>EnumTypeHandler</code> es un handler especial en el sentido de que |
1543 |
| - no maneja una clase específica, como los demás handlers sino cualquier clase que extiende |
1544 |
| - de <code>Enum</code></b> |
1545 |
| - |
1546 |
| - <p> |
1547 |
| - Sin embargo, puede que no queramos guardar nombres. Nuestro DBA puede insistir en que |
1548 |
| - usemos un entero en su lugar. Muy sencillo: añade un <code>EnumOrdinalTypeHandler</code> |
1549 |
| - a las sección de <code>typeHandlers</code> de tu fichero de configuración y ahora todos los |
1550 |
| - <code>RoundingMode</code> se mapearán a un entero usando su valor ordinal. |
1551 |
| - </p> |
| 1531 | + <p> |
| 1532 | + Si quires mapear un <code>Enum</code>, debes usar bien un |
| 1533 | + <code>EnumTypeHandler</code> o un <code>EnumOrdinalTypeHandler</code>. |
| 1534 | + </p> |
| 1535 | + |
| 1536 | + <p>Por ejemplo, digamos que quieres guardar el modo de reondeo que debe |
| 1537 | + usarse con un número determinado que debe redondearse. Por defecto MyBatis |
| 1538 | + usa un <code>EnumTypeHandler</code> para comvertir los valores del <code>Enum</code> |
| 1539 | + a sus nombres. |
| 1540 | + </p> |
| 1541 | + |
| 1542 | + <b>Observa que el <code>EnumTypeHandler</code> es un handler especial en el sentido de que |
| 1543 | + no maneja una clase específica, como los demás handlers sino cualquier clase que extiende |
| 1544 | + de <code>Enum</code></b> |
| 1545 | + |
| 1546 | + <p> |
| 1547 | + Sin embargo, puede que no queramos guardar nombres. Nuestro DBA puede insistir en que |
| 1548 | + usemos un entero en su lugar. Muy sencillo: añade un <code>EnumOrdinalTypeHandler</code> |
| 1549 | + a las sección de <code>typeHandlers</code> de tu fichero de configuración y ahora todos los |
| 1550 | + <code>RoundingMode</code> se mapearán a un entero usando su valor ordinal. |
| 1551 | + </p> |
1552 | 1552 | <source><![CDATA[<!-- mybatis-config.xml -->
|
1553 | 1553 | <typeHandlers>
|
1554 | 1554 | <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
|
1555 | 1555 | </typeHandlers>
|
1556 | 1556 | ]]></source>
|
1557 |
| - <p> |
1558 |
| - Pero ¿y si quieres mapear el mismo <code>Enum</code> a un string en un sitio pero a un entero en otro? |
1559 |
| - </p> |
1560 |
| - <p> |
1561 |
| - El mapeo automático siempre usará <code>EnumOrdinalTypeHandler</code>, |
1562 |
| - así que si queremos usar el clásico <code>EnumTypeHandler</code>, |
1563 |
| - debemos indicarlo establiencidolo esplícitamente su uso en los statements. |
1564 |
| - </p> |
1565 |
| - <p> |
1566 |
| - Los mappers no se tratarán hasta la sección siguiente asi que si esta es tu primera lectura de |
1567 |
| - la documentación quizá prefieras saltarte esta sección por ahora y volver más tarde). |
1568 |
| - </p> |
1569 |
| - <source><![CDATA[<!DOCTYPE mapper |
| 1557 | + <p> |
| 1558 | + Pero ¿y si quieres mapear el mismo <code>Enum</code> a un string en un sitio pero a un entero en otro? |
| 1559 | + </p> |
| 1560 | + <p> |
| 1561 | + El mapeo automático siempre usará <code>EnumOrdinalTypeHandler</code>, |
| 1562 | + así que si queremos usar el clásico <code>EnumTypeHandler</code>, |
| 1563 | + debemos indicarlo establiencidolo esplícitamente su uso en los statements. |
| 1564 | + </p> |
| 1565 | + <p> |
| 1566 | + Los mappers no se tratarán hasta la sección siguiente asi que si esta es tu primera lectura de |
| 1567 | + la documentación quizá prefieras saltarte esta sección por ahora y volver más tarde). |
| 1568 | + </p> |
| 1569 | + <source><![CDATA[<!DOCTYPE mapper |
1570 | 1570 | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
1571 | 1571 | "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
1572 | 1572 |
|
1573 | 1573 | <mapper namespace="org.apache.ibatis.submitted.rounding.Mapper">
|
1574 |
| - <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap"> |
1575 |
| - <id column="id" property="id"/> |
1576 |
| - <result column="name" property="name"/> |
1577 |
| - <result column="funkyNumber" property="funkyNumber"/> |
1578 |
| - <result column="roundingMode" property="roundingMode"/> |
1579 |
| - </resultMap> |
1580 |
| -
|
1581 |
| - <select id="getUser" resultMap="usermap"> |
1582 |
| - select * from users |
1583 |
| - </select> |
1584 |
| - <insert id="insert"> |
1585 |
| - insert into users (id, name, funkyNumber, roundingMode) values ( |
1586 |
| - #{id}, #{name}, #{funkyNumber}, #{roundingMode} |
1587 |
| - ) |
1588 |
| - </insert> |
1589 |
| -
|
1590 |
| - <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2"> |
1591 |
| - <id column="id" property="id"/> |
1592 |
| - <result column="name" property="name"/> |
1593 |
| - <result column="funkyNumber" property="funkyNumber"/> |
1594 |
| - <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/> |
1595 |
| - </resultMap> |
1596 |
| - <select id="getUser2" resultMap="usermap2"> |
1597 |
| - select * from users2 |
1598 |
| - </select> |
1599 |
| - <insert id="insert2"> |
1600 |
| - insert into users2 (id, name, funkyNumber, roundingMode) values ( |
1601 |
| - #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler} |
1602 |
| - ) |
1603 |
| - </insert> |
| 1574 | + <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap"> |
| 1575 | + <id column="id" property="id"/> |
| 1576 | + <result column="name" property="name"/> |
| 1577 | + <result column="funkyNumber" property="funkyNumber"/> |
| 1578 | + <result column="roundingMode" property="roundingMode"/> |
| 1579 | + </resultMap> |
| 1580 | +
|
| 1581 | + <select id="getUser" resultMap="usermap"> |
| 1582 | + select * from users |
| 1583 | + </select> |
| 1584 | + <insert id="insert"> |
| 1585 | + insert into users (id, name, funkyNumber, roundingMode) values ( |
| 1586 | + #{id}, #{name}, #{funkyNumber}, #{roundingMode} |
| 1587 | + ) |
| 1588 | + </insert> |
| 1589 | +
|
| 1590 | + <resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2"> |
| 1591 | + <id column="id" property="id"/> |
| 1592 | + <result column="name" property="name"/> |
| 1593 | + <result column="funkyNumber" property="funkyNumber"/> |
| 1594 | + <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/> |
| 1595 | + </resultMap> |
| 1596 | + <select id="getUser2" resultMap="usermap2"> |
| 1597 | + select * from users2 |
| 1598 | + </select> |
| 1599 | + <insert id="insert2"> |
| 1600 | + insert into users2 (id, name, funkyNumber, roundingMode) values ( |
| 1601 | + #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler} |
| 1602 | + ) |
| 1603 | + </insert> |
1604 | 1604 |
|
1605 | 1605 | </mapper>
|
1606 | 1606 | ]]></source>
|
1607 |
| - <p> |
1608 |
| - Observa que esto nos fuerza a usar un <code>resultMap</code> |
1609 |
| - en lugar de un <code>resultType</code> en nuestros statements tipo select. |
1610 |
| - </p> |
| 1607 | + <p> |
| 1608 | + Observa que esto nos fuerza a usar un <code>resultMap</code> |
| 1609 | + en lugar de un <code>resultType</code> en nuestros statements tipo select. |
| 1610 | + </p> |
1611 | 1611 | </subsection>
|
1612 | 1612 |
|
1613 | 1613 | <subsection name="objectFactory">
|
@@ -1879,19 +1879,19 @@ SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader,properti
|
1879 | 1879 | Enviará la propiedad “encoding” y el valor “UTF-8” al constructor del InitialContext durante su instanciación.
|
1880 | 1880 | </p>
|
1881 | 1881 |
|
1882 |
| - <p> |
1883 |
| - You can plug any 3rd party DataSource by implementing the interface <code>org.apache.ibatis.datasource.DataSourceFactory</code>: |
1884 |
| - </p> |
| 1882 | + <p> |
| 1883 | + You can plug any 3rd party DataSource by implementing the interface <code>org.apache.ibatis.datasource.DataSourceFactory</code>: |
| 1884 | + </p> |
1885 | 1885 |
|
1886 | 1886 | <source><![CDATA[public interface DataSourceFactory {
|
1887 | 1887 | void setProperties(Properties props);
|
1888 | 1888 | DataSource getDataSource();
|
1889 | 1889 | }]]></source>
|
1890 | 1890 |
|
1891 | 1891 | <p>
|
1892 |
| - The <code>org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory</code> puede extenderse para crear nuevos |
1893 |
| - adaptadores. Por ejemplo, este es el código necesario para integrar C3P0: |
1894 |
| - </p> |
| 1892 | + The <code>org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory</code> puede extenderse para crear nuevos |
| 1893 | + adaptadores. Por ejemplo, este es el código necesario para integrar C3P0: |
| 1894 | + </p> |
1895 | 1895 |
|
1896 | 1896 | <source><![CDATA[import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
|
1897 | 1897 | import com.mchange.v2.c3p0.ComboPooledDataSource;
|
@@ -1930,29 +1930,29 @@ public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
|
1930 | 1930 | <source><![CDATA[<databaseIdProvider type="DB_VENDOR" />
|
1931 | 1931 | ]]></source>
|
1932 | 1932 |
|
1933 |
| - <p> |
1934 |
| - La implementación DB_VENDOR del databaseIdProvider establece como databaseId el String devuelto por |
1935 |
| - <code>DatabaseMetaData#getDatabaseProductName()</code>. |
1936 |
| - Como normalmente este string es demasiado largo, y además, distintas versiones del mismo producto devuelven valores |
1937 |
| - similares, puedes traducirlo a un valor más corto añadiendo propiedades de la siguente forma: |
1938 |
| - </p> |
| 1933 | + <p> |
| 1934 | + La implementación DB_VENDOR del databaseIdProvider establece como databaseId el String devuelto por |
| 1935 | + <code>DatabaseMetaData#getDatabaseProductName()</code>. |
| 1936 | + Como normalmente este string es demasiado largo, y además, distintas versiones del mismo producto devuelven valores |
| 1937 | + similares, puedes traducirlo a un valor más corto añadiendo propiedades de la siguente forma: |
| 1938 | + </p> |
1939 | 1939 |
|
1940 | 1940 | <source><![CDATA[<databaseIdProvider type="DB_VENDOR">
|
1941 | 1941 | <property name="SQL Server" value="sqlserver"/>
|
1942 | 1942 | <property name="DB2" value="db2"/>
|
1943 | 1943 | <property name="Oracle" value="oracle" />
|
1944 | 1944 | </databaseIdProvider>]]></source>
|
1945 | 1945 |
|
1946 |
| - <p> |
1947 |
| - Cuando se añaden propiedades, el databaseIdProvider DB_VENDOR devuelve el primer valor que corresponde a la primera clave |
1948 |
| - encontrada en el nombre devuelto por <code>DatabaseMetaData#getDatabaseProductName()</code> o "null" si no se encuentra ninguna. |
1949 |
| - En este caso, si <code>getDatabaseProductName()</code> devuelve "Oracle (DataDirect)" el databaseId se informará con "oracle". |
1950 |
| - </p> |
| 1946 | + <p> |
| 1947 | + Cuando se añaden propiedades, el databaseIdProvider DB_VENDOR devuelve el primer valor que corresponde a la primera clave |
| 1948 | + encontrada en el nombre devuelto por <code>DatabaseMetaData#getDatabaseProductName()</code> o "null" si no se encuentra ninguna. |
| 1949 | + En este caso, si <code>getDatabaseProductName()</code> devuelve "Oracle (DataDirect)" el databaseId se informará con "oracle". |
| 1950 | + </p> |
1951 | 1951 |
|
1952 |
| - <p> |
1953 |
| - Puedes construir tu propio DatabaseIdProvider implementando la interfaz <code>org.apache.ibatis.mapping.DatabaseIdProvider</code> |
1954 |
| - y registrandolo en el fichero mybatis-config.xml: |
1955 |
| - </p> |
| 1952 | + <p> |
| 1953 | + Puedes construir tu propio DatabaseIdProvider implementando la interfaz <code>org.apache.ibatis.mapping.DatabaseIdProvider</code> |
| 1954 | + y registrandolo en el fichero mybatis-config.xml: |
| 1955 | + </p> |
1956 | 1956 |
|
1957 | 1957 | <source><![CDATA[public interface DatabaseIdProvider {
|
1958 | 1958 | default void setProperties(Properties p) { // Since 3.5.2, change to default method
|
|
0 commit comments