SlideShare una empresa de Scribd logo
1 de 27
Autentia

MyBatis como alternativa a Hibernate
Rubén Aguilera Díaz-Heredero @raguilera82
¿Quién soy yo?
●

●

●

Consultor Senior en
Autentia.
10 años en este
mundillo.
Aprendiz
permanente, maestro
ocasional.
¿Dónde trabajo?

●

Por compartir todo lo que
sabemos. Gestionamos
conocimiento interno
públicamente:
–

Sin comerciales

–

AdictosAlTrabajo.com

–

< 25 personas.

–

> 10 años.

–

> 1.300 Tutoriales.

–

> 24 MM descargas.
¿Cómo trabajo?
Mybatis

●

Es un framework de persistencia disponible para Java y .NET.

●

No se trata de un ORM.

●

Mapea sentencias SQL con objetos Java a través de interfaces
definidas en XML o con anotaciones.

●

Se integra con Spring y Maven.

●

Cache declarativa.

●

Previene el témido SQL Inyection y no nos tenemos que
preocupar de las conexiones.
Mybatis vs Hibernate vs JDBC
●

●

●

●

●

Ahorramos un 95% de código con respecto a JDBC ya que el
mapeo de objetos se puede inferir.
Hibernate tiene una fuerte curva de aprendizaje y su
funcionamiento no es natural.
Con Hibernate perdemos el control de las sentencias que
realmente se están ejecutando, hace magia.
Hibernate generalmente no se utiliza adecuádamente y no se
adapta bien a base de datos impuestas.
Mybatis ahorra mucho código, no es complejo, mantiene un
control total y trae cache por defecto.
SQLMapConfig.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
<mapper resource="org/mybatis/example/TutoMapper.xml"/>
</mappers>
</configuration>
Código de ejemplo
String resource = "SQLMapConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
Utilizándolo con Maven y Spring

●

Añadir al menos estas dependencias a nuestro proyecto.
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.2.3</version>
</dependency>
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis-spring</artifactid>
<version>1.2.1</version>
</dependency>
Utilizándolo con Maven y Spring
●

Añadimos un datasource a nuestro applicationContext.

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql:tutoriales" />
<property name="username" value="postgres" />
<property name="password" value="autentia" />
</bean>
●

Añadimos también un transaction manager.
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
Utilizándolo con Maven y Spring

●

Creamos un SQLSessionFactory donde indicamos la
localización de los mappers.xml y el datasource.
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations"
value="classpath*:mappers/*.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
Utilizándolo con Maven y Spring
●

El siguiente bean nos ahorra tener que crear un bean por cada
mapper que queramos declarar.
<bean class="org.mybatis.spring.annotation.MapperScannerPostProcessor">
<property name="basePackage" value="com.autentia.dao" />
</bean>

●

En caso contrario, esta declaración por cada mapper:

<bean id="tutorialMapper"
class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface"
value="com.autentia.dao.TutorialMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
Utilizándolo con Maven y Spring

●

Creamos la interfaz con los métodos necesarios.
package com.autentia.dao;
import org.springframework.stereotype.Repository;
import com.autentia.model.Tutorial;
public interface TutorialesMapper {
public Tutorial getById(Integer idTutorial);
public List<Tutorial> getByCategoriaValoracion(@Param(“categoria”)
String categoria, @Param(“valoracion) Integer valoracion);
}
Utilizándolo con Maven y Spring

●

Creamos el mapper que implementa la interfaz.
<mapper namespace="com.autentia.dao.TutorialesMapper">
<resultMap type="com.autentia.model.Tutorial" id="tutorialResult">
<id column="id_tutorial" property="idTutorial" javaType="int"/>
<result column="titulo" property="titulo" javaType="string"/>
<result column="categoria" property="categoria" javaType="string"/>
<result column="valoracion" property="valoracion" javaType="int"/>
</resultMap>
<select id="getById" parameterType="int" resultMap="tutorialResult">
<!--[resultType="com.autentia.model.Tutorial"] (modelo == tabla) -->
select id_tutorial, titulo, categoria, valoracion from
tutoriales where id_tutorial = #{id_tutorial}
</select>
</mapper>
Utilizándolo con Maven y Spring
Creamos un test para probarlo.

●

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/applicationContext.xml"})
public class TutorialesMapperTest {
@Resource
private TutorialesMapper tutorialesMapper;

}

@Test
public void shouldGetTutorialById() {
Long idTutorial = 1L;
Tutorial tutorial = tutorialesMapper.getById(idTutorial);
assertNotNull(tutorial);
}
Operaciones básicas

●

Insert
<insert id="insert" parameterType="com.autentia.model.Tutorial">
<selectKey keyProperty="idTutorial" resultType="int" order="BEFORE">
SELECT nextval('seq_id_tutorial')
</selectKey>
insert into tutoriales (id_tutorial, titulo, categoria, valoracion)
values (#{idTutorial}, #{titulo}, #{categoria}, #{valoracion})
</insert>
Operaciones básicas

●

Update
<update id="update" parameterType="com.autentia.model.Tutorial">
update tutoriales
set titulo = #{titulo},
categoria = #{categoria},
valoracion = #{valoracion}
where id_tutorial = #{idTutorial}
</update>
Operaciones básicas

●

Delete
<delete id="delete" parameterType="int">
delete from tutoriales where id_tutorial = #{idTutorial}
</delete>
Técnicas básicas en los mappers

●

Paso de N parámetros
public List<Tutorial> getByCategoriaValoracion(@Param(“categoria”)
String categoria, @Param(“valoracion) Integer valoracion);
public List<Tutorial> getByCategoriaValoracion(Map datos);
<select id="getByCategoriaValoracion"
parameterType="map" resultMap="tutorialResult">
<!-- La sentencia que sea-->
</select>
Técnicas básicas en los mappers

●

Reutilización de código SQL.
<sql id="selectTutoriales">
select id_tutorial, titulo, categoria, valoracion
from tutoriales
</sql>
<select id="getById" parameterType="int" resultMap="tutorialResult">
<include refid="selectTutoriales"/>
where id_tutorial = #{id_tutorial}
</select>
Técnicas básicas en los mappers

●

Añadimos cache
<cache/>

●

●

Esta declaración por defecto cachea todas las sentencias
SELECT y hace que se vacíe para las sentencias INSERT,
DELETE y UPDATE.
También se puede asociar con otros gestores de cache como
osCache, ehCache o con uno propio.
Técnicas básicas en los mappers

●

Sustitución de cadenas
SELECT * FROM tutoriales ORDER BY ${column}

●

●

En ocasiones nos interesa pasar una parámetro como cadena y
que Mybatis no lo convierta en un ? del PreparedStatement.
¡Cuidado! Aquí si que podemos estar incurriendo en el témido
SQL inyection.
Técnicas básicas en los mappers

●

Llamadas a procedimientos almacenados

●

Para el caso de Oracle
<select id="callGetTotalCityStateId" parameterType="pojo"
statementType="CALLABLE">
statementType="CALLABLE"
{ CALL getTotalCityStateId(
#{stateId, mode=IN, jdbcType=INTEGER},
#{total, mode=OUT, jdbcType=INTEGER})}
</select>

●

Para el caso de PostgreSQL
<select id="sumar" parameterType="map" resultType="int">
SELECT * FROM sumar(#{a},#{b});
</select>
Técnicas básicas en los mappers

●

SQL dinámicas
<select id="getByCategoriaValoracion"
parameterType="map" resultMap="tutorialResult">
<include refid="selectTutoriales"/>
<where>
<if test="categoria != null">
categoria = #{categoria}
</if>
<if test="valoracion != null">
AND valoracion = #{valoracion}
</if>
</where>
</select>
Técnicas básicas en los mappers

●

Mapeo con relación 1 a N (Lado del 1)
<resultMap type="com.autentia.model.Tutorial" id="tutorialResult">
<id column="id_tutorial" property="idTutorial" javaType="int"/>
<result column="titulo" property="titulo" javaType="string"/>
<result column="categoria" property="categoria" javaType="string"/>
<result column="valoracion" property="valoracion" javaType="int"/>
<association property="autor" column="id_autor"
resultMap="com.autentia.dao.AutoresMapper.autorResult"/>
</resultMap>
Técnicas básicas en los mappers

●

Mapeo con relación 1 a N (Lado del N)
<resultMap type="com.autentia.model.Autor" id="autorResultS">
<id column="id_autor" property="idAutor" javaType="int"/>
<result column="nombre" property="nombre" javaType="string"/>
<result column="apellidos" property="apellidos" javaType="string"/>
<collection property="tutoriales" javaType="ArrayList"
ofType="com.autentia.model.Tutorial" column="id_tutorial"
resultMap="com.autentia.dao.TutorialesMapper.tutorialResult"/>
resultMap="com.autentia.dao.TutorialesMapper.tutorialResult"
</resultMap>
Time to Demo

●

https://github.com/raguilera82/demo-mybatis

Más contenido relacionado

La actualidad más candente

Bacula Overview
Bacula OverviewBacula Overview
Bacula Overviewsambismo
 
Best practices for optimizing Red Hat platforms for large scale datacenter de...
Best practices for optimizing Red Hat platforms for large scale datacenter de...Best practices for optimizing Red Hat platforms for large scale datacenter de...
Best practices for optimizing Red Hat platforms for large scale datacenter de...Jeremy Eder
 
Patroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easyPatroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easyAlexander Kukushkin
 
Fortinet FortiOS 5 Presentation
Fortinet FortiOS 5 PresentationFortinet FortiOS 5 Presentation
Fortinet FortiOS 5 PresentationNCS Computech Ltd.
 
Zookeeper vs Raft: Stateful distributed coordination with HA and Fault Tolerance
Zookeeper vs Raft: Stateful distributed coordination with HA and Fault ToleranceZookeeper vs Raft: Stateful distributed coordination with HA and Fault Tolerance
Zookeeper vs Raft: Stateful distributed coordination with HA and Fault ToleranceAlluxio, Inc.
 
Using Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfileUsing Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfileRainer Gerhards
 
NetApp Se training storage grid webscale technical overview
NetApp Se training   storage grid webscale technical overviewNetApp Se training   storage grid webscale technical overview
NetApp Se training storage grid webscale technical overviewsolarisyougood
 
Patroni: Kubernetes-native PostgreSQL companion
Patroni: Kubernetes-native PostgreSQL companionPatroni: Kubernetes-native PostgreSQL companion
Patroni: Kubernetes-native PostgreSQL companionAlexander Kukushkin
 
MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...
MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...
MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...MITRE - ATT&CKcon
 
Security Best Practices for your Postgres Deployment
Security Best Practices for your Postgres DeploymentSecurity Best Practices for your Postgres Deployment
Security Best Practices for your Postgres DeploymentPGConf APAC
 
Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...
Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...
Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...SindhuVasireddy1
 
Storage Technology Overview
Storage Technology OverviewStorage Technology Overview
Storage Technology Overviewnomathjobs
 
[오픈소스컨설팅] ARM & OpenStack Community
[오픈소스컨설팅] ARM & OpenStack Community[오픈소스컨설팅] ARM & OpenStack Community
[오픈소스컨설팅] ARM & OpenStack CommunityOpen Source Consulting
 

La actualidad más candente (16)

Bacula Overview
Bacula OverviewBacula Overview
Bacula Overview
 
Best practices for optimizing Red Hat platforms for large scale datacenter de...
Best practices for optimizing Red Hat platforms for large scale datacenter de...Best practices for optimizing Red Hat platforms for large scale datacenter de...
Best practices for optimizing Red Hat platforms for large scale datacenter de...
 
Patroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easyPatroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easy
 
Layer 2 Scaling Solutions
Layer 2 Scaling SolutionsLayer 2 Scaling Solutions
Layer 2 Scaling Solutions
 
Fortinet FortiOS 5 Presentation
Fortinet FortiOS 5 PresentationFortinet FortiOS 5 Presentation
Fortinet FortiOS 5 Presentation
 
Zookeeper vs Raft: Stateful distributed coordination with HA and Fault Tolerance
Zookeeper vs Raft: Stateful distributed coordination with HA and Fault ToleranceZookeeper vs Raft: Stateful distributed coordination with HA and Fault Tolerance
Zookeeper vs Raft: Stateful distributed coordination with HA and Fault Tolerance
 
Using Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfileUsing Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfile
 
NetApp Se training storage grid webscale technical overview
NetApp Se training   storage grid webscale technical overviewNetApp Se training   storage grid webscale technical overview
NetApp Se training storage grid webscale technical overview
 
Patroni: Kubernetes-native PostgreSQL companion
Patroni: Kubernetes-native PostgreSQL companionPatroni: Kubernetes-native PostgreSQL companion
Patroni: Kubernetes-native PostgreSQL companion
 
MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...
MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...
MITRE ATT&CKcon 2.0: Prioritizing Data Sources for Minimum Viable Detection; ...
 
A plenarily integrated SIEM solution and it’s Deployment
A plenarily integrated SIEM solution and it’s DeploymentA plenarily integrated SIEM solution and it’s Deployment
A plenarily integrated SIEM solution and it’s Deployment
 
Security Best Practices for your Postgres Deployment
Security Best Practices for your Postgres DeploymentSecurity Best Practices for your Postgres Deployment
Security Best Practices for your Postgres Deployment
 
Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...
Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...
Designing Data-Intensive Applications_ The Big Ideas Behind Reliable, Scalabl...
 
Storage Technology Overview
Storage Technology OverviewStorage Technology Overview
Storage Technology Overview
 
[오픈소스컨설팅] ARM & OpenStack Community
[오픈소스컨설팅] ARM & OpenStack Community[오픈소스컨설팅] ARM & OpenStack Community
[오픈소스컨설팅] ARM & OpenStack Community
 
OPSEC for Families
OPSEC for FamiliesOPSEC for Families
OPSEC for Families
 

Similar a MyBatis como alternativa a Hibernate

Similar a MyBatis como alternativa a Hibernate (20)

Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
 
Jyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datosJyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datos
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Procedimientos almacenados en MySQL
Procedimientos almacenados en MySQLProcedimientos almacenados en MySQL
Procedimientos almacenados en MySQL
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Metadata api en apex
Metadata api en apexMetadata api en apex
Metadata api en apex
 
Jdbc
JdbcJdbc
Jdbc
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
JAVA CON BASE DE DATOS
JAVA CON  BASE DE DATOSJAVA CON  BASE DE DATOS
JAVA CON BASE DE DATOS
 
Cursos web
Cursos webCursos web
Cursos web
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
06. jsf (java server faces) (1)
06. jsf (java server faces) (1)06. jsf (java server faces) (1)
06. jsf (java server faces) (1)
 
Conceptos basicos en CakePHP
Conceptos basicos en CakePHPConceptos basicos en CakePHP
Conceptos basicos en CakePHP
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 

Último

Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosJhonJairoRodriguezCe
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 

Último (10)

Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 

MyBatis como alternativa a Hibernate

  • 1. Autentia MyBatis como alternativa a Hibernate Rubén Aguilera Díaz-Heredero @raguilera82
  • 2. ¿Quién soy yo? ● ● ● Consultor Senior en Autentia. 10 años en este mundillo. Aprendiz permanente, maestro ocasional.
  • 3. ¿Dónde trabajo? ● Por compartir todo lo que sabemos. Gestionamos conocimiento interno públicamente: – Sin comerciales – AdictosAlTrabajo.com – < 25 personas. – > 10 años. – > 1.300 Tutoriales. – > 24 MM descargas.
  • 5. Mybatis ● Es un framework de persistencia disponible para Java y .NET. ● No se trata de un ORM. ● Mapea sentencias SQL con objetos Java a través de interfaces definidas en XML o con anotaciones. ● Se integra con Spring y Maven. ● Cache declarativa. ● Previene el témido SQL Inyection y no nos tenemos que preocupar de las conexiones.
  • 6. Mybatis vs Hibernate vs JDBC ● ● ● ● ● Ahorramos un 95% de código con respecto a JDBC ya que el mapeo de objetos se puede inferir. Hibernate tiene una fuerte curva de aprendizaje y su funcionamiento no es natural. Con Hibernate perdemos el control de las sentencias que realmente se están ejecutando, hace magia. Hibernate generalmente no se utiliza adecuádamente y no se adapta bien a base de datos impuestas. Mybatis ahorra mucho código, no es complejo, mantiene un control total y trae cache por defecto.
  • 7. SQLMapConfig.xml <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> <mapper resource="org/mybatis/example/TutoMapper.xml"/> </mappers> </configuration>
  • 8. Código de ejemplo String resource = "SQLMapConfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); } finally { session.close(); } <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" parameterType="int" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>
  • 9. Utilizándolo con Maven y Spring ● Añadir al menos estas dependencias a nuestro proyecto. <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis</artifactid> <version>3.2.3</version> </dependency> <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis-spring</artifactid> <version>1.2.1</version> </dependency>
  • 10. Utilizándolo con Maven y Spring ● Añadimos un datasource a nuestro applicationContext. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql:tutoriales" /> <property name="username" value="postgres" /> <property name="password" value="autentia" /> </bean> ● Añadimos también un transaction manager. <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
  • 11. Utilizándolo con Maven y Spring ● Creamos un SQLSessionFactory donde indicamos la localización de los mappers.xml y el datasource. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="mapperLocations" value="classpath*:mappers/*.xml" /> <property name="dataSource" ref="dataSource" /> </bean>
  • 12. Utilizándolo con Maven y Spring ● El siguiente bean nos ahorra tener que crear un bean por cada mapper que queramos declarar. <bean class="org.mybatis.spring.annotation.MapperScannerPostProcessor"> <property name="basePackage" value="com.autentia.dao" /> </bean> ● En caso contrario, esta declaración por cada mapper: <bean id="tutorialMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.autentia.dao.TutorialMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
  • 13. Utilizándolo con Maven y Spring ● Creamos la interfaz con los métodos necesarios. package com.autentia.dao; import org.springframework.stereotype.Repository; import com.autentia.model.Tutorial; public interface TutorialesMapper { public Tutorial getById(Integer idTutorial); public List<Tutorial> getByCategoriaValoracion(@Param(“categoria”) String categoria, @Param(“valoracion) Integer valoracion); }
  • 14. Utilizándolo con Maven y Spring ● Creamos el mapper que implementa la interfaz. <mapper namespace="com.autentia.dao.TutorialesMapper"> <resultMap type="com.autentia.model.Tutorial" id="tutorialResult"> <id column="id_tutorial" property="idTutorial" javaType="int"/> <result column="titulo" property="titulo" javaType="string"/> <result column="categoria" property="categoria" javaType="string"/> <result column="valoracion" property="valoracion" javaType="int"/> </resultMap> <select id="getById" parameterType="int" resultMap="tutorialResult"> <!--[resultType="com.autentia.model.Tutorial"] (modelo == tabla) --> select id_tutorial, titulo, categoria, valoracion from tutoriales where id_tutorial = #{id_tutorial} </select> </mapper>
  • 15. Utilizándolo con Maven y Spring Creamos un test para probarlo. ● @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:/applicationContext.xml"}) public class TutorialesMapperTest { @Resource private TutorialesMapper tutorialesMapper; } @Test public void shouldGetTutorialById() { Long idTutorial = 1L; Tutorial tutorial = tutorialesMapper.getById(idTutorial); assertNotNull(tutorial); }
  • 16. Operaciones básicas ● Insert <insert id="insert" parameterType="com.autentia.model.Tutorial"> <selectKey keyProperty="idTutorial" resultType="int" order="BEFORE"> SELECT nextval('seq_id_tutorial') </selectKey> insert into tutoriales (id_tutorial, titulo, categoria, valoracion) values (#{idTutorial}, #{titulo}, #{categoria}, #{valoracion}) </insert>
  • 17. Operaciones básicas ● Update <update id="update" parameterType="com.autentia.model.Tutorial"> update tutoriales set titulo = #{titulo}, categoria = #{categoria}, valoracion = #{valoracion} where id_tutorial = #{idTutorial} </update>
  • 18. Operaciones básicas ● Delete <delete id="delete" parameterType="int"> delete from tutoriales where id_tutorial = #{idTutorial} </delete>
  • 19. Técnicas básicas en los mappers ● Paso de N parámetros public List<Tutorial> getByCategoriaValoracion(@Param(“categoria”) String categoria, @Param(“valoracion) Integer valoracion); public List<Tutorial> getByCategoriaValoracion(Map datos); <select id="getByCategoriaValoracion" parameterType="map" resultMap="tutorialResult"> <!-- La sentencia que sea--> </select>
  • 20. Técnicas básicas en los mappers ● Reutilización de código SQL. <sql id="selectTutoriales"> select id_tutorial, titulo, categoria, valoracion from tutoriales </sql> <select id="getById" parameterType="int" resultMap="tutorialResult"> <include refid="selectTutoriales"/> where id_tutorial = #{id_tutorial} </select>
  • 21. Técnicas básicas en los mappers ● Añadimos cache <cache/> ● ● Esta declaración por defecto cachea todas las sentencias SELECT y hace que se vacíe para las sentencias INSERT, DELETE y UPDATE. También se puede asociar con otros gestores de cache como osCache, ehCache o con uno propio.
  • 22. Técnicas básicas en los mappers ● Sustitución de cadenas SELECT * FROM tutoriales ORDER BY ${column} ● ● En ocasiones nos interesa pasar una parámetro como cadena y que Mybatis no lo convierta en un ? del PreparedStatement. ¡Cuidado! Aquí si que podemos estar incurriendo en el témido SQL inyection.
  • 23. Técnicas básicas en los mappers ● Llamadas a procedimientos almacenados ● Para el caso de Oracle <select id="callGetTotalCityStateId" parameterType="pojo" statementType="CALLABLE"> statementType="CALLABLE" { CALL getTotalCityStateId( #{stateId, mode=IN, jdbcType=INTEGER}, #{total, mode=OUT, jdbcType=INTEGER})} </select> ● Para el caso de PostgreSQL <select id="sumar" parameterType="map" resultType="int"> SELECT * FROM sumar(#{a},#{b}); </select>
  • 24. Técnicas básicas en los mappers ● SQL dinámicas <select id="getByCategoriaValoracion" parameterType="map" resultMap="tutorialResult"> <include refid="selectTutoriales"/> <where> <if test="categoria != null"> categoria = #{categoria} </if> <if test="valoracion != null"> AND valoracion = #{valoracion} </if> </where> </select>
  • 25. Técnicas básicas en los mappers ● Mapeo con relación 1 a N (Lado del 1) <resultMap type="com.autentia.model.Tutorial" id="tutorialResult"> <id column="id_tutorial" property="idTutorial" javaType="int"/> <result column="titulo" property="titulo" javaType="string"/> <result column="categoria" property="categoria" javaType="string"/> <result column="valoracion" property="valoracion" javaType="int"/> <association property="autor" column="id_autor" resultMap="com.autentia.dao.AutoresMapper.autorResult"/> </resultMap>
  • 26. Técnicas básicas en los mappers ● Mapeo con relación 1 a N (Lado del N) <resultMap type="com.autentia.model.Autor" id="autorResultS"> <id column="id_autor" property="idAutor" javaType="int"/> <result column="nombre" property="nombre" javaType="string"/> <result column="apellidos" property="apellidos" javaType="string"/> <collection property="tutoriales" javaType="ArrayList" ofType="com.autentia.model.Tutorial" column="id_tutorial" resultMap="com.autentia.dao.TutorialesMapper.tutorialResult"/> resultMap="com.autentia.dao.TutorialesMapper.tutorialResult" </resultMap>

Notas del editor

  1. {}