MyBatis (四) 注解和存储过程

来源:互联网 发布:cxax2013车床软件 编辑:程序博客网 时间:2024/06/16 19:56

1. sql 公共片段

<sql id="publicfindemp">        select e.*,depname from employee e ,department d        where d.depid=e.depid</sql>

使用 sql 公共片段:

 <include refid="publicfindemp"/>
 <!--3.1 分页查询和查询所有-->    <select id="findEmloyee" parameterType="PageUtil" resultMap="empMap">        <choose>            <!-- 分页查询 -->            <when test="startrow!=0 and pagesize>0" >                <include refid="publicfindemp"/>                limit #{startrow},#{pagesize}            </when>            <!-- 查询所有 -->            <otherwise>                <include refid="publicfindemp"/>            </otherwise>        </choose>    </select>

2. 存储过程原理

delimiter //create procedure pro_emp(in startrow int,in pagesize int)begin   select e.*,d.depname from employee e,department d    where d.depid=e.depid limit startrow,pagesize;end //delimiter;
delimiter //create procedure proc_emptotalcount(out empcount int)begin    select count(*) into empcount from employee e,department d    where d.depid = e.depid;end//delimiter;

在 mapper.xml 里面这么写:
1)IN

<select id="findByPrimaryKey" parameterMap="paramMap" >>>>注意要写parameterMapstatementType="CALLABLE" >>>>表示是存储过程resultType="com.pojo.Employee">        CALL EmployeeSys.proc_empbyid(?)</select><parameterMap id="paramMap" type="Employee">  <parameter property="empId" mode="IN" jdbcType="INTEGER"/> </parameterMap>

type:封装 java 对象的类型
jdbcType:参数的数据类型,必须是引用数据类型,必须是大写;
mode:存储过程的参数的类型,如果是输入参数则是IN,输出参数则是OUT;
2)OUT

 <select id="getTotalcount"  parameterMap="totalcountMap"  statementType="CALLABLE">      CALL EmployeeSys.proc_emptotalcount(?)  </select><parameterMap id="totalcountMap" type="PageUtil">     <parameter property="totalcount" mode="OUT" jdbcType="INTEGER"/></parameterMap>

3)关于 out 的 测试

        System.out.println("---getTotalcount(PageUtil pageUtil)---");        PageUtil pageUtil1 = new PageUtil(1,2);        mapper.getTotalcount(pageUtil1);        System.out.println(pageUtil1.getTotalcount());

理解:存储过程 out 的是:out 出property=”totalcount”,并且是封装在type=”PageUtil”里面的,所以用pageUtil1.getTotalcount() 来接。select count(*) into empcount ,方法不需要返回值,直接进属性里面捞。

3)注解

在 mapper接口里面直接写sql 语句,就不需要使用 xml 文件了:

 @Select("select * from project") List<Workorder> findName(); // 分页查询 @Select("select w.*,p.projectname from Workorder w,project p where   p.id=w.projectid limit #{startrow},#{pagesize}") List<Workorder> findPage(PageUtil pageUtil);