Ibatis学习总结
昨天用了一天的时间初步简单的学习了一下ibatis框架。由于这个框架比较小,所以学习的速度比较快,学了这一天,基本上就可以用到项目开发过程中了。
一、是什么
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。
它的核心思想是将sql语句与项目代码分离,使得sql语句的灵活性大大加强。
参考的资料:《ibatis in action》《sql map》、ibatis官网
Ibatis框架:
1、只有一个jar:ibatis.jar
2、需要两个配置文件:sqlMapConfig.xml和sqlMap.xml
其中sqlMapConfig.xml文件一般名字不改,而且只有一个,主要是配置数据源,类似于hibernate中的hibernateConfig.xml文件。
sqlmap.xml文件的文件名并不是固定的,可以由用户自定义,也不是必须唯一的,可以是多个,类似于hibernate中的hbm.xml文件,且需要将其配置到sqlMapConfig.xml中。
二、与hibernate简单比较
网上经常看到Hibernate和ibatis作比较,我也只是大概了解了一点。很多人说到ibatis的性能好一些。究竟性能高体现到哪里的具体的测试我并没有做过, 但是可以从理论上得到:
1、ibatis支持批处理,也就是ibatis支持批量更新数据,而hibernate是不支持的,理论上ibatis在这一点上的性能大大高于hibernate。
2、ibatis要程序员自己手写sql语句,而hibernate是hibernate框架生成sql,那么系统一个是直接执行sql,一个是要先经过hibernate N层复杂的框架,理论上,ibatis的性能要高。
然而ibatis框架确实很小,功能尚缺,与hibernate相比,hibernate可以从实体类直接生成数据库,也可以从数据库直接生成映射实体类,开发过程更加完善统一。而ibatis则需要必须首先建立数据库。并且ibatis现在支持的数据库较少。
Hibernate的映射机制是实体类对应数据库表,采用注解或者配置文件来映射,相当于一对一直接映射。而ibatis的映射机制是在sqlmap.xml文件中的sql语句中实现映射。如下图:
Hibernate的映射:

Ibatis映射:
三、示例
下面的示例中讲解了大部分ibatis中的内容,当然也不全面,比如rowhandler部分、动态sql、事务管理等就没有写到这个示例中:
步骤:
1、建立数据库
2、新建java project
3、引入相关jar:ibatis.jar和数据库驱动jar
4、编写配置文件sqlMapConfig.xml
5、编写sqlMap.xml
6、编写测试代码
代码:
1、entity class:
public class Account {
private int userid;
private String username;
private String password;
private String groupname;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGroupname() {
return groupname;
}
public void setGroupname(String groupname) {
this.groupname = groupname;
}
}
2、sqlMapConfig :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="sqlmap.properties"/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property value="com.mysql.jdbc.Driver" name="JDBC.Driver"/>
<property value="mysql://localhost/demo1" name="JDBC.ConnectionURL"/>
<property value="root" name="JDBC.Username"/>
<property value="root" name="JDBC.Password"/>
</dataSource>
</transactionManager>
<sqlMap resource="userAccount.xml"/>
</sqlMapConfig>
3、sqlMap.xml
<?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">
<sqlMap>
<select id="getAllUsers" resultClass="com.air.Account">
SELECT * FROM USER_ACCOUNT order by USERID
</select>
<!-- 无映射 -->
<select id="getAllUsers1" resultClass="com.air.Account"
parameterClass="string">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
<!-- 内联映射->实体类 -->
<select id="getAllUsers2" resultClass="com.air.Account"
parameterClass="string">
SELECT USERID as userid, USERNAME as username, PASSWORD as
password, GROUPNAME as groupname FROM USER_ACCOUNT WHERE
GROUPNAME=#groupName#
</select>
<!-- 内联映射->MAP类 -->
<select id="getAllUsers3" resultClass="hashmap"
parameterClass="string">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
<!-- 显示映射->实体类 -->
<resultMap id="accoutResult" class="com.air.Account">
<result property="userid" column="USERID" />
<result property="username" column="USERNAME" />
<result property="password" column="PASSWORD" />
<result property="groupname" column="GROUPNAME" />
</resultMap>
<select id="getAllUsers4" resultMap="accoutResult"
parameterClass="string">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
<!-- 显示映射->MAP类 -->
<resultMap id="mapResult" class="hashmap">
<result property="userid" column="USERID" />
<result property="username" column="USERNAME" />
<result property="password" column="PASSWORD" />
<result property="groupname" column="GROUPNAME" />
</resultMap>
<select id="getAllUsers5" resultMap="mapResult"
parameterClass="string">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
<!-- XML -->
<select id="selectXML" parameterClass="string" resultClass="xml"
xmlResultName="log">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
<select id="getOneUser" resultClass="com.air.Account"
parameterClass="string">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
<!-- 自动参数映射 -->
<insert id="insertOneUser1" parameterClass="com.air.Account">
INSERT INTO USER_ACCOUNT
(
USERNAME, PASSWORD, GROUPNAME
)VALUES(
#username#,#password#,#groupname#
)
</insert>
<!-- 内联参数映射 -->
<insert id="insertOneUser2" parameterClass="com.air.Account">
INSERT INTO USER_ACCOUNT
(
USERNAME, PASSWORD, GROUPNAME
)VALUES(
#username:VARCHAR#,
#password:VARCHAR#,
#groupname:VARCHAR#
)
</insert>
<!-- 外联参数映射 -->
<parameterMap id="parameterMapEx" class="com.air.Account">
<parameter property="username" jdbcType="VARCHAR"/>
<parameter property="password" jdbcType="VARCHAR"/>
<parameter property="groupname" jdbcType="VARCHAR"/>
</parameterMap>
<insert id="insertOneUser3" parameterMap="parameterMapEx">
INSERT INTO USER_ACCOUNT
(
USERNAME, PASSWORD, GROUPNAME
)VALUES(
?,?,?
)
</insert>
<!-- 自动生成的键 -->
<insert id="insertOneUser4" parameterClass="com.air.Account">
INSERT INTO USER_ACCOUNT
(
USERID,USERNAME, PASSWORD, GROUPNAME
)VALUES(
#userid#,
#username#,
#password#,
#groupname#
)
<selectKey
keyProperty="userid"
resultClass="int">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<!-- 存储过程 -->
<parameterMap id="pro" class="java.util.Map">
<parameter property="name" jdbcType="VARCHAR"
javaType="string" mode="IN"/>
</parameterMap>
<procedure id="pro_insert" parameterMap="pro">
{call new_proc(?)}
</procedure>
</sqlMap>
4、test class
public class Demo1 {
/**
* @param args
* @throws SQLException
*/
@SuppressWarnings({ "unchecked", "unchecked" })
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
String resource = "./SqlMapConfig.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
//List list = sqlMap.queryForList("selectXML", "NBA");
// for (int i = 0; i < list.size(); i++) {
// Account cc = (Account) list.get(i);
// System.out.println(cc.getUserid() + " " + cc.getUsername()
// + " " + cc.getPassword() + " " + cc.getGroupname());
// }
// for (int i=0;i<list.size();i++){
// Map m=(Map)list.get(i);
// System.out.print((String)m.get("userid").toString()+" ");
// System.out.print((String)m.get("username")+" ");
// System.out.print((String)m.get("password")+" ");
// System.out.print((String)m.get("groupname")+" ");
// System.out.println();
// }
// for (int i = 0; i < list.size(); i++) {
// String s = (String) list.get(i);
// System.out.println(s);
// }
// Account ac=(Account)sqlMap.queryForObject("getOneUser","IBM");
// System.out.println(ac.getUserid());
//selectkey
// Account iac=new Account();
// iac.setUsername("ALEXhhhh");
// iac.setPassword("DALIAN");
// iac.setGroupname("MS");
//
// Integer returnValue=(Integer)sqlMap.insert("insertOneUser4",iac);
//
// System.out.println(returnValue.intValue());
// //显示插入后的结果
// @SuppressWarnings("unchecked")
// List list = sqlMap.queryForList("getAllUsers1","MS");
//
// for (int i = 0; i < list.size(); i++) {
// Account cc = (Account) list.get(i);
// System.out.println(cc.getUserid() + " " + cc.getUsername()
// + " " + cc.getPassword() + " " + cc.getGroupname());
// }
//调用存储过程
// @SuppressWarnings("unchecked")
// Map m=new HashMap(1);
//
// m.put("name", new String("LISI"));
// sqlMap.update("pro_insert",m);
// //Integer i=(Integer)sqlMap.queryForObject("pro_insert",m);
//
// System.out.println("call procedure ok!");
//批处理
// Account c1=new Account();
// c1.setUsername("ZHOUQI");
// c1.setPassword("QINGDAO");
// c1.setGroupname("CN");
//
// Account c2=new Account();
// c2.setUsername("WANGWU");
// c2.setPassword("NANJING");
// c2.setGroupname("CN");
//
// sqlMap.startBatch();
//
// sqlMap.insert("insertOneUser3",c1);
// sqlMap.insert("insertOneUser3",c2);
//
// sqlMap.executeBatch();
//显示插入后的结果
// @SuppressWarnings("unchecked")
// List ls = sqlMap.queryForList("getAllUsers1","CN");
//
// for (int i = 0; i < ls.size(); i++) {
// Account cc = (Account) ls.get(i);
// System.out.println(cc.getUserid() + " " + cc.getUsername()
// + " " + cc.getPassword() + " " + cc.getGroupname());
// }
//RowHandle生产XML
// XmlRowHandler rh=new XmlRowHandler();
// sqlMap.queryWithRowHandler("getAllUsers1", "CN", rh);
// String xmlDoc=rh.getXmlDocument();
//
// System.out.println(xmlDoc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}