1.最基本配置
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<alias>
<typeAlias alias="Person" type="piggyWinFormTemplet.Model.Person, piggyWinForm" />
</alias>
<resultMaps>
<resultMap id="SelectResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>
</resultMaps>
<statements>
<select id="SelectByPrimaryKey" parameterClass="int" resultMap="SelectResult">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
WHERE
PER_ID = #value#
</select>
<insert id="Insert" parameterClass="Person" resultClass="int">
insert into Person (
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
) values (
#Id:int#,
#FirstName:varchar#,
#LastName:varchar#,
#BirthDate:smalldatetime#,
#WeightInKilograms:decimal#,
#HeightInMeters:decimal#
)
</insert>
<update id="Update" parameterClass="Person" resultClass="int">
update Person set
PER_FIRST_NAME=#FirstName:varchar#
,PER_LAST_NAME=#LastName:varchar#
,PER_BIRTH_DATE=#BirthDate:smalldatetime#
,PER_WEIGHT_KG=#WeightInKilograms:decimal#
,PER_HEIGHT_M=#HeightInMeters:decimal#
where PER_ID=#Id:int#
</update>
<delete id="Delete" parameterClass="int" resultClass="int">
delete from PERSON
where PER_ID = #value#
</delete>
</statements>
</sqlMap>
(1)<sqlMap namespace="">
需要和配置文件中的useStatementNameSpaces="true"配合使用(详见配置说明)
(2)<typeAlias alias="" type="类的全名">
实体类的别名,作用就是为了方便,不然每次都要写类的全名
(3)<resultMap id="" class="类的全名">
实际上就是定义一个到java pojo的映射,需要在这里定义之后,才能在sql的返回值类型处使用。
(4)<insert id="" parameterClass="">
1)不使用自增主键
直接写insert语句即可,参数通过#属性名#获得
2)使用自增主键(mysql)
<selectKey resultClass="java.lang.Integer" keyProperty="id">
select last_insert_id() as id from person limit 1
</selectKey>
需要添加这句,从而返回这次自增主键的值,然后再使用insert即可
注意:使用的数据库不同,获得自增主键的写法也不同
(5)<update id="" parameterClass="">
用法类似insert
(6)<delete id="" paramterClass="">
用法同insert
(7)<select id="" parameterClass="" resultMap="">
使用queryForList查询多个数据,queryForObject查询单个数据
注意:
1)使用resultMap和resultClass都可以起到定义映射java pojo的作用,只是resultMap可以自定义映射关系,并且能够指定类型;resultClass就是按照属性名称和表中的列名严格对应的
所以懒得写的时候用resultClass,只要保证名称确定对应即可
2)parameterMap和parameterClass和resultMap和resultClass的关系一样
3)parameterClass可以为原生数据类型,map、pojo
1>如果为原生数据类型,则可以在sql中直接使用value代表参数值
2>如果为map,使用key
Map<String,String> map = new HashMap<String,String>();
map.put("id", String.valueOf(4));
map.put("name", "wq");
List list = sqlClient.queryForList("selByIdAndName", map);
sqlMap中
<select id="selByIdAndName" parameterClass="java.util.HashMap" resultMap="PersonResult">
select * from person where id=#id# and name=#name#
</select>
3>如果为pojo,则用法和其他情况一样
2.常用功能
(1)模糊查询
注意:取参数值的时候必须使用$,不能用#
<select id="selByName" parameterClass="java.lang.String" resultMap="PersonResult">
select *
from person
where name like '%$value$%'
</select>
测试代码
List list = sqlClient.queryForList("selByName", "o");
(2)分页查询
注意
3.动态sql
(1)<dynamic>
说明: dynamic会根据实际情况添加或删除prepend,如:where、and等,所以不需要考虑太多,直接写上即可
(2)<isNotNull>
只判断参数是否是null,如果不是null,则添加相应sql
(3)<isNotEmpty>
不但判断参数是否是null,还判断String.valueOf(参数)是否是""
eg:
执行的测试代码为:
Person p = new Person();
p.setName("");
List<Person> list = (List<Person>)sqlClient.queryForList("person.selectByIN", p);
使用isNotNull
<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
select *
from person
<dynamic prepend="where">
<isNotNull prepend="and" property="name">
name like '%$name$%'
</isNotNull>
</dynamic>
</select>
产生的sql为:
select * from person where name like '%%'
因为name为"",不是null
使用isNotEmpty
<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
select *
from person
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
name like '%$name$%'
</isNotEmpty>
</dynamic>
</select>
产生的sql为:
select * from person
由于上述原因,pojo中属性最好使用包装类(Long、Integer等),这样就能区分null和""了,如果直接使用原生数据类型,则可能出错
实际上2、3属于这种情况
一元条件元素的属性:
prepend : 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property : 被比较的属性(必选)
<isPropertyAvailable> 检查是否存在该属性(存在 parameter bean 的属性) 。
<isNotPropertyAvailable> 检查是否不存在该属性(不存在 parameter bean 的属性) 。
<isNull> 检查属性是否为 null。
<isNotNull> 检查属性是否不为 null。
<isEmpty> 检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
是否为 null或空( “”或size() < 1) 。
<isNotEmpty> 检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
是否不为 null 或不为空( “”或 size() > 0) 。
(4)<isEqual prepend="" property="" compareValue="">
判断property的值是否和compareValue的值相同
<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
select *
from person
<dynamic prepend="where">
<isEqual prepend="and" property="id" compareValue="2">
name like '%$name$%'
</isEqual>
</dynamic>
</select>
表示如果传递进来的Person对象的id如果==2,那么就查询name为指定值得记录
(5)<isLessThan prepend="" property="" compareProperty="">
判断property的值是否小于compareProperty的值,如果小于,则添加相应sql
<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
select *
from person
<dynamic prepend="where">
<isLessThan prepend="and" property="id" compareProperty="age">
name like '%$name$%'
</isLessThan>
</dynamic>
</select>
如果传递过来的Person中的id<age,那么就添加相应sql
实际上4、5属于以下这种情况
二元条件元素的属性:
prepend : 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - : 被比较的属性(必选)
compareProperty : 另一个用于和前者比较的属性(必选或选择 compareValue)
compareValue : 用于比较的值(必选或选择 compareProperty)
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。