基础常用注解
@Select("select * from user where userid=#{userid}")
User queryUserByuserid(Integer userid);
@Insert("insert into user values(NULL,#{username1},#{userpwd1})")
//输出映射最好在配置文件中配置,在注解中直接指明ID即可
@ResultMap("userRM")
//如果类似uuid()使用方式,则使before为true即可
@SelectKey(before =false,keyColumn = "userid",keyProperty = "userid1",
//程序中指明类型一律用类对象
resultType =Integer.class,statement ="select last_insert_id()")
void insertUser(User user);
//注意只有SELECT查询操作才需使用@ResultMap
@Delete("delete from user where userid=#{userid1}")
void delUser(Integer userid);
对于多个参数的特殊处理
//对于使用两个参数去获取User对象
@Select("select * from user where username=#{usernameParam} and userpwd=#{userpwdParam}")
@ResultMap("userRM")
User queryUserByNameAndPwd(@Param("usernameParam") String username,
@Param("userpwdParam") String userpwd);
@Update("update user set username=#{user.username1},userpwd=#{user.userpwd1} where userid=#{userid}")
//对于单个参数时可以直接使用,但参数必须是JavaBean或者是其属性
//多个参数需要用到@Param注解并指明参数名称
void updateUserById(@Param("userid") Integer userid,
@Param("user") User user);
常用注解关系映射
@Select("select * from user inner join t_order on t_order.userid=user.userid where orderid=#{orderid}")
<!--一对一的映射,即利用orderid查询出对应订单及用户信息-->
<resultMap id="orderRM" type="order">
<id column="orderid" property="orderid"></id>
<result property="comments" column="comments"></result>
<association property="user" javaType="com.domain.User">
<id property="userid" column="userid"></id>
<result property="username" column="username"></result>
<result property="userpwd" column="userpwd"></result>
</association>
</resultMap>
<!--一对多的映射,利用userid查出用户以及对应所有订单-->
<!--注意关键字collection/ofType-->
<resultMap id="userRM" type="user">
<id property="userid" column="userid"></id>
<result property="username" column="username"></result>
<result property="userpwd" column="userpwd"></result>
<collection property="orders" ofType="com.domain.Order">
<id column="orderid" property="orderid"></id>
<result property="comments" column="comments"></result>
</collection>
</resultMap>
//此处使用左外连接的原因在于用户可能没有订单信息,但用户信息不可以为空
@Select("select * from user left join t_order on user.userid=t_order.userid where user.userid=#{userid}")
//实体中对于order的属性处理为--->private List<Order> orders;
//多对多映射时需要注意的是查询语句为三表连接,可以根据orderid获取goods信息,也可以根据goodsid获取对应order信息,分别使用collection作输出映射即可
说明
1:一般对select查询设置注解@ResultMap,而对insert操作设置注解@SelectKey
2:配置文件和注解是可以同时生效的;比较简单的CRUD使用注解即可,复杂的mybatis操作如resultMap的定义、Sql片段(不确定条件的查询/不确定条件的更新)以及参数为List时使用的循环操作需要在配置文件中实现
3:注意一个方法的实现不能由配置文件和注解同时定义(配置文件例如sql片段可以和@ResultMap/@Param等注解结合使用)
SQL片段(查询条件不确定时)
<select id="queryPartUserTest" resultMap="userRM">
-- 查询条件不确定时,可以采用这种结构来实现条件的即时更改
-- 实际上也可以在where之后拼凑1=1去实现,但这样的缺点在于
-- 会使除2之后列索引失效,where标签有自动拼凑where以及去除第一个and的效果
SELECT * FROM user
<where>
-- 此判断可以表示当Map的键userid对应的值不为空时则将值#{userid}赋给列名userid
<if test="userid!=null and userid!=' ' ">
AND userid=#{userid}
</if>
<if test="username!=null">
AND username=#{username}
</if>
<if test="userpwd!=null">
AND userpwd=#{userpwd}
</if>
</where>
</select>
补充:使用like模糊查询时,对于"%“和”_"在sql语句中的使用应该放入单引号中,而
"#{}“是会自动生成单引号形式的语句,所以此时只能使用”${}"格式的占位符,示例
AND DevName LIKE '%${devName}%'
常用sql片段抽离
<sql id="sqlPart1">
<where>
<if test="userid!=null">
AND userid=#{userid}
</if>
<if test="username!=null">
AND username=#{username}
</if>
<if test="userpwd!=null">
AND userpwd=#{userpwd}
</if>
</where>
</sql>
-- 在要引用的部分使用该标签即可
<include refid="sqlPart1"></include>
SQL片段(插入条件不确定时)
<insert id="insertPartUser">
UPDATE user
<trim prefix="set" suffixOverrides=",">
<if test="username!=null">
username=#{username},
</if>
<if test="userpwd!=null">
userpwd=#{userpwd},
</if>
</trim>
WHERE userid=#{userid}
</insert>