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 ;
}


}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值