您的位置:首页 > 其它

mybatis实现简单的查询

2019-07-29 21:35 681 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fyytycoon/article/details/97685061

mybatis实现简单的查询

文章目录

一、使用MyBatis实现简单的查询

在设计查询的抽象方法时:

  1. 返回值类型使用所期望的类型;
  2. 其它部分的设计与增/删/改相同;
  3. 如果查询的是某1条数据记录,如果有匹配的数据,则返回正确的查询结果,如果没有匹配的数据,将返回
    null

例如:根据用户id查询用户数据详情时:

User findById(Integer id);

在配置该方法的XML映射时,使用的

<select>
节点必须配置
resultType
或者
resultMap
属性中的某一个:

<select id="findById"
resultType="cn.fyy.mybatis.User">
SELECT * FROM t_user WHERE id=#{id}
</select>

例如:获取当前数据表用户数据的数量:

Integer count();

映射配置为:

<select id="count"
resultType="java.lang.Integer">
SELECT COUNT(*) FROM t_user
</select>

例如:查询所有用户数据时:

List<User> findAll();

配置的映射:

<select id="findAll"
resultType="cn.fyy.mybatis.User">
SELECT * FROM t_user ORDER BY id ASC
</select>

二、使用多个参数

假设需要实现:将id=?的用户的密码修改为?,则抽象方法:

Integer updatePasswordById(Integer id, String newPassword);

然后配置xml中的映射:

<update id="updatePasswordById">
UPDATE t_user SET password=#{newPassword} where id=#{id}
</update>

如果直接执行以上代码,会报告错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'newPassword' not found. Available parameters are [arg1, arg0, param1, param2]

根本原因是MyBatis框架只能识别1个参数,无论这个参数是什么,都会直接被使用,而多余的参数是不可识别的!

可以在抽象方法的每一个参数之前添加

@Param
注解,MyBatis框架在处理时,会将这些参数封装成1个Map,依然能满足“只能识别1个参数”的需求,后续在配置XML映射时,使用的
#{}
占位符中的名称就必须是注解中配置的名称,表示的是MyBatis自动封装的Map中的Key:

Integer updatePasswordById(
@Param("id") Integer arg0,
@Param("password") String arg1);

配置的XML映射:

<update id="updatePasswordById">
UPDATE t_user SET password=#{password} where id=#{id}
</update>

小结:如果涉及的抽象方法的参数达到2个甚至更多,则每个参数之前都必须添加

@Param
注解,并在注解中指定名称,后续配置XML映射时,使用的
#{}
中的名称也是注解中配置的名称!

三、动态SQL-foreach

MyBatis中的动态SQL指的是根据参数不同,动态的生成不同的SQL语句。

例如:根据若干个id删除用户数据,设计的抽象方法:

Integer deleteByIds(List<Integer> ids);

然后,在配置映射时:

<delete id="deleteByIds">
DELETE FROM
t_user
WHERE
id
IN
(
<foreach collection="list"
item="id" separator=",">
#{id}
</foreach>
)
</delete>

在配置

<foreach>
节点时:

  • collection
    :被遍历的参数对象,首先,如果对应的抽象方法的参数只有1个时,如果参数是
    List
    集合类型的,取值为
    list
    ,如果参数是数组类型的,取值为
    array
    ,另外,如果对应的抽象方法的参数有多个,则每个参数肯定都添加了
    @Param
    注解,此处需要配置的值就是注解中配置的名称;
  • item
    :遍历过程中获取到的数据的名称,相当于增强for循环的语法中,括号中的第2个部分,在
    <foreach>
    节点的子级可以使用
    #{}
    占位符,占位符中的名称就是
    item
    属性的值;
  • separator
    :遍历过程中各元素使用的分隔符;
  • open
    close
    :遍历产生的代码的最左侧字符和最右侧字符。

四、动态SQL-if

假设存在抽象方法:

List<User> find(String where, String orderBy, Integer offset, Integer count);

在配置SQL语句时,可以使用if标签进行对参数的判断,从而产生不同的SQL语句的某个部分,例如:

<select id="find"
resultType="cn.tedu.mybatis.User">
SELECT
*
FROM
t_user
<if test="where != null">
WHERE
${where}
</if>
<if test="orderBy != null">
ORDER BY
${orderBy}
</if>
<if test="offset != null">
LIMIT
#{offset}, #{count}
</if>
</select>

五、MyBatis中的占位符

在MyBatis中,编写XML中的SQL语句时,可以使用

#{}
格式的占位符,还可以使用
${}
格式的占位符!

MyBatis在处理有占位符的SQL时,如果是

${}
格式的占位符,会先通过字符串拼接的方式把变量值替换并拼接出SQL语句,然后尝试编译该SQL语句,如果是
#{}
格式的占位符,会使用
?
进行占位并尝试编译,编译过后再使用值进行替换。

小结:以前在使用JDBC时,可以使用

?
表示的部分,都应该使用
#{}
,也可以理解为只有“值”才可以使用
#{}
,这种做法是预编译的,否则,如果要对SQL语句中的某个子句或者其他语句的某个部分,甚至是WHERE子句中的表达式,使用
${}
,这种做法并不会预编译。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: