您的位置:首页 > 其它

Ibatis学习总结+ibatis与hibernate简单比较+示例

2012-05-11 10:44 357 查看
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();
		}
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: