第一种方式:直接将SQL语句写在接口类里,如:
@Mapper public interface UserMapper { ... @Select(" select * from mc_user where name=#{name} and pswd=#{pswd} ") User findByNamePswd(@Param("name") String name, @Param("pswd") String pswd); ... }
此方式优势:简洁,对于短SQL很合适。
劣势:对于长SQL很不合适,当把有子查询和各种连接的SQL做成长长一句后,维护起来是不讨好的。
第二种方式:将SQL写到一个特定的类里,如:
@Mapper public interface ReputationMapper { @SelectProvider(type=ReputationMapperSql.class,method="getQueryDeadAllSql") List<Reputation> queryDeadAll(); }
ReputationMapperSql类:
public class ReputationMapperSql { public String getQueryDeadAllSql() { StringBuilder sb=new StringBuilder(); sb.append(" select "); sb.append(" a.id, "); sb.append(" a.name, "); sb.append(" a.brief, "); sb.append(" a.deleted, "); sb.append(" to_char(a.create_time,'yyyy-mm-dd hh24:mi:ss') as ctime, "); sb.append(" b.name as creater "); sb.append(" from ( select * from mc_reputation where deleted=1 ) a "); sb.append(" left join mc_user b "); sb.append(" on a.create_uid=b.id "); sb.append(" order by a.id "); String sql=sb.toString(); return sql; } }
此方式优势:挺适合写长的复杂SQL。
劣势:可能导致SQL分散到诸多类中,不集中,另可能被XML派诟病又回到JDBC时代。
第三种方式即坊间用得最多的**Mapper.xml
首先告诉SpringBoot到哪里去找Mapper.xml文件(下面定义是放在resource目录的子目录mapperxml里):
mybatis-plus: mapperLocations: classpath:mapperxml/*Mapper.xml
然后把文件内容和接口类对应上:
文件内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.hy.myapp.mapper.ReputationMapper"> <!-- 查询活的全部成名 --> <select id="queryAliveAll" resultType="com.hy.myapp.Entity.Reputation"> select a.id, a.name, a.brief, a.deleted, to_char(a.create_time,'yyyy-mm-dd hh24:mi:ss') as ctime, b.name as creater from ( select * from mc_reputation where deleted=0 ) a left join mc_user b on a.create_uid=b.id order by a.id </select> </mapper>
接口类:
@Mapper public interface ReputationMapper { ...... /** * 查询活的(deleted=0)全部成名 * @return */ List<Reputation> queryAliveAll(); ...... }
此方式优势:受众广泛,资料也多。
此方式劣势:标签毕竟不如Java语句灵活。
另外还有一种lamda方式请见https://www.cnblogs.com/heyang78/p/15369564.html,具体用哪种,由您自己做主。
2021年10月28日21点26分