【Mybatis】茴字的四种写法,通过Mybatis操作DB,书写SQL语句的三种方式

第一种方式:直接将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分

 

posted @ 2021-10-28 21:27  逆火狂飙  阅读(290)  评论(0)    收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东