[iniciante] DAO + iBatis + JAR files

13 respostas
K

Olá, tudo bem?

Estou começando a aprender iBatis e DAO…

De acordo com as explicações do Developer Guide disponível no site do iBatis http://ibatis.apache.org/docs/java/pdf/iBATIS-SqlMaps-2_en.pdf, eu preciso dos seguintes JARs para compilar meu programa:

[list]ibatis-common-2.jar[/list]
[list]ibatis-sqlmap-2.jar[/list]
[list]ibatis-dao-2.jar[/list]

Mas parece que a documentação se refere ao iBatis 2.0… e a minha versão é o iBATIS for Java 2.3.0 General Availability.

No site mesmo fala que nessa nova versão não tem o JAR para o DAO:

“The Java DAO framework has been removed from iBATIS as of release 2.3.0. We heartily recommend that you consider using the Spring Framework for all your DAO needs! Spring offers great support for iBATIS.”

Ta bem. Dito isso, baixei o Spring Framework 2.0.6.

Mas tem milhões (!!!) de JARs dentro dele… e eu não sei quais são os necessários para rodar um aplicativo que tenha iBatis, DAO, SQL Maps…

Tem um monte… e dentre elas:

[list]spring-dao[/list]
[list]spring-ibatis[/list]
[list]spring-beans[/list]

Seriam essas? Quais são os acréscimos nas configurações utilizando esse Spring?

Obrigada pela atenção!

13 Respostas

P

Olá,

Para começar você pode utilizar o arquivo único spring.jar e, depois, para deixar o seu projeto mais leve, você pode substituí-lo pelos arquivos spring-dao.jar e spring-ibatis.jar. O Spring fornece templates para serem utilizados em conjunto com o iBatis.
Uma boa leitura que você pode fazer é: http://static.springframework.org/spring/docs/2.0.x/reference/orm.html.

Espero ter ajudado.

[]'s

W

Use o iBATIS 2.3.0
Use a documentação em PDF (=Developer Guide == 60 pgs.) que está na sua pasta descompactada, comece estudando os SQLMap e os mapeamentos SQL, depois estude os DAOs.


http://www.guj.com.br/posts/list/63850.java#335373

sds.

K

Olá,

obrigada pelas respostas!

Quero um exemplo que apenas implemente o básico para eu ter certeza que está tudo funcionando… de preferência um que integre iBatis e DAO…

Comecei a implementar o exemplo do tutorial http://people.apache.org/dist/ibatis/ibatis.java/docs/iBATIS-SqlMaps-2-Tutorial_en.pdf

mas acabei achando o seguinte: http://www.onjava.com/pub/a/onjava/2005/08/10/ibatisdao.html, que já implementa com DAO…

e tem esse também: http://www.devx.com/Java/Article/31481/0/page/1

Enfim, estou bastante perdida!! :frowning:

Meu trabalho é transformar um programa implementado em Hibernate com DAO em iBatis… Vocês sabem onde posso achar algum exemplo deste tipo?

Quais desses acima seria o mais completo? Obrigada…

agodinho

Olha, o iBatis tem uma abordagem bem diferente da do Hibernate.

Simplificando, o hibernate escreve as querys pra vc enquanto que o iBatis não. No iBatis você ira escrever todas suas querys (inserts, updates, deletes e chamadas pra pl) dentro de arquivos de configuração. Dentro desses mesmos arquivos você também escreverá “mappings” de TO para o banco - esses mappings são os trechos nos quais você diz quais campos do banco se relacionam com quais métodos do seu to.

Acho que pro trabalho que vc tem o artigo do devx não vai ajudar muito. Ele está falando de spring e vc, a princípio e simplificando, não vai precisar de spring.

O artigo do ibatis DAO está meio velhinho pois o iBatis DAO, até onde sei, foi descontinuado (o spring faz isso).

IMO, acho que vc pode se ater à documentação (pdf) original do sqlMap(ibatis). Você pode procurar por exemplos de código na web.

K

Mas para usar o DAO com iBatis, eu preciso de Spring, não?

No site do iBatis dizem que nessa nova versão do iBatis não tem o JAR para o DAO:

“The Java DAO framework has been removed from iBATIS as of release 2.3.0. We heartily recommend that you consider using the Spring Framework for all your DAO needs! Spring offers great support for iBATIS.”

Ou eu não usaria DAO na minha implementação com iBatis?
É o mesmo DAO, não é? O usado em Hibernate e o usado em iBatis?

agodinho

krolbg:
Ou eu não usaria DAO na minha implementação com iBatis?
É o mesmo DAO, não é? O usado em Hibernate e o usado em iBatis?

É o mesmo DAO sim. Vc pode escrever esses DAOs com ou sem o spring.
Você vai usar DAO normalmente com o ibatis, só que vc vai escrever esses caras. Eu aconselho sem o spring pois fazendo assim vc só terá dependência com o iBatis. O spring apenas te dá uma classe template pra esse DAO (que vc mesma pode escrever) pra que vc possa extendê-lo só que esses templates são pra java 5. Se você optar por ibatis puro vc poderá trabalhar com java 1.4.

Só a título de exemplo:

/**
 * <p align='justify'>
 * Classe DAO para manutenção da entidade Parametros.</p>
 * 
 * @author  Diversos/Anaximandro de Godinho.
 * @version $Revision: 1.14 $
 */
public class ParametroDAO extends AbstractDAO
{
   public List obterParametros() throws DAOException
   {
      try
      {
         return _sqlMap.queryForList( _obter_Parametros );
      }
      catch( final SQLException e )
      {
         throw new DAOException( e );
      }
   }

   public ParametroTO obterParametro( final Integer idParametro ) throws DAOException
   {
      try
      {
         return (ParametroTO) _sqlMap.queryForObject( _obter_Parametro, idParametro );
      }
      catch( final SQLException e )
      {
         throw new DAOException( e );
      }
   }

   public ParametroTO obterParametroPorNome( final String nomeParametro ) throws DAOException
   {
      try
      {
         return (ParametroTO) _sqlMap.queryForObject( _obter_ParametroPorNome, nomeParametro );
      }
      catch( final SQLException e )
      {
         throw new DAOException( e );
      }
   }

   public ParametroTO incluirParametro( final ParametroTO to ) throws DAOException
   {
      try
      {
         final Integer key = (Integer) _sqlMap.insert( _incluir_Parametro, to );
         to.setIdParametro( key );
         return to;
      }
      catch( final SQLException e )
      {
         throw new DAOException( e );
      }
   }

   public int alterarParametro( final ParametroTO to ) throws DAOException
   {
      try
      {
         return _sqlMap.update( _alterar_Parametro, to );
      }
      catch( final SQLException e )
      {
         throw new DAOException( e );
      }
   }

   public int excluirParametro( final Integer idParametro ) throws DAOException
   {
      try
      {
         return _sqlMap.delete( _excluir_Parametro, idParametro );
      }
      catch( final SQLException e )
      {
         throw new DAOException( e );
      }
   }

   /*/ constantes privadas /*/
   private static final String _namespace              = "Parametro.";
   private static final String _obter_Parametros       = _namespace + "obter_Parametros";
   private static final String _obter_Parametro        = _namespace + "obter_Parametro";
   private static final String _obter_ParametroPorNome = _namespace + "obter_ParametroPorNome";

   private static final String _incluir_Parametro      = _namespace + "incluir_Parametro";
   private static final String _alterar_Parametro      = _namespace + "alterar_Parametro";
   private static final String _excluir_Parametro      = _namespace + "excluir_Parametro";
}

O arquivo de configuração dessa classe:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE sqlMap PUBLIC 
"-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<!-- 
Author: Anaximandro de Godinho.
Versão: $Revision: 1.5 $
-->

<sqlMap namespace="Parametro">

	<!-- Alias do "Transfer Object" da entidade "Parametro" utilizado nos resultados. -->
	<typeAlias alias="ParametroTO" type="br.com.cvrd.igrm.to.ParametroTO" />

	<!-- Mapeamento do "Transfer Object" da entidade "Parametro". -->
	<resultMap id="ParametroResult" class="ParametroTO">
		<result property="idParametro"		column="FVQIDPAR" />
		<result property="nomeParametro"	column="FVQPNOME" />
		<result property="tipoParametro"	column="FVQQTDMC" />
		<result property="valorParametro"	column="FVQPDESC" />
	</resultMap>

	<sql id="_selectParametro">
		SELECT	FVQIDPAR,
			FVQPNOME,
			FVQQTDMC,
			FVQPDESC
		FROM	${DBALIAS}.FVQPARMT
	</sql>

	<select id="obter_Parametros" resultSetType="FORWARD_ONLY" fetchSize="50" resultMap="ParametroResult">
		<include refid="_selectParametro" />
		ORDER
		BY	FVQPNOME
	</select>

	<select id="obter_Parametro" resultSetType="FORWARD_ONLY" fetchSize="1" resultMap="ParametroResult" parameterClass="Integer">
		<include refid="_selectParametro" />
		WHERE	FVQIDPAR = #value#
	</select>

	<select id="obter_ParametroPorNome" resultSetType="FORWARD_ONLY" fetchSize="1" resultMap="ParametroResult" parameterClass="String">
		<include refid="_selectParametro" />
		WHERE	trim(FVQPNOME) = #value#
	</select>

	<insert id="incluir_Parametro" parameterClass="ParametroTO">
		<selectKey type="pre" resultClass="Integer" keyProperty="idParametro">
			SELECT ${DBALIAS}.FVQPARMT_S01.NextVal AS ID FROM DUAL
		</selectKey>
		INSERT
		INTO	${DBALIAS}.FVQPARMT(
			FVQIDPAR,
			FVQPNOME,
			FVQQTDMC,
			FVQPDESC
		) VALUES (
			#idParametro#,
			#nomeParametro#,
			#tipoParametro#,
			#valorParametro#
		)
	</insert>

	<update id="alterar_Parametro" parameterClass="ParametroTO">
		UPDATE	${DBALIAS}.FVQPARMT
		SET	FVQQTDMC = #tipoParametro#
		WHERE	FVQIDPAR = #idParametro#
	</update>

	<delete id="excluir_Parametro" parameterClass="Integer">
		DELETE	${DBALIAS}.FVQPARMT
		WHERE	FVQIDPAR = #value#
	</delete>

</sqlMap>

Perceba que o código é bem repetitivo.

Woody

K

entendi…

então o meu trabalho seria, em suma, mudar o mapeamento original do hibernate e as referências ao DAO relativas ao hibernate…

O meu AbstractDAO.java original é o seguinte:

agodinho

Isso.

Só uma dica: AbstractDAOImpl não é um bom nome, se é Impl não é abstract. E ainda, se essa classe estiver mapeando uma entidade em especial é sempre bom nomear a classe com o nome dessa entidade.

Se vc for utilizar EJB: Seus métodos getSessao e fechar sessão não deveriam mexer com transação, uma vez que o container controlará isso declarativamente.

Eu sempre deixo o gerenciamento de transação fora do meu DAO quando estou usando EJB.

K

Se vc for utilizar EJB: Seus métodos getSessao e fechar sessão não deveriam mexer com transação, uma vez que o container controlará isso declarativamente.

Eu sempre deixo o gerenciamento de transação fora do meu DAO quando estou usando EJB.

Não entendi muito bem… :confused:

agodinho

vc vai usar EJB?

W
A meu ver se vc. tem os DAOs, vc. tem a classe de negócios p/ acesso  ao seu SGBD. O que vai facilitar, o  problema de conceito é que vc. deve olhar/estudar as suas camadas de persistência e  criar um outro projeto "ajustando" os DAOs do ORM Hibernate para o SQLMaps do iBATIS que é um Framework que irá trabalhar com suas clausulas SQL .

O que posso te adiantar é que vc. me envie uma mensagem privada com seu e-mail que vou enviar um exempli de iBATIS compartilhando o DAOs c/ Hibernate e alguns materiais sobre SpringDAO que vai facilitar muita coisa para vc. junto ao iBATIS SQLmaps.

A

krolbg , prometo que no fim de semana post uns exemplos usando DAO e DAOGeneric.
Passe seu email pra o William, ele me enviou quando eu iniciei com Ibatis, valeu muito apena.

Dica para todos voces: Baixem o AppFuse e veja o DAO do mesmo usando Ibatis.
Existem 3 implementacoes. A DaoGeneric e DaoUtil são bastante produtiva, pois usa uma nomeclatura boa para os XMLs.

[]'s

K

Sim sim, passei meu email pro William e, realmente, está me ajudando muito!

krolbg , prometo que no fim de semana post uns exemplos usando DAO e DAOGeneric.
Passe seu email pra o William, ele me enviou quando eu iniciei com Ibatis, valeu muito apena.

ok, vou ficar esperando! =]

Criado 13 de julho de 2007
Ultima resposta 19 de jul. de 2007
Respostas 13
Participantes 5