mapper.xml 常用写法
映射文件中有很多属性,常用的就是parameterType(输入类型)、resultType(输出类型)、resultMap()、rparameterMap()。
- parameterType(输入类型) 项目常用类型 通过id查找或删除列表 一般输入类型为int string
-
<deleteid="deleteByAppId"parameterType="INTEGER">
- 如果是通过条件查找列表 一般是
<selectid="pageQuery"parameterType="java.util.HashMap"resultMap="ConsignAdjustResultMap">
- 如果是添加或者更新实体
<insertid="add"parameterType="com.dhc.fastersoft.entity.order.ConsignAdjust">
1、#{}与${}
<!-- 根据名称模糊查询用户信息 --> 2 <select id="selectUserByName" parameterType="string" resultType="user"> 3 select * from user where username like '%${value}%' 4 </select>
#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。
如果本例子使用 #{} 则传入的字符串中必须有 % 号,而 % 是人为拼接在参数中,显然有点麻烦,如果采用 ${} 在 sql 中拼接为 % 的方式则在调用 mapper 接口传递参数就方便很多。
--resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。column:指定唯 一标识用户信息的列 javaType:映射到user的哪个属性 property:java 实体属性名称。 一般数据量3个就够用了,int String double 如果是时间日期,我习惯用字符串,添加与读取进行to_date与to_char 进行格式处理,这样就不用前端进行转换。
property | 映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同 的 JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称 property 的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你 可以这样映射一些东西: “username” ,或者映射到一些复杂的东西: “address.street.number” 。 |
column | 从数据库中得到的列名,或者是列名的重命名标签。这也是通常和会 传递给 resultSet.getString(columnName)方法参数中相同的字符串。 |
javaType | 一个 Java 类的完全限定名,或一个类型别名(参考上面内建类型别名 的列表) 。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。 然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证所需的行为。 |
jdbcType | 在这个表格之后的所支持的 JDBC 类型列表中的类型。JDBC 类型是仅 仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC jdbcType 的需要,而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定 这个类型-但仅仅对可能为空的值。 |
resultMap | 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。 |
动态 SQL
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
-
if 动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:
<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> </select>
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mappernamespace="com.dhc.fastersoft.dao.consignment.ConsignAdjustDao">
<resultMaptype="com.dhc.fastersoft.entity.order.ConsignAdjust"id="ConsignAdjustResultMap">
<resultproperty="id" column="N_ID" javaType="int" jdbcType="INTEGER"/>
<resultproperty="routeId" column="V_ROUTEID" javaType="String" jdbcType="VARCHAR"/>
<resultproperty="amount" column="N_AMOUNT" javaType="double" jdbcType="DOUBLE"/> <resultproperty="act" column="D_ACT" javaType="String"jdbcType="TIMESTAMP"/>
</resultMap>
--oracle 分页查询
select * from ( select row_.*, rownum rownum_ from (select * from t_dealer_order ) row_ where rownum <= 20) where rownum_ > 10
<selectid="pageQuery"parameterType="java.util.HashMap"resultMap="ConsignAdjustResultMap">
${start}
SELECT
A.N_ID id,to_char(A.D_ACT,'YYYY/MM/DD') act
from T_DEALER_CONSIGN_ADJUST A
where 1=1
<iftest="routeId!=null and routeId!=''">
and V_ROUTEID=#{routeId,jdbcType=VARCHAR}
</if>
/*<if test="routeId!=null and routeId!=''">
and V_ROUTEID LIKE '%${routeId,jdbcType=VARCHAR}%'
</if>*/
<iftest="(timeStart!=null and timeStart!='') and (timeEnd==null or timeEnd=='')">
AND to_date(to_char(D_ACT,'YYYY-MM-DD'),'YYYY-MM-DD') >= to_date('${timeStart}','YYYY-MM-DD')
</if>
<iftest="(timeStart==null or timeStart=='') and (timeEnd!=null and timeEnd!='')">
AND to_date(to_char(D_ACT,'YYYY-MM-DD'),'YYYY-MM-DD')<![CDATA[ <= ]]> to_date('${timeEnd}','YYYY-MM-DD')
</if>
<iftest="(timeStart!=null and timeStart!='') and (timeEnd!=null and timeEnd!='')">
AND to_date(to_char(D_ACT,'YYYY-MM-DD'),'YYYY-MM-DD') BETWEEN to_date('${timeStart}','YYYY-MM-DD') AND to_date('${timeEnd}','YYYY-MM-DD')
</if>
order by A.N_ID DESC
${end}
</select>
<selectid="getConsignAdjust"parameterType="String resultType="com.dhc.fastersoft.entity.order.ConsignAdjust">
SELECT
A.N_ID id,A.V_ROUTEIDrouteId,A.V_ROUTENAME routeName,A.V_USERID userId,A.V_USERNAME userName,
A.V_NOTE note,A.V_FILEID fileId,F.V_FILE_NAME fileName, A.V_STATE state,A.D_ACT act,A.N_NUMnum,A.N_AMOUNT amount,A.N_PROD_AMOUNT prodAmount
,A.N_USED_AMOUNT usedAmount,A.N_UNPAID_AMOUNT unpaidAmount,A.N_SALE_AMOUNT saleAmount
from T_DEALER_CONSIGN_ADJUST A ,T_DEALER_DICT_FILE F
where N_ID=#{appId} AND
A.V_FILEID=F.V_ID(+)
</select>
<selectid="getRecordCount"parameterType="java.util.HashMap"resultType="int">
SELECT COUNT(0) FROM T_DEALER_CONSIGN_ADJUST
where 1=1
</select>
<insertid="add"parameterType="com.dhc.fastersoft.entity.order.ConsignAdjust">
--添加之后需要返回主键ID
<selectKeyresultType="INTEGER"order="BEFORE"keyProperty="id">
SELECT SEQ_CONSIGN_ADJUST.NEXTVAL as id from DUAL
</selectKey>
INSERT INTO T_DEALER_CONSIGN_ADJUST (
N_ID,
V_ROUTEID,
V_ROUTENAME,
V_USERID,
V_USERNAME,
V_NOTE,
V_FILEID,
D_ACT,
V_STATE,
N_NUM,
N_AMOUNT,
N_PROD_AMOUNT,
N_USED_AMOUNT,
N_UNPAID_AMOUNT,
N_SALE_AMOUNT
) VALUES (
#{id},
#{routeId,jdbcType=VARCHAR},
#{routeName,jdbcType=VARCHAR},
#{userId,jdbcType=VARCHAR},
#{userName,jdbcType=VARCHAR},
#{note,jdbcType=VARCHAR},
#{fileId,jdbcType=VARCHAR},
sysdate,
#{state,jdbcType=VARCHAR},
#{num,jdbcType=INTEGER},
#{amount,jdbcType=DOUBLE},
#{prodAmount,jdbcType=DOUBLE},
#{usedAmount,jdbcType=DOUBLE},
#{unpaidAmount,jdbcType=DOUBLE},
#{saleAmount,jdbcType=DOUBLE}
)
</insert>
<updateid="update"parameterType="com.dhc.fastersoft.entity.order.ConsignAdjust">
UPDATE T_DEALER_CONSIGN_ADJUST SET
V_USERID=#{userId,jdbcType=VARCHAR},
V_USERNAME=#{userName,jdbcType=VARCHAR},
V_NOTE=#{note,jdbcType=VARCHAR},
D_ACT=sysdate, ---to_date(act,'yyyy/MM/dd HH:mm:ss')
N_NUM=#{num,jdbcType=INTEGER},
N_PROD_AMOUNT=#{prodAmount,jdbcType=DOUBLE},
N_AMOUNT=#{amount,jdbcType=DOUBLE},
N_USED_AMOUNT=#{usedAmount,jdbcType=DOUBLE},
N_UNPAID_AMOUNT=#{unpaidAmount,jdbcType=DOUBLE},
V_STATE=#{state,jdbcType=VARCHAR},
N_SALE_AMOUNT=#{saleAmount,jdbcType=DOUBLE}
<iftest="fileId!=null and fileId!=''">
,V_FILEID=#{fileId,jdbcType=VARCHAR}
</if>
WHERE N_ID=${id}
</update>
<deleteid="deleteByAppId"parameterType="INTEGER">
DELETE FROM T_DEALER_CONSIGN_ADJUST_PROD
WHERE N_APPID=#{appid}
</delete>
</mapper>