`

ibatis初次使用心得!

阅读更多
前两天我一个朋友说,他们想改用ibatis开发,我想ibatis真的比hibernate还要好用吗?所以就抽时间简单写了一个测试项目,使用ibatis实现增删该查,翻页,觉得效果开可以,用起ibatis不是舒服,我想应该使用hibernate用习惯的缘故吧!今天就把我的使用心得给大家分享一下吧!有说的不对的地方望大家多多提出意见!
     首先ibatis和hibernate几乎是截然不同的,在ibatis里面是把dao层的方法和sql语句之间形成一个映射关系,好像封装了jdbc的预执行通道PreparedStatement。

下面是sql配置文件
<typeAlias alias="userInfo" type="com.md.ibates.pojo.UserInfo" />
	<!-- 查询单个用户 -->
	<select id="findUserInfo" parameterClass="string" resultClass="userInfo"  >
	<![CDATA[select *from usertable where userid=#userid#]]>
	</select>


下面是方法
public UserInfo getUserInfo(String userid) {
		try {
			return (UserInfo) this.queryForObject("findUserInfo", userid);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}


=#userid#其中userid对应的就是dao方法中的参数名字。
他们之间就这样对应起来的!一个方法一个sql配置详细可以看下面的例子


1.下面是ibatis的核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
    <!-- ibatis核心配置文件 -->
<sqlMapConfig>

	<!-- 
		cacheModelsEnabled   是否启用SqlMapClient上的缓存机制。 建议设为"true"
		enhancementEnabled   是否针对POJO启用字节码增强机getter/setter的调用效能,避免Reflect所带来的性能开销。同时,这也为Lazy Loading带来提升。 建议设为"true"
		errorTracingEnabled  是否启用错误日志,在开发期间建议设为"true" 以方便调试 
		lazyLoadingEnabled   是否启用延迟加载机制,建议设为"true" 
		maxRequests          最大并发请求数(Statement并发数) 
		maxTransactions      最大并发事务数 
		maxSessions          最大Session数。即当前最大允许的并发SqlMapClient数。 
		useStatementNamespaces  是否使用Statement命名空间。 
		注:这里的命名空间指的是映射文件中,sqlMap节的namespace属性,如在上例中针对t_use
		表的映射文件sqlMap节点: <sqlMap namespace="User"> 这里,指定了此sqlMap节点下定义的操作均属于"User"命名空间。 在useStatementNamespaces="true"的情况下,Statement调用需追加命名空间,如:sqlMap.update("User.updateUser",user); 
		否则直接通过Statement名称调用即可,如: sqlMap.update("updateUser",user); 但请注意此时需要保证所有映射文件中,Statement定义无重名。 
		
	-->
	<settings enhancementEnabled="true" lazyLoadingEnabled="true"
		errorTracingEnabled="true" maxRequests="32" maxSessions="10"
		maxTransactions="5" useStatementNamespaces="false" />
	<!-- 
		transactionManager节点定义了ibatis的事务管理器,目前提供了以下几种选择:
		type属性: 
		JDBC  通过传统JDBC Connection.commit/rollback实现事务支持。  
		JTA   使用容器提供的JTA服务实现全局事务管理。
		EXTERNAL  外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自
		动的事务管理机制。此时ibatis将把所有事务委托给外部容器进行管理。 
		
		dataSource  从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。
		type属性:dataSource节点的type属性指定了dataSource的实现类型。 可选项目: 
		
		SIMPLE: 是ibatis内置的dataSource实现,其中实现了一个简单的
		数据库连接池机制,对应 ibatis 实现类为
		com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。 
		
		DBCP:基于Apache DBCP连接池组件实现的DataSource封装,当无容器提
		供DataSource服务时,建议使用该选项,对应ibatis实现类为
		com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。 
		
		JNDI:使用J2EE容器提供的DataSource实现,DataSource将通过指定
		的JNDI Name从容器中获取。对应 ibatis实现类为
		com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。
		
		dataSource的子节点说明(SIMPLE&DBCP):
		JDBC.Driver    JDBC 驱动。 如:org.gjt.mm.mysql.Driver 
		JDBC.ConnectionURL  数据库URL。 如:jdbc:mysql://localhost/sample 
		如果用的是SQLServer JDBC Driver,需要在url后追加SelectMethod=Cursor以获得JDBC事务的多Statement支持。
		
		JDBC.Username 数据库用户名 
		JDBC.Password  数据库用户密码 
		Pool.MaximumActiveConnections 数据库连接池可维持的最大容量。 
		Pool.MaximumIdleConnections 数据库连接池中允许的挂起(idle)连接数。 
		
		JNDI由于大部分配置是在应用服务器中进行,因此ibatis中的配置相对简单分别使用JDBC和JTA事务管理的JDNI配置: 
		使用JDBC事务管理的JNDI DataSource配置 
		
		<transactionManager    type ="JDBC" >  
		<dataSource    type ="JNDI">  
		<property    name ="DataSource"     value ="java:comp/env/jdbc/myDataSource" />  
		</dataSource >  
		</transactionManager >  
		
		
		<transactionManager    type ="JTA"  >  
		<property    name ="UserTransaction"     value ="java:/ctx/con/UserTransaction" />  
		<dataSource    type ="JNDI" >  
		<property    name ="DataSource"     value ="java:comp/env/jdbc/myDataSource" />  
		</dataSource >   
		
	-->


	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
			<property name="JDBC.ConnectionURL"
				value="jdbc:mysql://localhost:3306/mydata" />
			<property name="JDBC.Username" value="root" />
			<property name="JDBC.Password" value="123456" />
			<property name="Pool.MaximumActiveConnections" value="10" />
			<property name="Pool.MaximumIdleConnections" value="5" />
			<property name="Pool.MaximumCheckoutTime" value="120000" />
			<property name="Pool.TimeToWait" value="500" />
			<property name="Pool.PingQuery"
				value="select 1 from ACCOUNT" />
			<property name="Pool.PingEnabled" value="false" />
			<property name="Pool.PingConnectionsOlderThan" value="1" />
			<property name="Pool.PingConnectionsNotUsedFor" value="1" />
		</dataSource>
	</transactionManager>

	<sqlMap resource="com/md/ibaties/daoImpl/maps/UserDaoImpl.xml" />

</sqlMapConfig>




2.下面是sql语句配置映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<!-- 查询单个用户dao方法对应sql配置 -->
<sqlMap>
	
	<typeAlias alias="userInfo" type="com.md.ibates.pojo.UserInfo" />
	<!-- 查询单个用户 -->
	<select id="findUserInfo" parameterClass="string" resultClass="userInfo"  >
	<![CDATA[select *from usertable where userid=#userid#]]>
	</select>
	
	
	<!-- 查询所有用户
	【当parammeterClass=java.util.ArrayList是如何取参数】
	 -->
	<select id="getAllUserInfo"  parameterClass="java.util.List" resultClass="userInfo"  >
	select *from usertable where userid not in 
	<iterate open="(" close=")" conjunction="," >
	#userids[]#
	</iterate>
	</select>
	
	
	
	<!-- 翻页查询用户
	【当parammeterClass=java.util.HashMap是如何取参数】
	
	 -->
	
	<select id="getAllUserInfoPage"    parameterClass="java.util.Map"  resultClass="userInfo" >
	<![CDATA[select *from usertable  where username like #nu# and address like #nf# ]]>
	</select>
	
	
	<!-- 删除用户 -->
	<delete id="deleteUserInfo" parameterClass="string">
	<![CDATA[delete from usertable where userid=#userid# ]]>
	</delete>
	
	
	<!-- 添加用户 -->
	<insert id="addUserInfo"  parameterClass="userinfo" >
	<![CDATA[ insert into usertable (userid,username,password,sex,age,birthday,address) values (#userid#,#username#,#password#,#sex#,#age#,#birthday#,#address#)]]>
	</insert>
	
	
	<!--修改用户 -->
	<insert id="updateUserInfo"  parameterClass="userinfo" >
	<![CDATA[ update usertable set username=#username#,password=#password#,sex=#sex#,age=#age#,birthday=#birthday#,address=#address# where userid=#userid#]]>
	</insert>
</sqlMap>

3.下面dao接口
package com.md.ibaties.dao;

import java.util.List;
import java.util.Map;

import com.md.ibates.pojo.UserInfo;

/**
 *用户dao实现接口
 * @author 马东
 * 2010-1-13
 * 转载请注明出处
 */

public interface UserDao {

	/**
	 * 获得单个用户
	 * @param userid
	 * @return
	 */
	public UserInfo getUserInfo(String userid);
	/**
	 * 获得一个用户集合
	 * @param userids
	 * @return
	 */
	public List<UserInfo> getAllUserInfo(List<String> userids );
	/**
	 * 删除一个用户
	 * @param userid
	 */
	public void deleteUserInfo(String userid);
	/**
	 * 添加一个用户
	 * @param userinfo
	 */
	public void addUserInfo(UserInfo userinfo);
	/**
	 * 修改用户
	 * @param userinfo
	 * @return
	 */
	public void updateUserInfo(UserInfo userinfo);
	/**
	 * 翻页查询
	 * @param currpage
	 * @param pageSize
	 * @param conds
	 * @return
	 */
	public List<UserInfo> getUserInfoPage(int currpage,int pageSize,Map<String,Object> conds);
}



4.下面是dao实现类
package com.md.ibaties.daoImpl;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
import com.md.ibates.pojo.UserInfo;
import com.md.ibaties.dao.UserDao;
/**
 *用户dao实现类
 * @author 马东
 * 2010-1-13
 * 转载请注明出处
 */
public class UserDaoImpl extends SqlMapClientImpl implements UserDao{
	
    
	public UserDaoImpl(SqlMapExecutorDelegate delegate) {
		super(delegate);
	}
   
	public UserInfo getUserInfo(String userid) {
		try {
			return (UserInfo) this.queryForObject("findUserInfo", userid);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public void  addUserInfo(UserInfo userinfo) {
		
		try {
			this.startTransaction();
			this.insert("addUserInfo", userinfo);
			this.commitTransaction();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				this.endTransaction();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public void deleteUserInfo(String userid) {
		
		try {
			this.startTransaction();
			this.delete("deleteUserInfo", userid);
			this.commitTransaction();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				this.endTransaction();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	
	public void updateUserInfo(UserInfo userinfo) {
		try {
			this.startTransaction();
			this.update("updateUserInfo", userinfo);
			this.commitTransaction();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				this.endTransaction();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	@SuppressWarnings("unchecked")
	public List<UserInfo> getAllUserInfo(List<String> userids ) {
		try {
			return (List<UserInfo>)this.queryForList("getAllUserInfo",userids);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<UserInfo> getUserInfoPage(int currpage, int pageSize, Map<String,Object> conds) {
	   try {
		return this.queryForList("getAllUserInfoPage", conds,(currpage-1)*pageSize, pageSize);
	} catch (SQLException e) {
		e.printStackTrace();
	}
		return null;
	}

	
	
}



5.测试类
package com.md.ibaties.test;





import java.io.Reader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.md.ibates.pojo.UserInfo;
import com.md.ibaties.dao.UserDao;
import com.md.ibaties.daoImpl.UserDaoImpl;


/**
 * 测试类
 * @author 马东
 * 2010-1-13
 * 转载请注明出处
 */
public class Demo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String  resource="SqlMapConfig.xml";
		SqlMapClientImpl sqlMap =null;
		Reader reader;
		try {
			reader = Resources.getResourceAsReader(resource);
			 sqlMap   =(SqlMapClientImpl)SqlMapClientBuilder.buildSqlMapClient(reader); 
			UserDao user=new UserDaoImpl(sqlMap.delegate);
		
			//测试获得单个用户
			UserInfo  userinfo=user.getUserInfo("1");
			System.out.println("-----测试单个用户查询-----");
			System.out.println(userinfo+"\n");
			
			
			
			
			//测试用户删除
			System.out.println("-----测试用户删除-----");
			user.deleteUserInfo("12");//删除用户 
			
			
//			测试用户添加
			System.out.println("-----测试用户添加-----");
			user.addUserInfo(new UserInfo("张三","123456","男",20,"西安",new Date()));//添加用户
			
			
			
//			测试用户查看所有的用户(list参数的取法,详见userDaoImpl.xml)
			System.out.println("-----测试用户查看所有的用户(list参数的取法,详见userDaoImpl.xml)-----");
			List<String> ids= new ArrayList<String>();
			ids.add("1");
			ids.add("19");
			List<UserInfo> userinfos=user.getAllUserInfo(ids);//获得所有的用户
			System.out.println(userinfos);
			System.out.println(userinfos.size());
			
//			测试用户查看所有的用户(翻页)(Map参数的取法,详见userDaoImpl.xml)
			System.out.println("-----测试用户查看所有的用户(翻页)(Map参数的取法,详见userDaoImpl.xml)-----");
			Map<String,Object> conds= new HashMap<String,Object>();
			conds.put("nu","%dd%");
			conds.put("nf","%xi%");
			userinfos=user.getUserInfoPage(0, 5, conds);//翻页查询数据;
			System.out.println(userinfos.size());
			System.out.println(userinfos);
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	
}



6.接下来是pojo
package com.md.ibates.pojo;

import java.util.Date;

/**
 *用户pojo类
 * @author 马东
 * 2010-1-13
 * 转载请注明出处
 */

public class UserInfo implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private Integer userid;
	private String username;
	private String password;
	private String sex;
	private Integer age;
	private String address;
	private Date birthday;

	// Constructors

	/** default constructor */
	public UserInfo() {
	}

	/** full constructor */
	public UserInfo(String username, String password, String sex, Integer age,
			String address, Date birthday) {
		this.username = username;
		this.password = password;
		this.sex = sex;
		this.age = age;
		this.address = address;
		this.birthday = birthday;
	}

	// Property accessors

	public Integer getUserid() {
		return this.userid;
	}

	public void setUserid(Integer userid) {
		this.userid = userid;
	}

	public String getUsername() {
		return this.username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getSex() {
		return this.sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Integer getAge() {
		return this.age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public Date getBirthday() {
		return this.birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	@Override
	public String toString() {
		
		return  "userid:"+this.userid+"--  username:"+this.username+"--  sex:"+this.sex+"-- age:"+this.age+"-- bithday:"+this.birthday+"-- address:"+this.address ;
	}

	
}


具体的可执行例子我给放到附件里面仅供参考!如果有什么出错的地方还望多多指出!
1
0
分享到:
评论

相关推荐

    IBatis学习笔记以及使用心得

    IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得

    ibatis出错调试心得

    在使用iBatis进行数据库操作的过程中,可能会遇到各种各样的问题。这些问题往往由于iBatis错误信息的隐晦性而难以快速定位与解决。本文将根据所提供的标题、描述及部分内容,详细阐述在使用iBatis时可能遇到的一些...

    ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包

    这个压缩包包含了iBATIS的相关使用文档和安装包,是学习和使用iBATIS的重要参考资料。 《iBATIS-SqlMaps-2.pdf》可能是关于iBATIS SQL映射器的详细指南,它会介绍如何编写SQL Map配置文件,这些文件定义了数据库...

    ibatis的使用教程

    要开始使用 Ibatis,首先需要从官方网站下载最新版本的 ibatis jar 包,以及 log4j 日志框架的 jar 包。然后,在Java项目中添加这些库,配置log4j.properties以开启SQL日志输出。接着,新建主配置文件sqlMapConfig....

    struts+spring+ibatis+extjs完美整合!!!

    struts+spring+ibatis+extjs完美整合! 联系方式:QQ360310087 如果有需要与本人沟通的.

    ibatis 使用手册

    《iBatis 使用手册》是一份详尽的开发资源,涵盖了iBatis框架的各个方面,包括iBatis的开发指南、SQL Maps的使用以及入门教程。iBatis是一款优秀的持久层框架,它允许Java开发者将SQL语句与Java代码分离,实现数据...

    ibatis简易使用 ibatis简易使用 ibatis简易使用

    以下是对iBATIS简易使用的详细解释: 1. **环境准备**: - **jar文件**:iBATIS框架运行需要依赖一些库文件,包括`log4j`用于日志记录,`ibatis`核心库,以及`jdbc`驱动,这些都需要添加到项目的类路径中。 - **...

    IBatis简单使用

    以上就是IBatis的基本使用方法和核心概念,通过它可以有效地提升数据库操作的便捷性和灵活性,降低开发成本。在实际项目中,可以根据需求进行扩展和定制,如结合Spring框架实现更高级的整合应用。

    ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc

    iBatis 中使用安全的拼接语句、动态查询、大于、小于、等于 iBatis 是一个流行的持久层框架,提供了许多强大的功能来帮助开发者构建高效、安全的数据库交互应用程序。本文将详细介绍 iBatis 中使用安全的拼接语句、...

    springmvc-ibatis环境搭建

    springmvc ibatis 整合, 解决BLOB,CLOB等大字段的问题,内置查询缓存 和解决SpringMVC 返回JSON下载,乱码等问题 ...并提供了一个DEMO ,紧为不了解ibatis,或者首次整合springmvc-ibatis的人使用!

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    iBatis详细使用手册(.net版)[收集].pdf

    iBatis详细使用手册(.net版) iBatis是一个基于.NET框架的持久层框架,提供了一种灵活、可控的方式来实现类ORM(Object-Relational Mapping)的解决方案。下面是对iBatis的详细使用手册的知识点总结: 1. iBatis...

    ibatis资料ibatis资料

    1. **《iBATIS in Action》**: 这通常是一本关于iBATIS的书籍,可能深入介绍了iBATIS的原理、配置、使用方法以及最佳实践,对于学习和理解iBATIS非常有帮助。 2. **《ibatis Guide》**: 这可能是iBATIS的官方指南...

    IBatis使用

    使用Ibatis对数据库的访问,实现增删改查的操作 ;

    ibatis使用手册

    【Ibatis 使用手册】 Ibatis 是一款优秀的对象关系映射(ORM)框架,它使得开发者能够在不脱离 SQL 的强大功能的同时,享受面向对象编程的便利。Ibatis.Net 是其针对 .NET 平台的移植版本,它简化了数据访问层(DAL...

    ibatis使用及环境搭建文档

    **Ibatis简介** Ibatis,又称为SQL Map,是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,与Java代码进行分离,使得...了解并熟练掌握Ibatis的使用,对于提升Java开发效率和代码质量具有重要意义。

    IBATIS开发使用实例

    本文将围绕“IBATIS开发使用实例”这一主题,深入解析复杂SQL查询的应用,尤其是如何利用SQL进行多表关联、条件筛选以及聚合函数的使用。 ### IBATIS简介 IBATIS,现被称为MyBatis,是一种优秀的持久层框架,它...

    ibatis简单使用的想法

    ibatis简单使用的想法 ibatis 是一个成熟的框架,现在已经是改名字叫mybatis了,框架的配置比较烦,如xml,dao的书写,还有每个表还要对应于javabean,没有的话,map 也成,这里希望对其进行简单的简化。

    ibatis 3.0 使用参考

    介绍了ibatis3.0的配置技巧,包括比较复杂的sql语句的写法。

    iBatis详细使用手册(.net版)

    ### iBatis.Net详细使用手册知识点汇总 #### 1. iBatis.Net概述 - **定义**: iBatis.Net是一种轻量级的框架,用于.NET应用程序中的数据访问层。它并非传统的ORM(对象关系映射)工具,而是介于纯ADO.NET与全功能ORM...

Global site tag (gtag.js) - Google Analytics