java注解动态sql,mybatis的注解开发之三种动态sql

本文介绍了如何在MyBatis中使用注解和内部类实现动态SQL,以提高Java代码的可读性和维护性。通过@SelectProvider和内部类的方式,避免了长SQL在XML中的不便,同时对比了结构化SQL的优缺点。这种方法在处理复杂SQL时可能受限,但对简单查询非常有效。文章提供了实例代码,并建议根据实际需求选择合适的动态SQL实现。
摘要由CSDN通过智能技术生成

脚本sql

XML配置方式的动态SQL是用

@Select("")

public List findUserById(User user);

很明显,在java中写xml可读性和维护性太差,尤其当SQL很长时,这样写是很痛苦的。

在方法中构建sql

dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider

@Mapper

public interface MybatisDao {

//使用UserDaoProvider类的findUserById方法来生成sql

@SelectProvider(type = UserDaoProvider.class, method = "findUserById")

public List findUserById(User user);

class UserDaoProvider {

public String findUserById(User user) {

String sql = "SELECT * FROM user";

if(user.getId()!=null){

sql += " where id = #{id}";

}

return sql;

}

}

这比

结构化SQL

public String findUserById(User user) {

return new SQL(){{

SELECT("id,name");

SELECT("other");

FROM("user");

if(user.getId()!=null){

WHERE("id = #{id}");

}

if(user.getName()!=null){

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

}

//从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接

}}.toString();

}

这是把前面的内部类改造一下

SELECT:表示要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT会智能的进行合并而不会重复 FROM和WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错 这样语句适用于写很长的SQL时,能够保证SQL结构清楚。便于维护,可读性高。但是这种自动生成的SQL和HIBERNATE一样,在实现一些复杂语句的SQL时会束手无策。所以需要根据现实场景,来考虑使用哪一种动态SQL 上面的例子只是最基本的用法:更多详细用法,参考mybatis中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值