Mysql映射文件元素
MyBatis的真正强大在于它的映射语句,也是它的魔力所在,由于它的异常强大,映射器的XML文件就显得相对简单,如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码,MyBatis就是针对SQL构建的,并且比普通的方法做的更好。
SQL映射文件有很少的几个顶级元素(按照他么应该被定义的顺序):
cache
给定命名空间的缓存配置;cache-ref
其他命名空间缓存配置的引用;resultMap
是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象;parameterMap
已废弃,老式风格的参数映射,内联参数时首选,这个元素可能在将来被移除,这个不会记录;sql
可被其他语句引用的可重复语句块;insert
映射插入语句;update
映射更新语句;delete
映射删除语句;select
映射查询语句;
select
查询语句是MyBatis中最常用的元素之一,光能把数据存到数据库中,价值不大,如果还能冲讯取出来才有用,多数应用也都是查询比修改要频繁,对每个插入、更新或者删除操作,通常对应多个查询操作。这是MyBatis的基本原则之一,也是将焦点和努力放到查询和结果映射的原因。简单查询的select元素是非常简单的,比如:
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
这个语句被称作selectPerson,接受一个int(Integer)类型参数,并返回一个HashMap类型的对象,其中的键是列名,值便是结果行中的对应值。
注意:参数符号:
#{id}
这就告诉MyBatis创建一个预处理语句参数,通过JDBC,这样的一个参数在SQL中会由一个”?”来标示,并被传递到一个新的预处理语句中,就像这样:
//Similar JDBC code,NOT MyBatis...
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.preparedStatement(selectPerson);
ps,setInt(1,id);
当然,这需要很多单独的JDBC的代码来提取结果并将它们映射到对象实例中,这就是MyBatis节省你时间的地方,我们需要深入了解参数和结果映射,细节部分我们下面来了解。
select元素有很多属性允许你配置,来决定每条语句的作用细节。
<select
id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
注:如果图片不清楚,可以拖动至新页面打开图片。
insert、update和delete
数据变更语句:insert、update和delete的实现非常接近:
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20" >
<update
id="updateAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20" >
<delete
id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20" >
下面就是insert、update和delete语句的示例:
<insert id="insertAuthor">
INSERT INTO Author
(id,username,password,email,bio)
VALUES
(#{id},#{username},#{password},#{email},#{bio})
</insert>
<update id="updateAuthor">
UPDATE Author SET
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
WHERE
id = #{id}
</update>
<delete id="deleteAuthor">
DELETE FROM
Author
WHERE
id=#{id}
如前所述,插入语句的配置规则更加丰富,在插入语句里面有一些额外的属性和子元素用来处理主键的生成,而且有多种生成方式。
首先,如果你的数据库支持自动生成主键的字段(比如:MySQL和SQL Server),那么你可以设置useGeneratedKeys = "true"
,然后再把keyProperty
设置到目标属性上就OK了,例如:如果上面的Author表已经对id使用了自动生成的列类型,那么语句可以修改为:
<insert id = "id" useGeneratedKeys="ture" keyProperty = "id">
INSERT INTO Author
(username,password,email,bil)
VALUES
(#{username},#{password},#{emial},#{bio})
</insert>
对于不支持自动生成类型的数据库或可能不支持自动生成主键JDBC驱动来说,MyBatis有另外一种方法来生成主键。
这里有一个简单(甚至很傻)的示例,它可以生成一个随机ID(你最好不要这么做,但这里展示了MyBatis处理问题的灵活性及其所关心的广度):
<insert id = "insertAuthor">
<selectKey keyProperty = "id" resultType = "int" order = "BEFORE">
SELECT CAST(RANDOM()*1000000 AS INTRGER) a FROM SYSTEM.SYSDUMMY1
</selectKey>
INSERT INTO Author
(id,username,password,email,bio,favourite_section)
VALUES
(#{id},#{username},#{password},#{email},#{bio},#{favouriteSection,jdbcType=VARCHAR})
</insert>
在上面的示例中,selectKey
元素将会首先运行,Author的id会被设置,然后插入语句会被调用,这给你了一个和数据库中来处理自动生成主键类似的行为,避免了使java代码变得负载。
selectKey元素描述如下:
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED" >
sql
这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中,它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 比如:
<sql id = "userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
这个SQL片段可以被包含在其他语句中,例如:
<select id = "selectUsers" resultType = "map">
SELECT
<include refild = "userColumns"> <property name = "alias" value = "t1" /> </include>
<include refild = "userColumns"> <property name = "alias" value = "t2" /> </include>
FROM some_tavle t1
cross join some_table t2
</select>
属性值可以用于包含的refid属性或者包含的字句里面的属性值,例如:
<sql id = "sometable">
${prefox} Table
</sql>
<sql id = "someinclude">
from
<include refid = "${include_target}" />
</sql>
<select id = "select" resultType="map">
select
field1,field2,field3
<include refid = "someinclude">
<property name="prefix" value="some"/>
<porperty name= "include_target" value="sometable"/>
</include>
</select>
未完待续……