From de3618b8f381c9c2d5d12500155490a9fad33a2b Mon Sep 17 00:00:00 2001 From: Gustavo Martin Morcuende Date: Mon, 26 Aug 2013 21:18:58 +0200 Subject: [PATCH] Messing around with MyBatis. --- MyBatis/README.txt | 6 + MyBatis/createdatabase.sh | 9 ++ MyBatis/pom.xml | 101 ++++++++++++++ .../src/main/java/de/example/ibatis/TestMain.java | 147 +++++++++++++++++++++ .../main/resources/generator/generatorConfig.xml | 54 ++++++++ 5 files changed, 317 insertions(+) create mode 100644 MyBatis/README.txt create mode 100755 MyBatis/createdatabase.sh create mode 100644 MyBatis/pom.xml create mode 100644 MyBatis/src/main/java/de/example/ibatis/TestMain.java create mode 100644 MyBatis/src/main/resources/generator/generatorConfig.xml diff --git a/MyBatis/README.txt b/MyBatis/README.txt new file mode 100644 index 0000000..8291f62 --- /dev/null +++ b/MyBatis/README.txt @@ -0,0 +1,6 @@ +export M2_HOME=/opt/maven/apache-maven-2.2.1 +PATH=$M2_HOME/bin:$PATH + +mvn clean install -Dmaven.test.skip=true +mvn dependency:sources +mvn dependency:resolve -Dclassifier=javadoc diff --git a/MyBatis/createdatabase.sh b/MyBatis/createdatabase.sh new file mode 100755 index 0000000..ef2bb57 --- /dev/null +++ b/MyBatis/createdatabase.sh @@ -0,0 +1,9 @@ +#!/bin/bash +mysql -uroot -proot -e "CREATE DATABASE mybatis_example DEFAULT CHARACTER SET utf8" + +mysql -uroot -proot -e "USE mybatis_example; CREATE TABLE ad (id SERIAL, company_id BIGINT, company_categ_id BIGINT, ad_gps BLOB, ad_mobile_image varchar(255), created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB, DEFAULT CHARSET=utf8, COLLATE=utf8_unicode_ci" + +# Por alguna extraña razon no pude poner el id de esta tabla como serial y no tiene ahora este id autoincrement +# Daba un error raro diciendo que no podia haber 2 claves con autoincrement en la misma tabla. Pero sí se puede... +# debo estar haciendo algo mal... :( +mysql -uroot -proot -e "USE mybatis_example; CREATE TABLE ad_description (id BIGINT(20) UNSIGNED NOT NULL, laguage_id BIGINT NOT NULL, ad_id SERIAL NOT NULL, ad_name VARCHAR(255) NOT NULL, ad_description LONGTEXT, ad_mobile_text VARCHAR(500) NOT NULL, ad_link VARCHAR(3000) NOT NULL, PRIMARY KEY (id), INDEX(ad_id), FOREIGN KEY (ad_id) REFERENCES ad (id) ON DELETE CASCADE) ENGINE=InnoDB, DEFAULT CHARSET=utf8, COLLATE=utf8_unicode_ci" diff --git a/MyBatis/pom.xml b/MyBatis/pom.xml new file mode 100644 index 0000000..a38961e --- /dev/null +++ b/MyBatis/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + de.example.mybatis + mybatisexample + jar + 1.0-SNAPSHOT + mybatisexample + http://gumartinm.name + + ${project.build.directory}/generated-sources/mybatis-generator/ + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.6 + 1.6 + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + ${project.build.sourceEncoding} + + + + org.mybatis.generator + mybatis-generator-maven-plugin + 1.3.2 + + + Gnerate MyBatis Artifacts + + generate + + + + + ${basedir}/src/main/resources/generator/generatorConfig.xml + com.mysql.jdbc.Driver + root + jdbc:mysql://localhost:3306/mybatis_example + root + ${mybatis.generator.outputdirectory} + true + true + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.8 + + + add-source + generate-sources + + add-source + + + + ${mybatis.generator.outputdirectory} + + + + + + + + + + junit + junit + 3.8.1 + test + + + org.mybatis + mybatis + 3.2.2 + + + mysql + mysql-connector-java + 5.1.9 + + + log4j + log4j + 1.2.17 + + + diff --git a/MyBatis/src/main/java/de/example/ibatis/TestMain.java b/MyBatis/src/main/java/de/example/ibatis/TestMain.java new file mode 100644 index 0000000..4c2b11b --- /dev/null +++ b/MyBatis/src/main/java/de/example/ibatis/TestMain.java @@ -0,0 +1,147 @@ +package de.example.ibatis; + +import java.io.IOException; +import java.util.Date; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; + +import de.example.mybatis.model.Ad; +import de.example.mybatis.repository.mapper.AdMapper; + +//import de.example.ibatis.demo.dao.UserDao; +//import de.example.ibatis.demo.dao.UserDaoIbatis; +//import de.example.ibatis.dto.UserTEO; + +public class TestMain { + + public static void main(String[] args) throws IOException { + //Initialize dao + //UserDao manager = new UserDaoIbatis(); + +// File file = new File("sql-maps-config.xml"); +// FileInputStream fileInputStream = new FileInputStream(file); + // AL FINAL NO NECESITABA TODO ESTO DE FILECHANNEL Y BYTEBUFFERS xD se me fue la pinza :( + // al menos mira lo del FileChannel.size() porque es interesante recordarlo + // y saber que si el archivo puede cambiar el metodo FileChannel.size() no te vale :( + // y tendrias que usar algo como lo que hiciste en AxisC3 driver :) +// FileChannel fileChannel = fileInputStream.getChannel(); + + // FileChannel.size() internamente usa fstat64 recuperando st_size + // asi puede saber el tamaño del archivo antes de leerlo. Esto puede + // ser un problema si el archivo puede cambiar por alguna razon desconocida + // mientras lo estoy leyendo. + // ver: FileChannelImpl.c (la implementacion nativa de FileChannel) + // otra solucion es lo que hice para AxisC3, un array de byes mutable + // que se incrementa tanto como haga falta hasta que haya leido todos los bytes + // Por tanto si a priori no puedo saber el tamaño del archivo a leer deberia + // usar un array de bytes mutables cuyo tamaño puede incrementarse si hace falta + // como hice con el AxisC3 :) + + //fileInputStream.read(new byte[(int)fileChannel.size()]); <----- puedo leer tambien asi pero me apetece usar byte buffers + // de java.nio :) + + + //joer.size devuelve long!!!! hago casta int pierdo datos :( ¿solucion? +// ByteBuffer gus = ByteBuffer.allocate((int)fileChannel.size()); +// int result = 0; +// while (result != -1) { +// result = fileChannel.read(gus); +// } +// TestMain.class.getResourceAsStream("sql-maps-config.xml"); +// Reader reader = Resources.getResourceAsReader("sql-maps-config.xml"); + + // Desde el Javadoc de org.xml.sax.InputSource: +//

The SAX parser will use the InputSource object to determine how +// to read XML input. If there is a character stream available, the +// parser will read that stream directly, disregarding any text +// encoding declaration found in that stream. +// If there is no character stream, but there is +// a byte stream, the parser will use that byte stream, using the +// encoding specified in the InputSource or else (if no encoding is +// specified) autodetecting the character encoding using an algorithm +// such as the one in the XML specification. If neither a character +// stream nor a +// byte stream is available, the parser will attempt to open a URI +// connection to the resource identified by the system +// identifier.

+ + // LUEGO SI LE PASO UN FileInputStream/InputStream (no es un character stream) y no especifico el encoding + // se deberia autodetectar el encoding usando la especificacion XML (leyendo + // la cabecera del archivo xml) GUAY!!!! JUSTO LO QUE ME GUSTA :) +// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(fileInputStream); + + // JOER NO HACIA FALTA TANTO LIO PARA CONSEGUIR UN INPUTSTREAM. DE HECHO LA MEJOR + // FORMA ES HACERLO ASI SIEMPRE (con el getResourceAsStream) ASÍ NO DEPENDES + // DE PATHS ABSOLUTIOS NI NADA, TE SIRVE PARA .jars, O DIRECTORIOS FISICOS, LO QUE SEA QUE ESTE + // EN EL CLASSPATH: + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() + .build(/**TestMain.class.getResourceAsStream("sql-maps-config.xml")**/ + Resources.getResourceAsStream("mybatis-sql-maps-config.xml")); + SqlSession session = sqlSessionFactory.openSession(); + // EN MYBATIS HAY UNA FORMA MEJOR QUE ESTA +// try { +// Ad ad = session.selectOne("de.example.mybatis.model.Ad.selectByPrimaryKey", 101); +// } finally { +// session.close(); +// } + // ESTA FORMA ES MUCHO MEJOR :) + try { + AdMapper mapper = session.getMapper(AdMapper.class); + Ad adprueba = new Ad(); + adprueba.setCompanyCategId(200L); + adprueba.setCreatedAt(new Date()); + adprueba.setCompanyId(2L); + adprueba.setUpdatedAt(new Date()); + mapper.insert(adprueba); +// Ad ad = mapper.selectByPrimaryKey(1000L); + } finally { + session.close(); + } + + // De esa forma consigo que el encoding dependa del valor puesto en la cabecera del xml :) + +// SqlSession session = sqlSessionFactory.openSession(); +// try { +// Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); +// } finally { +// session.close(); +// } +// +// SqlSession session = sqlSessionFactory.openSession(); +// try { +// BlogMapper mapper = session.getMapper(BlogMapper.class); +// Blog blog = mapper.selectBlog(101); +// } finally { +// session.close(); +// } +// SqlMapClient sqlmapClient = SqlMapClientBuilder.buildSqlMapClient (reader); +// +// //Create a new user to persist +// UserTEO user = new UserTEO(); +// user.setId(1); +// user.setName("Demo User"); +// user.setPassword("password"); +// user.setEmail("demo-user@howtodoinjava.com"); +// user.setStatus(1); +// +// //Add the user +// manager.addUser(user,sqlmapClient); +// +// //Fetch the user detail +// UserTEO createdUser = manager.getUserById(4, sqlmapClient); +// System.out.println(createdUser.getEmail()); +// +// //Lets delete the user +// manager.deleteUserById(1, sqlmapClient); +// try { +// Thread.sleep(100000); +// } catch (InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } + } + +} diff --git a/MyBatis/src/main/resources/generator/generatorConfig.xml b/MyBatis/src/main/resources/generator/generatorConfig.xml new file mode 100644 index 0000000..946fd15 --- /dev/null +++ b/MyBatis/src/main/resources/generator/generatorConfig.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
-- 2.1.4