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" parameterresult ><![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;}
<?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>
<?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" parameterresult ><![CDATA[select *from usertable where userid=#userid#]]></select><!-- 查询所有用户【当parammeterClass=java.util.ArrayList是如何取参数】 --><select id="getAllUserInfo" parameterresult >select *from usertable where userid not in <iterate open="(" close=")" conjunction="," >#userids[]#</iterate></select><!-- 翻页查询用户【当parammeterClass=java.util.HashMap是如何取参数】 --><select id="getAllUserInfoPage" parameter result><![CDATA[select *from usertable where username like #nu# and address like #nf# ]]></select><!-- 删除用户 --><delete id="deleteUserInfo" parameter parameter><![CDATA[ insert into usertable (userid,username,password,sex,age,birthday,address) values (#userid#,#username#,#password#,#sex#,#age#,#birthday#,#address#)]]></insert><!--修改用户 --><insert id="updateUserInfo" parameter><![CDATA[ update usertable set username=#username#,password=#password#,sex=#sex#,age=#age#,birthday=#birthday#,address=#address# where userid=#userid#]]></insert></sqlMap>
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);}
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;}}
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();} }}
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 accessorspublic 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;}@Overridepublic String toString() {return "userid:"+this.userid+"-- username:"+this.username+"-- sex:"+this.sex+"-- age:"+this.age+"-- bithday:"+this.birthday+"-- address:"+this.address ;}}具体的可执行例子我给放到附件里面仅供参考!如果有什么出错的地方还望多多指出!