• mybatis用法总结


    一.设置的resutType为Integer/Double类时

    此时java接收的对象即可以是单个对象,也可以是List对象,具体如下:

    //dao文件
    List<Integer> selectNotTest();
    Double selMaxRetracement(@Param(value = "account") Integer account);
    
    //xml文件
    <!--查询非test账号集合-->
    <select id="selectNotTest" resultType="Integer">
        select distinct(account) from mt4list_rel
    </select>
    <!--查询账号得最大回撤值-->
    <select id="selMaxRetracement" resultType="Double">
        select MaxRetracement from retracement_index where Account=#{account}
    </select>
    

    二.设置的resultType为hashmap时设置

    此时mapper文件中设置的resultType为hashmap,java中具体接收的是Map,同时返回的数据中,key为select语句中设置的别名,value为计算的数值,比如:下面的语句中,map中的一个key-value会是如下:key--allOrderNum,value--count(*)计算出来的数值

    //dao文件
    Map<String,Object> selectAccountDeatail(@Param(value = "account")String table);
    
    //xml文件
    <!--查询账户的总订单数,总手数,平仓总盈亏,平均手数-->
    <select id="selectAccountDeatail" resultType="hashmap">
        select count(*) as allOrderNum,sum(Volume) as allVolumes,sum(profit) as historyProfit,sum(Volume)/count(*) as avgVolume from ${account} where cmd in ('buy','sell')
    </select>
    

    三.返回实体类得时候封装成resultMap

    resultType与resultMap只能存在一个,用resultMap将数据库的字段与实体类进行匹配,然后返回的一个List,同事List中的中的元素为数据库表对应的实体类,具体如下:

    //dao文件
    List<CloseOrder> queryCloseOrderByAccount(@Param(value = "list") String[] list);
    
    //xml文件
    <resultMap id="CloseOrderResultMap" type="com.kflh.boxApi.apiNoCheckWestffs.entity.CloseOrder">
        <id column="id" property="id"/>
        <result column="closeorder" property="closeOrder"/>
        <result column="account" property="account"/>
        <result column="symbol" property="symbol"/>
        <result column="cmd" property="cmd"/>
        <result column="Volume" property="volume"/>
        <result column="OpenTime" property="openTime"/>
        <result column="OpenPrice" property="openPrice"/>
        <result column="SL" property="sl"/>
        <result column="TP" property="tp"/>
        <result column="Magic" property="magic"/>
        <result column="Comment" property="comment"/>
        <result column="timestamp" property="timestamp"/>
    </resultMap>
    
    <select id="queryCloseOrderByAccount" resultMap="CloseOrderResultMap">
      select * from closeorder where account in
        <foreach item="item" index="index" collection="list"
                 open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
    

    四.当需要根据某个字段分组并将分组数据返回的时候

    具体用法参照如下链接
    https://www.cnblogs.com/eternityz/p/12284808.html

    //dao文件
    List<CloseOrderList> selectCloseOrderList();
    
    <resultMap id="customResultMap" type="com.kflh.boxApi.chooseSignalSource.entity.CloseOrderList">
        <id property="account" column="account"/>
        <collection property="closeOrderList" ofType="com.kflh.boxApi.chooseSignalSource.entity.CloseOrder">
            <result column="id" jdbcType="INTEGER" property="id"/>
            <result column="closeorder" jdbcType="INTEGER" property="closeOrder"/>
            <result column="account" jdbcType="INTEGER" property="account"/>
            <result column="symbol" jdbcType="VARCHAR" property="symbol"/>
            <result column="cmd" jdbcType="TINYINT" property="cmd"/>
            <result column="Volume" jdbcType="DOUBLE" property="volume"/>
            <result column="OpenTime" jdbcType="INTEGER" property="openTime"/>
            <result column="OpenPrice" jdbcType="DECIMAL" property="openPrice"/>
            <result column="SL" jdbcType="DECIMAL" property="sl"/>
            <result column="TP" jdbcType="DECIMAL" property="tp"/>
            <result column="Magic" jdbcType="INTEGER" property="magic"/>
            <result column="Comment" jdbcType="VARCHAR" property="comment"/>
            <result column="timestamp" jdbcType="INTEGER" property="timestamp"/>
            <result column="Profit" jdbcType="DECIMAL" property="profit"/>
            <result column="ClosePrice" jdbcType="DECIMAL" property="closePrice"/>
            <result column="Digits" jdbcType="TINYINT" property="digits"/>
            <result column="Storage" jdbcType="VARCHAR" property="storage"/>
        </collection>
    </resultMap>
    
    <!--按照指定字段分组并将分组得数据进行返回-->
    <select id="selectCloseOrderList"  resultMap="customResultMap">
        select
         <include refid="Base_Column_List"/>
         from closeorder where account in(select account from mt4list_rel)
    </select>
    

    五.传参得时候可以使用map进行传参

    controller

    @Autowired
    EaQuanXianService eaQuanXianService;
    
    @RequestMapping(value = "insertWestfieldAccountIndex",method = RequestMethod.GET)
    @ResponseBody
    public JsonResult insertWestfieldAccountIndex(String param) {
        String[] arr = param.split("@");
        //账号@本地时间@服务器时间@净值@余额
        if (arr.length != 12) {
            throw new ServiceException(ResultEnum.LOSTPARAMS);
        }
        //初始净值
        String equity=eaQuanXianService.selectEquity(Integer.parseInt(arr[0]));
        Double cha=DoubleCalendar.subtract(arr[2],equity);
        Double profitability= DoubleCalendar.divideFloat(cha.toString(),equity);
    
        Map<String,Object> map=new HashedMap();
        map.put("account",arr[0]);
        map.put("localtime",DateUtil.strToDate(arr[1]));
        map.put("equity",arr[2]);
        map.put("balance",arr[3]);
        map.put("floating",arr[4]);
        map.put("grossProfit",arr[5]);
        map.put("grossLoss",arr[6]);
        map.put("closeVolume",arr[7]);
        map.put("closeOrderNum",arr[8]);
        map.put("tradeVolume",arr[9]);
        map.put("tradeOrderNum",arr[10]);
        map.put("nightInterest",arr[11]);
        map.put("profitability",profitability);
        eaQuanXianService.insertWestfieldAccountIndex(map);
        return new JsonResult();
    }
    

    serviceImpl中的方法

    @Autowired
    EaQuanXianMapper eaQuanXianMapper;
    
    @Override
    public int insertWestfieldAccountIndex(Map<String, Object> map) {
        int num = eaQuanXianMapper.insertWestfieldAccountIndex(map);
        if (num <= 0) {
            throw new ServiceException(ResultEnum.INSERTWESTFIELDACCOUNTINDEXFAILED);
        }
        return num;
    }
    

    dao文件

    int insertWestfieldAccountIndex(Map<String ,Object> map);
    

    xml文件

    <insert id="insertWestfieldAccountIndex">
        insert into westfield_account_index values
        (null,#{account},#{localtime},#{equity},#{balance},#{floating},#{grossProfit},
        #{grossLoss},#{closeVolume},#{closeOrderNum},#{tradeVolume},#{tradeOrderNum},
        #{profitability},#{nightInterest})
    </insert>
    

    总结:
    当从java传map进入mybatis的时候,mybatis需要将map中的具体值取出来,此时就是把map中的key取出来,放入进去即可.也就是说在将参数放入map时得key与mybatis中的取值名称一致
    map.put("equity",arr[2])-->mybatis取出来得时候#{equity}

    六.常规建立实体类,传实体类或者传具体参数

    常规用法

    七.传的参数时List但是其中包含的时Map得时候

    //dao文件
    void insertAccountFilterResultBatch(@Param(value = "list") List<Map<String,Object>> list);
    
    //xml文件
    <insert id="insertAccountFilterResultBatch" parameterType="java.util.List">
        insert into account_filter_results values
            <foreach collection="list" index="index" item="item" separator=",">
                (null,#{item.account},#{item.equity},#{item.inMoney},#{item.outMoney},#{item.createTime},
                #{item.totalProfit},#{item.profitRate},#{item.allOrderNum},#{item.allVolumes},
                #{item.historyProfit},#{item.avgVolume},#{item.maxRetracement},'1',now())
            </foreach>
    </insert>
    

    总结:
    在mybatis的xml文件进行取值得时候,使用foreach标签,签内元素不要使用open及close属性,否则会将所有循环的元素包括进open及close中的大标签中.其中循环体item为Map对象,此时取出其中具体的值得时候需要使用#{item.account},其中account为map中的key

  • 相关阅读:
    vue学习
    BBS登录注册技术点归纳
    BBS项目模态框的使用
    django后台管理系统
    java 之 jsp简介
    http 之 CORS简介
    web 之 session
    linux 之学习路线
    Ubuntu 之 win10更新ubuntu启动项消失
    Web 之 Cookie
  • 原文地址:https://www.cnblogs.com/eternityz/p/12284827.html
Copyright © 2020-2023  润新知