标签:了解 XML www. map tostring 配置 表示 key eth
@Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>") public List<User> findUserById(User user);
很明显,在java中写xml可读性和维护性太差,尤其当SQL很长时,这样写是很痛苦的。
@Mapper public interface MybatisDao { //使用UserDaoProvider类的findUserById方法来生成sql @SelectProvider(type = UserDaoProvider.class, method = "findUserById") public List<User> 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; } }
这比<script>更加清晰,适用于查询语句不是很长、条件不多的场景,SQL很直观。但是在写很长的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(); }
@SelectProvider(type = UserDaoProvider.class, method = "find") public List<Map> find(List list); class UserDaoProvider { public String find(List list) {
这是一个最简单的list传参,但是在运行时会报传参错误。这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字"list",value就是他的值List,要正确传参需要使用key/value结构的map,如下
@SelectProvider(type = UserDaoProvider.class, method = "find") public List<Map> find(List list); class UserDaoProvider { public String find(Map map) { List list = (List) map.get("list");
标签:了解 XML www. map tostring 配置 表示 key eth
原文地址:https://www.cnblogs.com/a8457013/p/9074974.html