MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。
输入映射Parameter
指定输入参数的java类型,可以使用别名或者类的全限定名。它可以接收简单类型,POJO对象、HashMap。
-
传入简单类型
<select id="findUserById" parameterType="int" resultType="com.hf.model.User"> SELECT * FROM user where id = #{id} </select>
上面的这个示例说明了一个非常简单的命名参数映射。参数类型被设置为 int,这样这个参数就可以被设置成任何内容。原始类型或简单数据类型(比如 Integer 和 String)因为没有相关属性,它会完全用参数值来替代。
-
传入pojo对象
<insert id="insertUser" parameterType="User"> insert into users (id, username, sex) values (#{id}, #{username}, #{sex}) </insert>
如果 User 类型的参数对象传递到了语句中,id、username 和 sex属性将会被查找,然后将它们的值传入预处理语句的参数中。
-
传入map对象
<select id="findUserByMap" parameterType="hashmap" resultType="com.hf.model.User"> SELECT u.* FROM user u WHERE username LIKE '%${name}%' AND sex = #{sex} </select>
如果 Map类型的参数对象传递到了语句中,会从map中找到name对应的值和sex对应的值,然后将它们的值传入预处理语句的参数中。
输出映射 resultType/resultMap
-
resultType
<select id="findUserById" resultType="map"> select id, username, sex from user where id = #{id} </select>
上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为领域模型。MyBatis 对两者都提供了支持。看看下面这个 JavaBean:
package com.hf.model; import java.io.Serializable; public class User implements Serializable { private int id; private String username;// 用户姓名 private String sex;// 性别 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
基于 JavaBean 的规范,上面这个类的属性属性:id,username 和 sex。这些属性会对应到 select 语句中的列名。
<select id="findUserById" resultType="user"> select id, username, sex from user where id = #{id} </select>
起别名会简化你的代码,使用它们,你就可以不用输入类的完全限定名称了。
<!--配置别名--> <typeAliases> <!--该包下所有类的别名就是该类的名称变为首字母小写--> <package name="com.hf.model"/> </typeAliases> <!-- SQL 映射 XML 中 --> <select id="selectUsers" resultType="user"> select id, username, sex from user where id = #{id} </select>
这些情况下,MyBatis 会在幕后自动创建一个 ResultMap,再基于属性名来映射列到 JavaBean 的属性上。
-
解决数据库列名和模型属性不匹配的问题
如果列名和属性名没有精确匹配,可以在 SELECT 语句中对列使用别名(这是一个基本的 SQL 特性)来匹配标签。比如:
<select id="selectUsers" resultType="User"> select user_id as "id", user_name as "username", user_sex as "sex" from some_table where id = #{id} </select>
使用外部的 resultMap是解决列名不匹配的另外一种方式。
<resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="user_name"/> <result property="sex" column="user_sex"/> </resultMap>
而在引用它的语句中使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:
<select id="selectUsers" resultMap="userResultMap"> select user_id, user_name, user_sex from user where id = #{id} </select>