mysql映射器_使用注解配置SQL映射器

现在让我们来看一个使用@SelectProvider注解来创建一个简单的SELECT映射语句的例子。

创建一个TutorDynaSqlProvider.java类,以及findTutorByIdSql()方法,如下所示:

package com.mybatis3.sqlproviders;

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider

{

public String findTutorByIdSql(int tutorId)

{

return "SELECT TUTOR_ID AS tutorId, NAME, EMAIL FROM TUTORS

WHERE TUTOR_ID=" + tutorId;

}

}

在TutorMapper.java接口中创建一个映射语句,如下:

@SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql")

Tutor findTutorById(int tutorId);

这里我们使用了@SelectProvider来指定了一个类,及其内部的方法,用来提供需要执行的SQL语句。

但是使用字符串拼接的方法唉构建SQL语句是非常困难的,并且容易出错。所以MyBaits提供了一个SQL工具类不使用字符串拼接的方式,简化构造动态SQL语句。

现在,让我们看看如何使用org.apache.ibatis.jdbc.SQL工具类来准备相同的SQL语句。

package com.mybatis3.sqlproviders;

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider

{

public String findTutorByIdSql(final int tutorId)

{

return new SQL()

{

{

SELECT("tutor_id as tutorId, name, email");

FROM("tutors");

WHERE("tutor_id=" + tutorId);

}

} .toString();

}

}

SQL工具类会处理以合适的空格前缀和后缀来构造SQL语句。

动态SQL provider方法可以接收以下其中一种参数:

ž 无参数

ž 和映射器Mapper接口的方法同类型的参数

ž java.util.Map

如果SQL语句的准备不取决于输入参数,你可以使用不带参数的SQL Provider方法。

例如:

public String findTutorByIdSql()

{

return new SQL()

{

{

SELECT("tutor_id as tutorId, name, email");

FROM("tutors");

WHERE("tutor_id = #{tutorId}");

}

} .toString();

}

这里我们没有使用输入参数构造SQL语句,所以它可以是一个无参方法。

如果映射器Mapper接口方法只有一个参数,那么可以定义SQLProvider方法,它接受一个与Mapper接口方法相同类型的参数。

例如映射器Mapper接口有如下定义:

Tutor findTutorById(int tutorId);

这里findTutorById(int)方法只有一个int类型的参数。我们可以定义findTutorByIdSql(int)方法作为SQL provider方法。

public String findTutorByIdSql(final int tutorId)

{

return new SQL()

{

{

SELECT("tutor_id as tutorId, name, email");

FROM("tutors");

WHERE("tutor_id=" + tutorId);

}

} .toString();

}

如果映射器Mapper接口有多个输入参数,我们可以使用参数类型为java.util.Map的方法作为SQLprovider方法。然后映射器Mapper接口方法所有的输入参数将会被放到map中,以param1,param2等等作为key,将输入参数按序作为value。你也可以使用0,1,2等作为key值来取的输入参数。

@SelectProvider(type = TutorDynaSqlProvider.class,

method = "findTutorByNameAndEmailSql")

Tutor findTutorByNameAndEmail(String name, String email);

public String findTutorByNameAndEmailSql(Map map)

{

String name = (String) map.get("param1");

String email = (String) map.get("param2");

//you can also get those values using 0,1 keys

//String name = (String) map.get("0");

//String email = (String) map.get("1");

return new SQL()

{

{

SELECT("tutor_id as tutorId, name, email");

FROM("tutors");

WHERE("name=#{name} AND email=#{email}");

}

} .toString();

}

SQL工具类也提供了其他的方法来表示JOINS,ORDER_BY,GROUP_BY等等。

让我们看一个使用LEFT_OUTER_JOIN的例子:

public class TutorDynaSqlProvider

{

public String selectTutorById()

{

return new SQL()

{

{

SELECT("t.tutor_id, t.name as tutor_name, email");

SELECT("a.addr_id, street, city, state, zip, country");

SELECT("course_id, c.name as course_name, description,

start_date, end_date");

FROM("TUTORS t");

LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id");

LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id");

WHERE("t.TUTOR_ID = #{id}");

}

} .toString();

}

}

public interface TutorMapper

{

@SelectProvider(type = TutorDynaSqlProvider.class,

method = "selectTutorById")

@ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult")

Tutor selectTutorById(int tutorId);

}

由于没有支持使用内嵌结果ResultMap的一对多关联映射的注解支持,我们可以使用基于XML的配置,然后与@ResultMap映射。

使用了动态的SQL provider,我们可以取得讲师及其地址和课程明细。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值