mybatis实现简单的查询
2019-07-29 21:35
681 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fyytycoon/article/details/97685061
mybatis实现简单的查询
文章目录
一、使用MyBatis实现简单的查询
在设计查询的抽象方法时:
- 返回值类型使用所期望的类型;
- 其它部分的设计与增/删/改相同;
- 如果查询的是某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子句中的表达式,使用
${},这种做法并不会预编译。
相关文章推荐
- MyBatis简单的增删改查以及简单的分页查询实现
- spring-mybatis实现简单模糊查询
- 记使用mybatis实现简单的搜索查询
- MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题
- 分页查询简单实现(Freemarker+SpringMVC+Mybatis)
- MyBatis实现简单的用户查询
- mybatis+oracle实现分页查询--非常简单实用
- myBatis中实现简单的模糊分页查询功能
- springmvc+Mybatis 分页查询的简单实现
- MyBatis简单的增删改查以及简单的分页查询实现
- Mybatis实现简单的分页,以及基本的查询修改功能
- Springboot+mybatis+MySQL实现简单的多表查询
- 使用lucene搜索引擎实现对关键字的简单查询
- 基于Java接口实现Mybatis动态SQL查询
- mybatis简单查询
- 一步步学Mybatis-实现简单的分页效果逻辑 (5)
- MyBatis实现关联表查询
- mysql简单实现查询结果添加序列号的方法
- Jena中SPARQL查询本体的简单实现
- mybatis实战教程(mybatis in action)之四:实现关联数据的查询