欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IBATIS入门(第二节)

程序员文章站 2022-07-12 19:19:01
...

我们接这IBATIS入门(第一节)讲:http://yekui.iteye.com/admin/blogs/732256

 

详解User.xml里面的配置:

 

<sqlMap namespace="user"> 这是一个命名空间,学过C的人应该了解命名空间这个名词了,其主要作用就是区别,你可以把他理解为java中的包的概念,意思就是不让重名的类名,等等起冲突。

 

<typeAlias alias="User" type="com.dk.user.UseVO"/>这个是一个JavaBeen的一个路径别名。后面我们就不用写一大串的东东了,把它com.dk.user.UseVO都用User代替了。

 

 <resultMap id="userResult" class="User">
    <result property="id" column="uid"/>
    <result property="name" column="uname"/>
    <result property="age" column="uage"/>
  </resultMap>

 

这个很有必要说一下,你看demo的时候,会有配置这个与我们创建的表结构,映射的东东。但是大多数开发的情况下,我们是不用写这个resultMap的 那么很多人就会问了,特别是学习过hibernate的人就不太明白,如果按照hibernate的里面的配置写法这个是必须的与表结构里面的字段一一对应,事实上 我们先前为什么要配置一个别名 这里就该起作用了。

 

 

往下看。

 

<statement id="createUserTest">
     create table usertest
     (
       uid int primary key identity(1,1),
       uname varchar(20),
       uage int
     )
  </statement>

 

 

这个地方我们调用的时候是这样子的。

 

public static void updateUser(UseVO vo){
  try {
   sqlMapClient.startTransaction();
   int i = sqlMapClient.update("updateUser", vo);
   sqlMapClient.commitTransaction();
   sqlMapClient.endTransaction();
     System.out.println("i\t"+i);
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 

 

特别注意一点就是第一调用update方法,第二就是我们写的事务一定要提交,不然表就没有创建到数据库中。虽然它提示了你已经船舰成功,但是你去数据库查的时候就是没有这张表,事务没有提交,好不多说了。

 

继续

 <insert id="insertUser" parameterClass="User">
      insert into usertest
      (uname,uage)
      values
      (#name#,#age#)
  </insert>
  

这里记住这里的表还是数据库中的表,学过hibernate的人 老是不明白这里为什么是insert into usertest 这里应该是我的映射啊,按道理他的理解就是insert into User ,请别忘了那句话,在ibatis里面,永远是纯的sql语句编程。

 

 

(#name#,#age#)
这#符号是什么意思啊,你暂时可以这样理解他就是以前我们在sql语句中的那个?,也就是占位符的意思。

 

(#name#,#age#)

那这里的name 与age 有事怎么回事呢,首先我们要先了解 insert into usertest
(uname,uage)是表中的数据的字段
,而values是(#name#,#age#)
你UserBeen里面映射好了JavaBeen参数。

 

 

接下来就是

 

第一:

 

  <select id="selectUser" resultClass="User">
     select uid as id,uname as name,uage as age from usertest
  </select>

 

第二:

   <select id="selectUser" resultMap="userResult" resultClass="User">
     select uid,uname ,uage  from usertest
  </select>

 

第三:

 

   <select id="selectUser" resultMap="userResult" resultClass="User">
     select * from usertest
  </select>

 

实际上你不计较一下这三种写法,就能看出,第二种和第三种没什么区别都一样。但是第一,和第二第三种的写法就有点不太一样,究竟哪里不一样呢,想了半天,想不明白,没关系我们冲程序中看效果。

 

原来按照第一种写法我们就可以把

 

 <resultMap id="userResult" class="User">
    <result property="id" column="uid"/>
    <result property="name" column="uname"/>
    <result property="age" column="uage"/>
  </resultMap>


注释掉。因为这样写就没有写

resultMap的必要了 ,这是为什么呢??

哦,我们一看 他为什么都是as name ,as age,as id 很明显这里就是在他的字段与表中的字段一个一个的映射起来。

所以事实上我们可以把他之前的一个参数去掉

resultClass="User"。

 

继续看:

parameterClass="User" parameterClass="int" parameterClass="String" 这个是你传入的参数。

 

resultClass="User" 这是返回结果集。

 

继续看:

如果是创建或删除表那么就在statement标签里面操作就好了:例如:

 <statement id="createUserTest">
     create table usertest
     (
       uid int primary key identity(1,1),
       uname varchar(20),
       uage int
     )
  </statement>

 

 <statement id="dropUser" >
    drop table usertest
 </statement>

 

 

最后还有一个挺囧的问题。那就是like语句的写法,我总结一句like就是见钱眼开。

 

  <select id="selectUserByName" parameterClass="String" resultClass="User">
       select * from usertest where uname like '%#name#%'
  </select>

这个你怎么写都会报错的,而且无论你怎么改变你所谓正确的写法。

 

搞了半天正确的下发居然是这样子的:很明显见钱眼看,加上美元符 问题解决。

 

  <select id="selectUserByName" parameterClass="String" resultClass="User">
       select * from usertest where uname like '%$name$%'
  </select>

 

 

 

有一些报错,如果你查询语句没有报错,但是数据是null 这就是要看你的resultMap=""是否写对了。

 

ok差不多了应该。基本对这些个东西应该是比较了解了把。到此你入门了基本80%还有写个什么多表映射这个你在工作当中写几个基本就不成问题了 ,至于关于ibaties与spring的整合 这个都应该是google写都能解决了,关键是入门。

 

希望这些对大家有帮助,谢谢。