Mybatis 升级 Mybatis Plus 重写 Mybatis Plus selectList,如果将参数传到 Mapp.xml 中


Mybatis 升级 Mybatis Plus
将实体做为条件参数 带到Mapp.xml 中的自定义SQL

Mybatis 写法

通过 pagehelper 进行分页

Entity

public class ActivityTracking  implements Serializable {

    private static final long serialVersionUID = -1794277981889967750L;

    /**
     *主健ID
     */
    private String  id;
    /**
     *行为类型编码
     */
    private String  typeCode;
    /**
     *行为类型名称
     */
    private String  typeName;
    /**
     *行为方式(Add、Update、Delete)
     */
    private String  activityMethodCode;
    /**
     *行为方式(新增、修改、删除)
     */
    private String  activityMethodName;

    ......get\set
}

Mapper

@Repository
public interface ActivityTrackingMapper {

    /**
     * 获取 日志列表
     *
     * @return
     */
    List<ActivityTracking> list(ActivityTracking activityTracking);
}

Service

import com.github.pagehelper.PageInfo;
import com.vipsoft.api.base.entity.ActivityTracking;
import com.vipsoft.api.base.util.PageParam;

public interface IActivityTrackingService { 
    /**
     * 获取 日志列表
     *
     * @return
     */
    PageInfo list(PageParam pageParam, ActivityTracking activityTracking);

}



@Service
public class ActivityTrackingServiceImpl implements IActivityTrackingService {
    /**
     * 获取 日志列表
     *
     * @param pageParam
     * @return
     */
    @Override
    public PageInfo list(PageParam pageParam, ActivityTracking activityTracking) {
        PageHelper.startPage(pageParam);
        List<ActivityTracking> activityTrackingList = trackingMapper.list(activityTracking);
        return new PageInfo(activityTrackingList);
    }

}

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.vipsoft.api.base.bisiness.mapper.ActivityTrackingMapper">
    <resultMap id="BaseResultMap" type="com.vipsoft.api.base.entity.ActivityTracking">
        <id column="id" property="id" jdbcType="VARCHAR"/>
        <result column="type_code" property="typeCode" jdbcType="VARCHAR"/>
        <result column="type_name" property="typeName" jdbcType="VARCHAR"/>
        <result column="activity_method_code" property="activityMethodCode" jdbcType="VARCHAR"/>
        <result column="activity_method_name" property="activityMethodName" jdbcType="VARCHAR"/>
        <result column="business_table" property="businessTable" jdbcType="VARCHAR"/>
        <result column="business_table_key" property="businessTableKey" jdbcType="VARCHAR"/>
        ....
    </resultMap>

    <select id="list" resultType="com.vipsoft.api.base.entity.ActivityTracking">
        select * from sys_activity_tracking
        <where>
            <if test="typeName != null and typeName != ''">
                AND type_name = #{typeName,jdbcType=VARCHAR}
            </if>
            <if test="businessKey != null and businessKey != ''">
              AND business_key = #{businessKey,jdbcType=VARCHAR}
            </if>
        </where>
    </select>
</mapper>

Test


@SpringBootTest
public class DemoTest {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private IActivityTrackingService activityTrackingService;

    @Test
    void listTest() {
        ActivityTracking activityTracking = new ActivityTracking();
        activityTracking.setTypeName("A"); //将条件传到 Mapper.xml 中,构建SQL
        PageParam pageParam = new PageParam();
        pageParam.setPageNum(1);
        pageParam.setPageSize(10);
        PageInfo pageList = activityTrackingService.list(pageParam, activityTracking);
        logger.info("List: {}", JSON.toJSON(pageList));
    }
}

Mybatis Plus

Mybatis 不用自定义SQL的话,可以不用 Mapper.xml

Entity

不需要改变。如果使用框架方法,需要加上 @TableName、@TableId、@TableField 等属性

Mapper

//@Repository  使用 Mybatis Plus 可以不用 @Repository
public interface ActivityTrackingMapper extends BaseMapper<ActivityTracking> {
  //page对应的 selectList 方法,所以 XML中的 select id 名称要写对

   //自定义SQL.带分页
   IPage<ActivityTracking> list(Page<ActivityTracking> page, String memberId);
}

Service

public interface IActivityTrackingService extends IService<ActivityTracking> {
    //不需要定义接口,使用框架中的服务接口 => page
	

   IPage<ActivityTracking> list(Page<ActivityTracking> page, String memberId);
}

@Service
public class ActivityTrackingServiceImpl extends ServiceImpl<ActivityTrackingMapper, ActivityTracking> implements IActivityTrackingService {
    //重写框架的方法,不需要实现
 
    
    @Autowired
    private ActivityTrackingMapper trackingMapper;
	
	//自定义
    @Override
    public IPage<ActivityTracking> list(Page<ActivityTracking> page, String memberId){
        IPage<ActivityTracking> pageList = trackingMapper.list(page,memberId);
        List<ActivityTracking> list=pageList.getRecords();
        for (ActivityTracking item : list) {
            if (list.size() == 1) {
                item.setIsDefault(1);
            }
            item.setIsRegistrant(0);
            if (item.getId().equals(memberId)) {
                item.setIsRegistrant(1);
            }
            //计算年龄
            if (ObjectUtil.isNotEmpty(item.getBirthday())) {
                int age = DateUtil.ageOfNow(item.getBirthday());
                item.setAge(age);
            }
        }
        //如果佩戴人中一个默认的都没有,本人设为默认选中
        if (list.size() > 0) {
            boolean hasDefault = list.stream().anyMatch(item -> item.getIsDefault() != null && item.getIsDefault().intValue() == 1);
            if (!hasDefault) {
                list.stream().filter(item -> item.getIsRegistrant().intValue() == 1).forEach(item -> item.setIsDefault(1));
            }
        }
        return pageList;
    }
}

Mapper.xml

ew.entity.typeName 这步是重点。不这样写,取不到前面的参数
#{memberId,jdbcType=VARCHAR} 不要加 , jdbcType=VARCHAR 否则查不出来

<!-- 重写 selectList  这边的ID 不能写错,否则就不能重写框架的实现了 -->
<select id="selectList" resultType="com.vipsoft.api.base.entity.ActivityTracking">
    select * from sys_activity_tracking
    <where>
        <if test="ew.entity.typeName != null and ew.entity.typeName != ''">
            AND type_name = #{ew.entity.typeName,jdbcType=VARCHAR}
        </if>
        <if test="ew.entity.businessKey != null and ew.entity.businessKey != ''">
            AND business_key = #{ew.entity.businessKey,jdbcType=VARCHAR}
        </if>
    </where>
</select>

<select id="list" resultType="com.vipsoft.api.base.entity.MemberFamily">
     SELECT id,phone_no,real_name,birthday,gender,create_time,update_time,0 as is_default,is_deleted,status
     from  member AS er where er.id = #{memberId}  and er.is_deleted= 0
     union
     SELECT id,phone_no,real_name,birthday,gender,create_time,update_time,is_default,is_deleted,status
     from member_family AS ly where ly.member_id = #{memberId}  and ly.is_deleted = 0
</select>

Test


@SpringBootTest
public class DemoTest {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private IActivityTrackingService activityTrackingService;

    @Test
    void plusListTest() {
        // 这一步是重点。配合XML中的。ew.entity.typeName 取值
        ActivityTracking activityTracking = new ActivityTracking();
        activityTracking.setTypeName("A"); //将条件传到 Mapper.xml 中,构建SQL
        QueryWrapper<ActivityTracking> queryWrapper = new QueryWrapper<>(activityTracking);
        // 如果用自定义SQL.不能以这种形式传参,否则会报  org.apache.ibatis.ognl.NoSuchPropertyException: com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.XXX
        // queryWrapper.like("type_name", "A");
        Page page = new Page(1, 10);
        IPage pageList = activityTrackingService.page(page, queryWrapper);
        logger.info("List: {}", JSON.toJSON(pageList));
    }
}
posted @ 2024-12-19 13:50  VipSoft  阅读(173)  评论(0)    收藏  举报