`

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics