iBatis进阶(上)

小技巧:提示自动补全问题

在写配置文件的时候,我们希望文件会带有提示功能,所以在配置文件上都会引用此文件的定义DTD,例:

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

可是,在没有上网的情况下,无法得到提示,因为找不到DTD文件,我们可以有两种方式解决这个问题:

a:直接把上面两个地址复制到浏览器上,可以下载这两个DTD文件。

b:在iBatis.jar的com.ibatis.sqlmap.engine.builder.xml这个包里面找到DTD文件。

然后,我们只需要把DTD文件的路径指定上即可:

我把他放到了与类文件同一目录下,所以路径为

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "./sql-map-config-2.dtd">
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "./sql-map-2.dtd">

  

创建例子数据库:

create table user_account
(
  userid int,
  username varchar2(10),
  userpwd varchar2(10),
  groupname varchar2(10)
);
insert into user_account values(1,'JACK','BEIJING','NBA');
insert into user_account values(2,'TOM','SHANGHAI','NBA');
insert into user_account values(3,'MARY','SHANGHAI','IBM');

  

返回是POJO类或hashmap是类似的!

一:#与$的区别

我们在用到模糊查询的时候,如果写成

<select id="select1" parameterClass="java.lang.String"  resultClass="a.Account">
    select * from user_account where username like '%#username#%'
</select>

这样是错误的,我们要写成

<select id="select1" parameterClass="java.lang.String"  resultClass="a.Account">
    select * from user_account where username like '%$username$%'
</select>

  

二:resultMap

<!--   显示映射->实体类 -->
    <resultMap id="accoutResult" class="com.air.Account">
       <result property="userid" column="USERID" />
       <result property="username" column="USERNAME" />
       <result property="userpwd" column="USERPWD" />
       <result property="groupname" column="GROUPNAME" />
    </resultMap>
    <select id="getAllUsers4" resultMap="accoutResult"
       parameterClass="string">
       SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
    </select>

  

三:返回XML

<!--   XML -->
<select id="selectXML" parameterClass="string" resultClass="xml"
       xmlResultName="log">
       SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>

  

四:paramterMap

<!--   外联参数映射 -->
    <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="a.Account" >
        <selectKey resultClass="int" keyProperty="id" >
           SELECT Sys_Public_Sequence.NEXTVAL AS id FROM DUAL
        </selectKey>
        INSERT INTO USER_ACCOUNT
              (
                  USERID, USERNAME, PASSWORD, GROUPNAME
              )VALUES(
                  #id#,#username#,#userpwd#,#groupname#
              )
</insert>

  

六:调用存储过程

Map m = new HashMap();       
m.put("name", new String("LISI"));
sqlMapClient.update("pro_insert",m);
System.out.println("call procedure ok!");
<!--   存储过程 -->   
    <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>

  

七:批处理

//批处理
           Account c1=new Account();
           c1.setUsername("ZHOUQI");
           c1.setUserpwd("QINGDAO");
           c1.setGroupname("CN");
          
           Account c2=new Account();
           c2.setUsername("WANGWU");
           c2.setUserpwd("NANJING");
           c2.setGroupname("CN");
          
           sqlMapClient.startBatch();
          
           sqlMapClient.insert("insertOneUser3",c1);
           sqlMapClient.insert("insertOneUser3",c2);
          
           sqlMapClient.executeBatch();

  

八:RowHandler

当我们需要对查询后的结果进行加工的时候,我们可以在用到这个RowHandler。它类似一个过滤器,在结果返回前进行加工。

比如说,我们想把查询结果组成一整个XML文件,这里为什么要说“一整个”呢?因为如果把resultClass指定为xml的时候,也可以返回XML文件,只不过这个时候是把每一条记录转换成了一个XML文件,这样就产生了多个XML文件,而在这个例子中,我们得到的XML文件是唯一的:

1:先定义一个实现了RowHandler接口的类XmlRowHandler

public class XmlRowHandler implements RowHandler {
   
    public StringBuffer xmlDocument=new StringBuffer("<AccountList>");
   
    public void handleRow(Object o) {
       // TODO Auto-generated method stub
       Account acc=(Account)o;
       xmlDocument.append("<account>");
      
       xmlDocument.append("<accountID>");
       xmlDocument.append(acc.getUserid());
       xmlDocument.append("</accountID>");
      
       xmlDocument.append("<username>");
       xmlDocument.append(acc.getUsername());
       xmlDocument.append("</username>");
      
       xmlDocument.append("<password>");
       xmlDocument.append(acc.getPassword());
       xmlDocument.append("</password>");
      
       xmlDocument.append("<groupname>");
       xmlDocument.append(acc.getGroupname());
       xmlDocument.append("</groupname>");   
      
       xmlDocument.append("</account>");
    }
 
    public String getXmlDocument() {      
       xmlDocument.append("</AccountList>"); 
       return xmlDocument.toString();
    } 
}

  

2:用queryWithRowHandler调用查询语句,把XmlRowHandler类的一个实例做为参数传过去,这样,查询的结果就会到XmlRowHandler中去处理!

//RowHandle生产XML
       XmlRowHandler rh = new XmlRowHandler();
       sqlMap.queryWithRowHandler("getAllUsers1", "CN", rh);
       String xmlDoc=rh.getXmlDocument();    
       System.out.println(xmlDoc);

相关推荐