基础语义
XmlSqlMapClientBuilder
XmlSqlMapClientBuilder是ibatis 2.0之后版本新引入的组件,用以替代1.x版本中的XmlSqlMapBuilder。其作用是根据配置文件创建SqlMapClient实例。
SqlMapClient
SqlMapClient是ibatis的核心组件,提供数据操作的基础平台。SqlMapClient可通过XmlSqlMapClientBuilder创建:
String resource ="com/ibatis/sample/SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder();
SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
"com/ibatis/sample/SqlMapConfig.xml"指明了配置文件在CLASSPATH中的相对路径。XmlSqlMapClientBuilder通过接受一个Reader类型的配置文件句柄,根据配置参数,创建SqlMapClient实例。
sqlMap.startTransaction();
// 数据写入操作
sqlMap.insert(“addUser”,user);
// 数据查询
User user = sqlMap.queryForObject(“getUser”,”张三”);
// 在指定对象中存放查询结果
sqlMap.queryForObject(“getUser”,user,result);
// 执行批量查询
List<User> list = sqlMap.queryForList(“getUsers”,null);
// 查询指定范围内的数据
List<User> list = sqlMap.queryForList(“getUsers”,null,0,100);
// 分页查询
PaginatedList list = sqlMap.queryForPaginatedList(“getUsers”,null,25);
list.nextPage();
list.previousPage();
// 基于Map的批量查询、
Map map = sqlMap.queryForMap(“getUsers”,null,”userName”);
// 没有预先执行startTransaction()方法时,默认为auto_commit模式
sqlMap.commitTransaction();
OR映射
<typeAlias alias="user" type="com.ibatis.sample.User"/>
<cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement=" updateUser"/>
<property name="size" value="1000" />
</cacheModel>
映射文件主要分为两个部分:模块配置和Statement配置。模块配置包括:
typeAlias节点:定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.ibatis.sample.User"定义了一个别名"user",这样在本配置文件的其他部分,需要引用"com.ibatis.sample.User"类时,只需以其别名替代即可。
cacheModel节点:定义了本映射文件中使用的Cache机制,这里申明了一个名为"userCache"的cacheModel,之后可以在Statement申明中对其进行引用:这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel "userCache"进行缓存。之后如果程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。
cacheModel主要有下面几个配置点:
①flushInterval :设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。
②size:本CacheModel中最大容纳的数据对象数量。
③flushOnExecute:指定执行特定Statement时,将缓存清空。如updateUser操作将更
新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。
Statement配置
Statement/insert/delete/update/select/procudure,各种类型的Statement 配置节点的参数类型基本一致,区别在于数量不同。如insert、update、delete节点无需返回数据类型定义(总是int)。
主要配置如下:
<statement id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultClass="some.class.Name"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]>
select * from t_user where sex = [?|#propertyName#] order by [$simpleDynamic$]
</statement>
<select id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultClass="some.class.Name"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]>
select * from t_user where sex = [?|#propertyName#] order by [$simpleDynamic$]
</select>
<insert id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]>
insert into t_user (name,sex) values ([?|#propertyName#],[?|#propertyName#])
</insert>
<update id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]>
UPDATE t_user SET name=[?|#propertyName#], sex=[?|#propertyName#]
WHERE id = [?|#propertyName#]
</update>
<delete id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]>
delete from t_user where id = [?|#propertyName#]
</delete>
参数 |
描述 |
parameterClass |
参数类。指定参数的完整类名包括包路径,可通过别名来避免每次重复书写长的类名。 |
resultClass |
结果类。指定结果类型的完整类名包括包路径,可通过别名来避免每次重复书写长的类名。 |
parameterMap |
参数映射。需结合parameterMap节点对映射关系加以定义。对于存储过程之外的statement而言,建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现也更加出色。 |
resultMap |
结果映射。需结合resultMap节点对映射关系加以定义。 |
cacheModel |
Statement对应的Cache模块 |
在SQL中设定参数名时,可以同时指定参数类型,如:SET name=#name:VARCHAR#, sex=#sex:NUMERIC# WHERE id=#id:NUMERIC#
对于parameterMap和resultMap案例如下:
<resultMap id="get_user_result" class="user">
<result
property="name"
column="xingming"
jdbcType="VARCHAR"
javaType="java.lang.String"/>
<result
property="sex"
column="xingbie"
jdbcType="int"
javaType="java.lang.Integer"/>
</resultMap>
<parameterMap
id="update_user_para"
class="redemption" >
<parameter
property="name"
jdbcType="VARCHAR"
javaType="java.lang.String"
nullValue=""/>
<parameter
property="sex"
jdbcType="int"
javaType="java.lang.Integer"
nullValue=""/>
</parameterMap>