IBATIS入门(第二节)
我们接这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写都能解决了,关键是入门。
希望这些对大家有帮助,谢谢。
上一篇: webpack 学习第二节课