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