MyBatis como alternativa a Hibernate

download MyBatis como alternativa a Hibernate

If you can't read please download the document

description

Son las transparencias que utilicé para el evento Codemotion 2013.

Transcript of MyBatis como alternativa a Hibernate

  • 1. AutentiaMyBatis como alternativa a Hibernate Rubn Aguilera Daz-Heredero @raguilera82

2. Quin soy yo? Consultor Senior en Autentia. 10 aos en este mundillo. Aprendiz permanente, maestro ocasional. 3. Dnde trabajo?Por compartir todo lo que sabemos. Gestionamos conocimiento interno pblicamente: Sin comercialesAdictosAlTrabajo.com< 25 personas.> 10 aos.> 1.300 Tutoriales.> 24 MM descargas. 4. Cmo trabajo? 5. MybatisEs un framework de persistencia disponible para Java y .NET.No se trata de un ORM.Mapea sentencias SQL con objetos Java a travs de interfaces definidas en XML o con anotaciones.Se integra con Spring y Maven.Cache declarativa.Previene el tmido SQL Inyection y no nos tenemos que preocupar de las conexiones. 6. Mybatis vs Hibernate vs JDBC Ahorramos un 95% de cdigo 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 estn ejecutando, hace magia. Hibernate generalmente no se utiliza adecudamente y no se adapta bien a base de datos impuestas. Mybatis ahorra mucho cdigo, no es complejo, mantiene un control total y trae cache por defecto. 7. SQLMapConfig.xml 8. Cdigo 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(); } select * from Blog where id = #{id} 9. Utilizndolo con Maven y SpringAadir al menos estas dependencias a nuestro proyecto. org.mybatismybatis3.2.3org.mybatismybatis-spring1.2.1 10. Utilizndolo con Maven y Spring Aadimos un datasource a nuestro applicationContext. Aadimos tambin un transaction manager. 11. Utilizndolo con Maven y SpringCreamos un SQLSessionFactory donde indicamos la localizacin de los mappers.xml y el datasource. 12. Utilizndolo con Maven y Spring El siguiente bean nos ahorra tener que crear un bean por cada mapper que queramos declarar. En caso contrario, esta declaracin por cada mapper: 13. Utilizndolo con Maven y SpringCreamos la interfaz con los mtodos 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 getByCategoriaValoracion(@Param(categoria) String categoria, @Param(valoracion) Integer valoracion); } 14. Utilizndolo con Maven y SpringCreamos el mapper que implementa la interfaz. select id_tutorial, titulo, categoria, valoracion from tutoriales where id_tutorial = #{id_tutorial} 15. Utilizndolo 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 bsicasInsert SELECT nextval('seq_id_tutorial') insert into tutoriales (id_tutorial, titulo, categoria, valoracion) values (#{idTutorial}, #{titulo}, #{categoria}, #{valoracion}) 17. Operaciones bsicasUpdate update tutoriales set titulo = #{titulo}, categoria = #{categoria}, valoracion = #{valoracion} where id_tutorial = #{idTutorial} 18. Operaciones bsicasDelete delete from tutoriales where id_tutorial = #{idTutorial} 19. Tcnicas bsicas en los mappersPaso de N parmetros public List getByCategoriaValoracion(@Param(categoria) String categoria, @Param(valoracion) Integer valoracion); public List getByCategoriaValoracion(Map datos); 20. Tcnicas bsicas en los mappersReutilizacin de cdigo SQL. select id_tutorial, titulo, categoria, valoracion from tutoriales where id_tutorial = #{id_tutorial} 21. Tcnicas bsicas en los mappersAadimos cache Esta declaracin por defecto cachea todas las sentencias SELECT y hace que se vace para las sentencias INSERT, DELETE y UPDATE. Tambin se puede asociar con otros gestores de cache como osCache, ehCache o con uno propio. 22. Tcnicas bsicas en los mappersSustitucin de cadenas SELECT * FROM tutoriales ORDER BY ${column}En ocasiones nos interesa pasar una parmetro como cadena y que Mybatis no lo convierta en un ? del PreparedStatement. Cuidado! Aqu si que podemos estar incurriendo en el tmido SQL inyection. 23. Tcnicas bsicas en los mappersLlamadas a procedimientos almacenadosPara el caso de Oracle statementType="CALLABLE" { CALL getTotalCityStateId( #{stateId, mode=IN, jdbcType=INTEGER}, #{total, mode=OUT, jdbcType=INTEGER})} Para el caso de PostgreSQL SELECT * FROM sumar(#{a},#{b}); 24. Tcnicas bsicas en los mappersSQL dinmicas categoria = #{categoria} AND valoracion = #{valoracion} 25. Tcnicas bsicas en los mappersMapeo con relacin 1 a N (Lado del 1) 26. Tcnicas bsicas en los mappersMapeo con relacin 1 a N (Lado del N) resultMap="com.autentia.dao.TutorialesMapper.tutorialResult" 27. Time to Demohttps://github.com/raguilera82/demo-mybatis