27
2019
03

Mybatis 视图、存储过程

视图的使用:

1.  把视图当普通的表,用select  字段  from 视图 where 的形式。如:

<select id="getListByName" parameterType="java.util.Map" resultMap="Country">

        SELECT DISTINCT countryname FROM `idc_cmdb`.view_city  
        <where>
        <if test="countryname != null">
           countryname LIKE  CONCAT('%', '${countryname}', '%')
        </if>
        </where>
    </select>

2.  like的模糊查询用CONCAT。

3.  #和$传参的区别:#是代替?,是SQL预编译;$只替换值。

一.调用视图

如下就是调用视图来查询收益明细,sql部分如下:

1
2
3
4
5
6
<!-- 获取明细 -->
<select id ="getContactEarnsDetail" resultType= "java.util.Map" parameterType ="java.lang.Integer">
      select
           title,trade_time,trade_amount
      from v_contacts_earn where  user_id = #{userId}
</select >

 该视图返回的数据类型为map。

mapper部分如下:

1
List<Map<String, Object>> getContactEarnsDetail(Integer userId);

 接口部分如下:

List<Map<String, Object>> getContactEarnsDetail(Integer userId);

实现如下:

     @Override     public List<Map<String, Object>> getContactEarnsDetail(Integer userId) {
           Assert. notNull(userId);            return contactEarnsMapper.getContactEarnsDetail(userId);
     }

如上例所示,调用视图如同调用正常的sql查询语句一般。

 

二.调用存储过程

调用存储过程可能还会有返回结果集,在这里我主要针对返回结果集的情况进行阐述。

(1)含有返回结果集

如存储过程结构如下:

p_my_wallet(IN var_user_id INT);
参数是用户id
revenue_today   今日收益
revenue_contacts  人脉收益
balance   可用余额

sql部分如下:

复制代码
<!-- 获取钱包信息 -->
<select id="getMyWallet" parameterType="java.lang.Integer" resultType="java.util.Map" statementType="CALLABLE">{
  call p_my_wallet(
    #{userId,jdbcType=INTEGER,mode=IN}
  )
}</select>
复制代码

 

则mapper部分为:

Map<String, Object> getMyWallet(@Param("userId")Integer userId);

接口部分为:

Map<String, Object> getMyWallet(Integer userId);

 

(2)没有返回结果集

sql部分如下:

  
  < select id= "cardBuild" statementType ="CALLABLE">
     <![CDATA[
         {call p_insert_card_build_info (#{is_customized_,mode=IN,jdbcType=INTEGER},#{face_value_,mode=IN,jdbcType=INTEGER},#{number_,mode=IN,jdbcType=INTEGER})}
     ]]>
  </ select>

MyBatis 调用 view 示例:

java代码

复制代码
@RequestMapping(value = "/testView", method = RequestMethod.GET)    public @ResponseBody String testView(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Map<String, Object> paraMap = new HashMap<String, Object>();
        paraMap.put("userType", "doctor");
        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
        list = procedureMapper.testView(paraMap);        if(list != null && list.size() > 0){            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }        return null;
    }
复制代码

 

mapper

复制代码
package cn.zsmy.mapper;import java.util.List;import java.util.Map;import cn.zsmy.entity.User;import cn.zsmy.form.UserForm;import cn.zsmy.mapper.base.SimpleMapper;import cn.zsmy.tmp.core.MyBatisRepository;/**
 * @ClassName: ProcedureMapper
 * @Description: 调用存储过程与视图
 * @author 师海明
 * @date 2016年6月13日 上午11:52:38
 * 
*/@MyBatisRepositorypublic interface ProcedureMapper extends SimpleMapper<UserForm,User>{
    
    Map<String, Object> testProcedure(Map<String, Object> paraMap);

    List<Map<String, Object>> testView(Map<String, Object> paraMap);
}
复制代码

 

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="cn.zsmy.mapper.ProcedureMapper" >


 <!-- 调用存储过程查询 -->
 <select id="testProcedure" parameterType="java.util.Map" statementType="CALLABLE" resultType="java.util.HashMap">  
      {call loginandreg(
                #{out_ret,mode=OUT,javaType=java.lang.Integer,jdbcType=INTEGER},
              #{out_desc,mode=OUT,javaType=java.lang.String,jdbcType=VARCHAR},
              #{userId,jdbcType=VARCHAR,mode=OUT},
              #{user_pwd,jdbcType=VARCHAR,mode=IN},
              #{nickname,jdbcType=VARCHAR,mode=IN}
          )
       }  </select>
  
  <!-- 调用视图查询 -->
  <select id="testView" parameterType="java.util.Map" resultType="java.util.HashMap">
        select username, nickname, dept from test_view where user_type=#{userType}  </select>
    
</mapper>
复制代码

 

视图

DROP VIEW IF EXISTS `palm_2_0_16`.`test_view`;CREATE VIEW `palm_2_0_16`.`test_view` 
    ASSELECT u.username,u.nickname,d.dept, u.user_type FROM tb_user u, tb_doctor d WHERE d.id=u.id ;


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。