mybatis中mapper配置详解

MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。

1、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 中会由一个"?"来标识,并被传递到一个新的预处理语句中,就像这样:

String selectPerson = "SELECT * FROM PERSON WHERE ID=?"; 
PreparedStatement ps = conn.prepareStatement(selectPerson); 
ps.setInt(1,id); 

当然,这需要很多单独的 JDBC 的代码来提取结果并将它们映射到对象实例中,这就是 MyBatis 节省你时间的地方。

select 元素有很多属性允许你配置,来决定每条语句的作用细节:

在这里插入图片描述
在这里插入图片描述

2、Sql

这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化.,比如:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql> 

这个 SQL 片段可以被包含在其他语句中,例如:

<select id="selectUsers" resultType="map"> 
 select 
 <include refid="userColumns"><property name="alias" value="t1"/></include>, 
 <include refid="userColumns"><property name="alias" value="t2"/></include> 
 from some_table t1 
 cross join some_table t2 

属性值可以用于包含的refid属性或者包含的字句里面的属性值,例如:

<sql id="sometable"> 
${prefix}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"/> 
    <property name="include_target" value="sometable"/> 
</include> 
</select> 

3、参数(Parameters)

前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法,大概 90% 的情况参数都很少,比如:

<select id="selectUsers" resultType="User"> 
 select id, username, password 
 from users 
 where id = #{id} 
</select> 

上面的这个示例说明了一个非常简单的命名参数映射。参数类型被设置为 int,这样这个参数就可以被设置成任何内容。原生的类型或简单数据类型(比如整型和字符串)因为没有相关属性,它会完全用参数值来替代。然而,如果传入一个复杂的对象,行为就会有一点不同了。比如:

<insert id="insertUser" parameterType="User"> 
 insert into users (id, username, password) 
 values (#{id}, #{username}, #{password}) 
</insert> 

如果 User 类型的参数对象传递到了语句中,id、username 和 password 属性将会被查找,然后将它们的值传入预处理语句的参数中。

4、多参数传递

MyBatis中的映射语句有一个parameterType属性来制定输入参数的类型。如果我们想给映射语句传入多个参数的话,我们可以将所有的输入参数放到HashMap中,将HashMap传递给映射语句。MyBatis 还提供了另外一种传递多个输入参数给映射语句的方法。假设我们想通过给定的name和email信息查找学生信息,定义查询接口如下:

Public interface StudentMapper 
{ 
    List<Student> findAllStudentsByNameEmail(String name, String email); 
} 

MyBatis 支持将多个输入参数传递给映射语句,并以#{param}的语法形式引用它们:

<select id="findAllStudentsByNameEmail" resultMap="StudentResult"> 
    select stud_id, name,email, phone from Students 
            where name=#{param1} and email=#{param2} 
</select> 

这里#{param1}引用第一个参数name,而#{param2}引用了第二个参数email

还可以使用 @Param 注解来给参数命名,定义查询接口如下:

Public interface StudentMapper 
{ 
    List<Student> findAllStudentsByNameEmail(@Param("name") String name, @Param("email") String email); 
}

MyBatis 配置文件可以直接使用命名的参数,如下配置:

	<select id="findAllStudentsByNameEmail" resultMap="StudentResult"> 
    select stud_id, name,email, phone from Students 
            where name=#{name} and email=#{email} 
	</select> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值