【MyBatis基础教学三】- SQL 映射的 XML 文件 【精品】
SQL 映射的 XML 文件
MyBatis 真正的力量是在映射语句中。这里是奇迹发生的地方。对于所有的力量,SQL 映射的 XML 文件是相当的简单。当然如果你将它们和对等功能的 JDBC 代码来比较,你会 发现映射文件节省了大约 95%的代码量。MyBatis 的构建就是聚焦于 SQL 的,使其远离于 普通的方式。 SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
- cache - 配置给定命名空间的缓存。
- cache-ref – 从其他命名空间引用缓存配置。
- resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加 载你的对象。
parameterMap – 已经被废弃了!老式风格的参数映射。内联参数是首选,这个元 素可能在将来被移除。这里不会记录。- sql – 可以重用的 SQL 块,也可以被其他语句引用。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
下一部分将从语句本身开始来描述每个元素的细节。
- select
- insert,update,delete
- sql
- Parameters
- resultMap
- 缓存
- 参照缓存
- 动态 SQL
1、select
查询语句是使用 MyBatis 时最常用的元素之一。直到你从数据库取出数据时才会发现将 数据存在数据库中是多么的有价值,所以许多应用程序的查询操作要比更改数据操作多的多。 对于每次插入,更新或删除,那也会有很多的查询。这是 MyBatis 的一个基本原则,也是将 重心和努力放到查询和结果映射的原因。对简单类别的查询元素是非常简单的。比如:
<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{
id}
</select>
这个语句被称作selectPerson,使用一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值是列对应的值。
注意参数注释: #{id}
这就告诉 MyBatis 创建一个 PreparedStatement(预处理语句)参数。使用 JDBC,这样 的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样
// 相似的JDBC代码,不是MyBatis的
String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
这个例子中的 username和 password 将会由 properties 元素中设置的值来替换。driver 和 url 属性将会从包含进来的 config.properties 文件中的值来替换。这里提供很多配置的选项。
属性也可以被传递到 SqlSessionBuilder.build()方法中。例如:
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, environment, props);
当然,这需要很多单独的 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” >
2、insert,update,delete
数据修改语句 insert,update 和 delete 在它们的实现中非常相似:
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
useGeneratedKeys=""
timeout="20000">
<update
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">
<delete
id=