论坛首页 Java企业应用论坛

iBATIS 初探

浏览 21121 次
锁定老帖子 主题:iBATIS 初探
精华帖 (0) :: 良好帖 (0) :: 新手帖 (12) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-12-20   最后修改:2010-12-20

 

首先声明一下, 我使用的 iBATIS 版本是2.3.2.715 .

 

之所以把这个放在最前面... 是因为这两天参考网上文章, 还有文档教程时, 由于忽略版本问题, 吃了不少亏. 

之前, iBATIS的官网一直进不去, 都是到网上乱找的文档.下载来参考, 或者是看别人的博客. 照着敲代码练习, 

一边敲着, 就一边郁闷着...  怎么照上面打的...  还是报错呢... 

都是版本惹的祸... 还有自己瞎眼没有认真看...  才白白浪费了 一个晚上+一个上午 的时间查错...

同时也对iBATIS表示汗颜... 怎么第一版. 第二版. 还有新出的第三版, 里面语法格式差这么多呢???

 

OK, 正题>>>

 

概念:

 

iBATIS , 又是一个O/R Mapping的解决方案(例如 hibernate的ORM 也是解决方案之一.)

网上很多人便将其称为ORM , 但是用过的人, 应该都会觉得并不恰当.

与其称之为一个OR Mapping , 倒不如叫它SQL Mapping...

 

iBATIS 的特点是小巧, 简单. 但是要求需要熟悉SQL , 不像hibernate那样, 可以让你一句sql 都不用写

同时, 我觉得要写挺多的配置文件的. 可能会比较繁琐.

 

sample

 

还是拿最简单的 User 类来测试. User.java

 

public class User {

	private int id;
	private String username;
	private String userpwd;
	private String userdesc;

        //Sets and Gets...
}
 

 

接下来... 马上看看... dao里面的一个方法有多简单~~ UserDao.java

 

 

public static List getAllUsers() throws SQLException {
                
               SqlMapClient sqlMap = Utils.getSqlmap();
		try {
			List li = sqlMap.queryForList("getAllUsers");
			
		} catch (SQLException e) {
				e.printStackTrace();
		}
		return li;
}
 

 

 

是的, dao里面的一个方法只需要这么几句话. 

看看怎么实现的吧...

 

首先, 我们需要一个跟 User 类对应的 配置文件 User.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 namespace="User">

        <typeAlias alias="user" type="pojo.User"/>

	<select id="getAllUsers" resultClass="user">
		select * from user order by id; 
	</select>

</sqlMap>

 

接下来, 需要一个另一个配置文件, 将User.xml 加入 其中, 同时还要在里面配置数据源---- 即数据库的连接等等...   SqlMapConfig.xml 

 

<?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 name="JDBC.Driver" value="${jdbc.driverClassName}" />
			<property name="JDBC.ConnectionURL" value="${jdbc.url}" />
			<property name="JDBC.Username" value="${jdbc.username}" />
			<property name="JDBC.Password" value="${jdbc.password}" />
		</dataSource>
	</transactionManager>
	<sqlMap resource="sql/User.xml" />

</sqlMapConfig>

 

 

在这里, 我们把数据库的相关参数保存在了另一个文件中, sqlmap.properties

 

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/myblog
jdbc.username=root
jdbc.password=netjava

 

 这样做的好处, 相信大家也明白..  下次我们再写一个项目的时候, 只需要把这个文件copy 过去, 改掉其中的数据库连接就ok啦 ,  也算是资源的充分利用吧..

 

至此, 所有的配置文件 都已经上场, 当然上面写的都是最简单的测试, 看起来比较没有那么繁琐, 实际应用时候, 可能最麻烦的地方就是在 配置文件的 sqlmap 的编写... 

前面 UserDao.java 的方法中, 有这么一句 

 

SqlMapClient sqlMap = Utils.getSqlmap();

 

 Utils 类 就是我们抽取其中的初始化的代码, 单独写成一个类, 当然还是方便重用哈.同时采用的是单实例模式, 相当环保.

  Utils.java

 

public class Utils{
	
	private static SqlMapClient sqlMapper; 
    public static synchronized SqlMapClient getSqlmap() 
    {   
          if(sqlMapper==null) 
          { 
              try { 
                  Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); 
                  sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader); 
                  reader.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
          } 
            return sqlMapper; 
    } 
}

 

 

好了,  所有的相关文件都已经上场..  当然, 加上 iBATIS的 jar包是前提 , 还是提醒下, 要注意版本问题...

项目的结构如下图所示:


 

最后整理一下思路吧!


UserDao 是怎样操作数据库的???

首先 , Utils 通过SqlMapConfig.xml里面的配置, 连接到数据库, 取得SqlMap , 同时User.xml 将Sql查询映射成java中可以调用的bean, 通过SqlMap 调用这些bean 就是在执行想对应的sql语句...

 

That's all.  附上源码.

 

 

 

 

 

 

  • 大小: 14.1 KB
  • 大小: 10.4 KB
   发表时间:2010-12-20  
引用
可以让你一句sql 都不用写?
sql才是王道吧.
0 请登录后投票
   发表时间:2010-12-21  
这个应该省去了hibernate对table和bean之间的映射效率问题,确实会有一个数量级的提升。
0 请登录后投票
   发表时间:2010-12-21  
javafound 写道
引用
可以让你一句sql 都不用写?
sql才是王道吧.


呵呵, 我比较不喜欢写sql 语句... 对于sql语句不是很熟练 
一些简单的功能, 用hibernate的ORM 都基本能实现吧.
0 请登录后投票
   发表时间:2010-12-21  
初学的好教程
0 请登录后投票
   发表时间:2010-12-21  
javafound 写道
引用
可以让你一句sql 都不用写?
sql才是王道吧.

同意
0 请登录后投票
   发表时间:2010-12-21  
LZ请细心点,select * from user order by id;   这个分号是不能加上的。。。
0 请登录后投票
   发表时间:2010-12-21  
iBatis的应用可以比这个更精炼的。比如UserDao那个东西我们可以使用一个IDao来操作不用没个表一个Dao,User.java也可以直接将结果集映射为Map返回,不写这个User.java也是可以的。当然这样做是以牺牲设计换效率的做法。

这个开源项目是基于iBatis的。楼主可以浏览一下:
http://web230531.host89.chinajsp.net/
0 请登录后投票
   发表时间:2010-12-22  
eredlab 写道
iBatis的应用可以比这个更精炼的。比如UserDao那个东西我们可以使用一个IDao来操作不用没个表一个Dao,User.java也可以直接将结果集映射为Map返回,不写这个User.java也是可以的。当然这样做是以牺牲设计换效率的做法。

这个开源项目是基于iBatis的。楼主可以浏览一下:
http://web230531.host89.chinajsp.net/

非常感谢这位大哥, 短短几句话 让我得到了很多启示. 
0 请登录后投票
   发表时间:2010-12-22  
love182055084 写道
LZ请细心点,select * from user order by id;   这个分号是不能加上的。。。

真粗心了.  谢谢你~  不过这样运行下来没报错. 可能拼接复杂sql语句时就会出错了. 还是细心为好.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics