mybatis的xml文件 和sql常见报错

常见问题

1.mybatis文件模板
2.mybatis中xml有哪些标签
3.insert,select,delete,update语句写法
4.表名或者字段名不同处理
5.foreach,if test,sql include标签
6.时间标签
本例子都是在Oracle数据库情况下,MySQL与Oracle中sql语句有很多不同点,但是最终mybatis方法是相同的
1.mybatis文件模板

xml文件模板添加文件规范,以及mapper标签下放命名空间,每一个mapper文件使用不同的命名空间,根据命名空间和id对应到每个sql

<?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="com.example.demo.mapper.FicoMapper">
</mapper>
2.mybatis中xml有哪些标签
select,insert,delete,update,resultMap,result,id,if,foreach,collection,sql,include
3.insert,select,delete,update语句写法

insert

 <insert id="insert" parameterType="com.example.demo.Entity.CreditFicoData">
        INSERT INTO T_CREDIT_FICO_C1_DATA(
          ID,
          QUERY_ID
        )values (
          #{id,jdbcType=VARCHAR},
          #{queryId,jdbcType=VARCHAR}
        )
    </insert>

    <insert id="saveall" parameterType="java.util.List">
        INSERT ALL
        <foreach collection="list" item="item" index="index" separator="">
            INSERT INTO T_CREDIT_FICO_C1_DATA(
            ID,
            QUERY_ID
            )values (
            #{item.id,jdbcType=VARCHAR},
            #{item.queryId,jdbcType=VARCHAR}
            )
        </foreach>
        SELECT 1 FROM DUAL
    </insert>

update

    <update id="updatedata" parameterType="com.example.demo.Entity.CreditFicoData">
        UPDATE T_CREDIT_FICO_C1_DATA
        <set>
            name = #{name,jdbcType=VARCHAR},
            <if test="identity != null">
                IDENTITY = #{identity,jdbcType=VARCHAR},
            </if>
        </set>
        WHERE ID = #{id,jdbcType=BIGINT}
    </update>

select

    <select id="findbyName" parameterType="String" resultMap="FicoResultMap">
        select
        *
        from T_CREDIT_FICO_C1_DATA where
        1 = 1
        <if test="name != null">
            and name = #{name,jdbcType=VARCHAR}
        </if>
    </select>
4.表名或者字段名不同处理

sql语句里面使用as作为别名,或者使用resultMap映射

<resultMap id="FicoResultMap" type="com.example.demo.Entity.CreditFicoData">
    <result column="ID" property="id" jdbcType="VARCHAR" />
    <result column="NAME" property="name" jdbcType="VARCHAR" />
</resultMap>
5.foreach,if test,sql include标签

sql include标签做替换使用,直接替换sql语句中的值,其他标签见上文

<sql id="zhengxPublicWhere">
    WHERE 1=1
    AND t.UUID = #{uuid,jdbcType=VARCHAR}
</sql>
<include refid="zhengxPublicWhere"/>
6.时间标签
 AND TO_CHAR(CREATED_DT, 'yyyy-mm-dd') = TO_CHAR(#{queryTime,jdbcType=TIMESTAMP}, 'yyyy-mm-dd')
 <result column="CREATED_DT" property="createdDt" jdbcType="OTHER" />
  t.CREATED_DT >= #{createdDt,jdbcType=TIMESTAMP}
  TO_CHAR(t.CREATED_DT , 'yyyy-mm-dd hh24:mi')>=#{startTime}
7.日常报错

1.sql injection violation, syntax error: syntax error, expect CALL, actual IDENTIFIER, pos 292, line 4, column 95, token IDENTIFIER uuid
SQL如下:UUID = # {UUID,jdbcType=VARCHAR}
其中输入值uuid为小写,并且#与{}之间有空格导致,
修改后:UUID = #{uuid,jdbcType=VARCHAR}

2.Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
SQL返回多条数据,返回为resulType对象类型;添加过滤或修改返回

3.java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
mybatis中SQL语句单独执行没问题,但是程序报错SQL 命令未正确结束;mybatis中mapper文件sql结尾不能加分号

4.Caused by: org.apache.ibatis.binding.BindingException: Parameter 'processCode' not found. Available parameters are [productCode, param1]
mybatis中的BindingException,结果发现字段processCode是String类型,复制时复制错了导致复制成了Date类型
dao层入参填写不一致,报错(@Param("productCode") String processCode)

5.java.sql.SQLSyntaxErrorException: ORA-00904: "PANME": 标识符无效
字段名称写错,数据库里是PNAME,这里写成了PANME

posted @ 2022-10-09 16:07  yorkiiz  阅读(489)  评论(0编辑  收藏  举报