MyBatis常见问题汇总
<mapper namespace="对应于Dao层的接口名称"></mapper>
sql语句的正确格式
insert
INSERT
INTO table_name
(column1, column2,...columnN)
VALUES ( value1, value2,...valueN )
mybatis->insert
xml中的语法格式与sql中的类似
insert标签:是插入的意思,默认返回值为数据库影响行数,所以在mybatis中我们不用特意声明返回值类型
if标签:test中填写字段的判断条件,若满足则sql语句拼接if标签中的字段,否则不会拼接
trim标签:这个标签用来拼接我们需要的字段
prefix是前缀的意思,比如下面的插入语句,前面已经有了insert into table_name,接下来我们需要(作为前缀拼接,所以这里放(
suffix为后缀的意思,有了(,我们需要),所以将**)**放在这最后,中间放我们需要的数据库字段
suffixOverrides是当if标签中的判断条件为空时,去掉多余的suffixOverrides标签中所填写的后缀内容(这种情况只有在最后1个或几个if标签中的字段都不满足if标签的判断条件时才会出现)
jdbcType:数据库中该字段的类型
<insert id="对应方法名" parameterType="java中所对应的参数类型">
insert into table_name
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="后端字段名1 != null">
数据库字段名称1,
</if>
<if test="后端字段名2 != null">
数据库字段名称2
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrieds=",">
<if test="后端字段名1 != null">
#{后端字段名1,jdbcType=VARCHAR}
</if>
<if test="后端字段名2 != null">
#{后端字段名2,jdbcType=VARCHAR}
</if>
</trim>
</insert>
delete
DELETE
FROM table_name
where
table_name.var1='字符串1'
and table_name.var2='字符串2'
mybatis->delete
delete默认返回值为影响数据库行数,所以不用写返回类型
注意:
delete一定要判断清楚条件是否为空,若为空可能删掉表中的所有字段
delete在只有一个删除条件时,不能与if标签连用,否则会报错
delete 的where语句中连接符为and不能忘记了,trim标签中的prefix与suffix是在trim标签所包含的一大段内容的最前面与最后面拼接prefix与suffix,所以delete中的and不能使用
<delete id="对应方法名" parameterType="java中所对应的参数类型">
delete
from table_name
where
<trim suffixOverrieds="and">
<if test="后端字段名1 != null">
数据库字段名称1=#{后端字段名1,jdbcType=VARCHAR} and
</if>
<if test="后端字段名2 != null">
数据库字段名称2=#{后端字段名2,jdbcType=VARCHAR}
</if>
</trim>
</delete>
select
SELECT col1,col2,col3
FROM table_name
WHERE 条件
[group by column]
[having 条件]
[order by DESC]
[limit 条件]
mybatis->select
resultMap标签:结果集
id:resultMap的唯一标识,可以放在select语句中的resultMap属性
resultMap中的id:这个里面放对应表的主键(这个)
resultMap中的association :这个标签可以用来嵌套新的对象(即为对象中的对象)
注意:
当我们的返回值中含有对象的对象时,注意两层resultMap的返回值可能会有问题,只返回一条数据
注意当我们有两条数据时,外层对象中所对应的内容若完全相同,则内层对象中的内容即使不同,也只会返回一条数据
解决方法:
1、让外层对象所对应的返回值值变得不同,resultMap加一个主键,但后端的实体类不写该主键字段对应的属性
<select id="对应方法名" parameterType="java中所对应的参数类型" resultMap="要调用的resultMap的名字">
select
from table_name
where
<trim suffixOverrieds="and">
<if test="后端字段名1 != null">
数据库字段名称1=#{后端字段名1,jdbcType=VARCHAR} and
</if>
<if test="后端字段名2 != null">
数据库字段名称2=#{后端字段名2,jdbcType=VARCHAR}
</if>
</trim>
</select>
<resultMap id="这个resultMap的唯一标识" type="对应的结果类型">
<id column="" jdbcType=""/>
<result column="" jdbcType=""/>
<result column="strVar" jdbcType="VARCHAR" property="url"/>
<result column="timeVar" jdbcType="TIMESTAMP" property="createTime"/>
<result column="jsonObjectVar"
typeHandler="com.hisense.higw.message.config.json.ObjectJsonHandler"
jdbcType="VARCHAR"
property="dataPackage"/>
<association javaType= "大对象中的小对象"
property="后台参数名"
resultMap="这个小对象所对应的resultMap的id"
/>
</resultMap>
<resultMap id="这个resultMap的唯一标识" type="对应的结果类型">
<id column="" jdbcType=""/>
<result column="" jdbcType=""/>
</resultMap>