mybatis使用问题记录

以下方法都是指mybatis中的xml查询方法。

查询语句结尾不要加分号,否则会报错

like时不能将传参之间放入单引号,而需要将参数用concat和%拼接起来,否则会报参数映射超出索引范围错误

<if test="queryParam.questionTypeTreePath != null and queryParam.questionTypeTreePath !=  ''">
	and t2.parent_path like concat(#{queryParam.questionTypeTreePath,jdbcType=VARCHAR},'%')
</if>

报错信息:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='pageSize', mode=IN, javaType=class java.lang.Integer, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #3 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

报错信息是找不到任何questionTypeTreePath这个地方错误的,而你根据错误提示去检查pageSize附近代码也查不出任何问题的,所以需要特别小心。

jdbcType要全大写,如VARCHAR不能写成varchar

jdbcType不要省略,不然为null值时会报错

mybatis的xml中重复性的代码(sql或xml都行),都可以抽出来单独建一个抽出来的代码,调用的地方使用即可,不需要继承。

resultMap和方法都是可以跨mapper namespace调用的,不需要继承,直接namespace.方法ID

可以将resultMap的type属性设置成java.util.LinkedHashMap,用来返回一个Map,有时候查询出来的数据不想使用vo类时使用。

不可以直接将resultType设置成java.util.LinkedHashMap,用来返回一个map,这样做不会报错,但存进去的属性名称全是大写。可以在查询列使用as 属性名称解决。

方法中可以使用多个sql语句,多个语句用分号分隔。但不能使用mysql数据库时使用多个selete语句。

循环可以使用mybatis循环,也可以使用oracle循环,根据情况做选择,mybatis循环java对象,oracle循环sql结果集。

方法中可以使用commit进行手动显示提交事务。

mybatis常用方法标签有:<select>、<update>、<insert>、<delete>、<sql>。其中,<sql>是不能定义到java接口里去的。

插入时返回自增的主键:

keyProperty是Java对象的属性名!注意,不管是oracle还是mysql,都不是直接返回id,而是给实体类对象的id属性设置id
mysql

void insert(User user);
<insert id="insert" parameterType="com.entity.Info" useGeneratedKeys="true" keyProperty="infoId">
</insert>

oracle

void insert(@Param("u") User user);
<insert id="insert" parameterType="com.tang.User">
	<selectKey resultType="java.lang.Long" order="BEFORE" keyProperty="u.id">  
		select user_s.nextval as id from dual
	</selectKey>
	insert into user_t(id,name) values (#{u.id,jdbcType=NUMERIC},#{u.name,jdbcType=VARCHAR})
</insert>

日期比较

字符串类型日期判断:
oracle:

<if test="createTimeStart != null and createTimeStart != ''">
	and to_date(create_time,'yyyy-mm-dd hh24:mi:ss') &gt;= to_date(#{createTimeStart}||' 00:00:00','yyyy-mm-dd hh24:mi:ss')
</if>
<if test="createTimeEnd != null and createTimeEnd != ''">
	and to_date(create_time,'yyyy-mm-dd hh24:mi:ss') &lt;= to_date(#{createTimeEnd}||' 23:59:59','yyyy-mm-dd hh24:mi:ss')
</if>

mysql:

<if test="queryParam.createTimeStart != null and queryParam.createTimeStart != ''">
	and t1.create_time &gt;= str_to_date(#{queryParam.createTimeStart},'%Y-%m-%d %H:%i:%s')
</if>
<if test="queryParam.createTimeEnd != null and queryParam.createTimeEnd != ''">
	and t1.create_time &lt; str_to_date(#{queryParam.createTimeEnd},'%Y-%m-%d %H:%i:%s')
</if>

只比较年月日:

<if test="createDate != null">
	and to_date(to_char(t1.create_date,'yyyy-mm-dd'),'yyyy-mm-dd') = to_date(to_char(#{params.createDate,jdbcType=TIMESTAMP},'yyyy-mm-dd'),'yyyy-mm-dd'),
</if>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值