MyBatis02:使用MyBatis查询数据

系列文章目录

MyBatis01:创建、运行、测试一个mybatis项目
MyBatis02:使用MyBatis查询数据
MyBatis03:嵌套查询、嵌套结果、延迟加载
MyBatis04:动态SQL
MyBatis05:类型转换器
MyBatis06:分页插件、MyBatis配置文件中的标签
MyBatis07:MyBatis注解



前言

前面学习了如何创建一个使用mybatis框架的项目,并实现了增删改。这里再继续记录一下如何使用mybatis框架进行查询操作。


一、新建模块

这里只是为了熟悉一下建项目的流程,以及明确一些需要注意的地方。

1. 创建项目

  1. 在原有项目下,新建模块
    在这里插入图片描述
  2. 创建一个Java项目
    在这里插入图片描述
  3. 写项目名并完成
    在这里插入图片描述

2. 导包

  1. 项目下创建lib文件夹,并导包。
    在这里插入图片描述
  2. 将外部jar包添加到idea项目中,来保持各种依赖关系。
    在这里插入图片描述

3. 文件添加与配置

在src文件下添加日志文件和mybatis的主配置文件。
注意:如果mybatis的主配置文件添加到项目下,该配置文件是获取不到的。
在这里插入图片描述

二、查询分析

1. 通过主键查询

1.1 sql标签

<sql id="base_info">id, classname</sql>
属性说明:

id=“base_info” 用来标识一个sql标签

sql标签作用:
  1. 可以用来定义重复使用的sql字段:id,classname是数据库里的字段。列名列表里重复出现的字段,就可以单独存成一个sql对象。
  2. 可以用来定义重复使用的sql语句,实现sql语句的重用
如何获取sql标签:

通过include标签引用,refid=“sql标签id”

<include refid="base_info"></include>

1.2 通过主键查询

<select id="selectByPrimaryKey" resultType="com.bean.Clazz">
    select <include refid="base_info"></include> from clazz
    where id = #{id}
</select>
如何获取参数和返回值

①使用ognl表达式获取参数
②通过sql标签来获取查询的返回值

2. 通过班级名称查询

<select id="selectByClassname" resultType="com.bean.Clazz">
    select <include refid="base_info"></include> from clazz
    where classname like concat("%", #{classname}, "%")
</select>

这里用到了模糊查询

2.1 字符串拼接

  1. 字符串拼接使用的是:concat(“字符串”, ognl表达式, …)
  2. MySQL专用的字符串拼接:各字符串直接拼在一起即可,如下:
<select id="selectByClassname" resultType="com.bean.Clazz">
    select <include refid="base_info"></include> from clazz
    where classname like "%"#{classname}"%"
</select>

2.2 查询的返回值是list集合

这里虽然是list集合,但返回值类型还是Clazz。resultType的值定义的是集合中数据元素类型。详细可参考。

3. 通过id范围查询

<select id="selectByIdRang" resultType="com.bean.Clazz">
    select <include refid="base_info"></include> from clazz
    where id &gt;=#{minId} and id &lt;=#{maxId}
</select>

3.1 SQL中的特殊表达式

原因:

由于SQL语句中的一些符号恰好是xml语法使用的符号,符号冲突,所以会出现错误

解决方法:
  1. 使用字符实体来代替冲突符号
    例如:小于号 <
    注意这里要使用 > 或 < 时,分别用 &gt;&lt; 来表示
    主要是 < 必须要用 &lt; 来表示,否侧会报错:元素内容必须由格式正确的字符数据或标记组成。
  2. 使用CDATA来避免冲突
    由于不同的符号对应不同的字符实体,记忆不同的字符实体比较麻烦,因此给出了一种通用的解决符号冲突的方法CDATA,使用CDATA可以使这个符号不被xml解析。
    ①语法:<![CDATA[冲突符号]]>
    ②注意:CDATA解析后,后面会自动添加一个空格
    因此如果你要使用CDATA解析<=时,需要这样写 <![CDATA[<=]]>

4. 分页

映射文件

<!--查询数据库一共有多少条记录-->
<select id="selectCount" resultType="int">
     select count(*) from clazz
 </select>

 <!--物理分页-->
 <select id="selectPage" resultType="com.bean.Clazz">
     select <include refid="base_info"></include> from clazz
     limit #{page.start}, #{page.end}
 </select>

接口代码:

// 分页
int selectCount();
List<Clazz> selectPage(@Param("page") PageUtil pageUtil);

4.1 如何获取添加了param注解的对象的参数

通过ognl表达式获取:#{key.value}
通过@Param(“page”)得到 key:page
通过PageUtil pageUtil 得到 value:pageUtil

5. 通过主键查询学生

 <resultMap id="baseMap" type="com.bean.Student">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="sex" property="sex"></result>
        <result column="birthday" property="birthday"></result>
        <result column="age" property="age"></result>
        <result column="classid" property="classid"></result>
    </resultMap>
    
    <sql id="base_info">id,name,sex,birthday,age,classid</sql>

    <select id="selectByPrimaryKey" resultMap="baseMap">
        select <include refid="base_info"></include> from student
        where id = #{id}
    </select>

5.1 resultType和resultMap

5.1.1 resultType和resultMap的联系

resultTyperesultMap 都是用来设置返回值类型,将查询的结果映射为一个对象。

5.1.2 resultType和resultMap的区别

resultType 要求数组库字段要和实体的属性名完全对应,这种情况,框架可以自动解析,直接映射。如果不对应的话,需要为字段别名来与java属性名保持一致,这样框架才可以实现映射关系。
②如果数据库字段实体的属性名不对应的话,就需要用到 resultMap,自己来建立映射关系。(上文给出的代码,数据库字段和实体的属性名是对应的,也可以使用 resultMap

标签名/属性含义/作用
resultMap标签用来设置返回值类型
id属性用来标识这个resultMap标签
type返回值的类型
id标签用来设置主键
result标签用来设置其他字段
column指定数据库的字段名
property指定实体的属性名

select标签里的resultMap属性是通过resultMap标签里的id属性来指定返回值类型

三、其它总结

1. sql语句通过ognl表达式获取参数值

ognl表达式通过 #{key} 来获取参数

1.1 参数是基本数据类型及其包装类+String

参数名和参数值分别作为key、value

1.2 参数是单个对象

对象的属性名和属性值分别作为key、value

1.3 两个参数及以上

需要自己通过@param()注解来指定key。当然这个注解也适用于单个参数的情况。
这里以单个参数是对象的情况来说明一下,多个参数同理:
接口方法

List<Clazz> selectPage(@Param("page") PageUtil pageUtil);

映射文件

<select id="selectPage" resultType="com.bean.Clazz">
    select <include refid="base_info"></include> from clazz
    limit #{page.start}, #{page.end}
</select>

注意到这里的 #{page.start} page就是param里设置的key,用来指代这个对象;start就是就是对象里的属性名。


总结

今天学了如何使用mybatis框架实现查询功能。主要介绍了几种常用的查询语句,以及各个查询语句需要注意的地方。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员_动次动次

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值