系列文章目录
MyBatis01:创建、运行、测试一个mybatis项目
MyBatis02:使用MyBatis查询数据
MyBatis03:嵌套查询、嵌套结果、延迟加载
MyBatis04:动态SQL
MyBatis05:类型转换器
MyBatis06:分页插件、MyBatis配置文件中的标签
MyBatis07:MyBatis注解
前言
前面学习了如何创建一个使用mybatis框架的项目,并实现了增删改。这里再继续记录一下如何使用mybatis框架进行查询操作。
一、新建模块
这里只是为了熟悉一下建项目的流程,以及明确一些需要注意的地方。
1. 创建项目
- 在原有项目下,新建模块
- 创建一个Java项目
- 写项目名并完成
2. 导包
- 在项目下创建lib文件夹,并导包。
- 将外部jar包添加到idea项目中,来保持各种依赖关系。
3. 文件添加与配置
在src文件下添加日志文件和mybatis的主配置文件。
注意:如果mybatis的主配置文件添加到项目下,该配置文件是获取不到的。
二、查询分析
1. 通过主键查询
1.1 sql标签
<sql id="base_info">id, classname</sql>
属性说明:
id=“base_info” 用来标识一个sql标签
sql标签作用:
- 可以用来定义重复使用的sql字段:id,classname是数据库里的字段。列名列表里重复出现的字段,就可以单独存成一个sql对象。
- 可以用来定义重复使用的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 字符串拼接
- 字符串拼接使用的是:concat(“字符串”, ognl表达式, …)
- 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 >=#{minId} and id <=#{maxId}
</select>
3.1 SQL中的特殊表达式
原因:
由于SQL语句中的一些符号恰好是xml语法使用的符号,符号冲突,所以会出现错误
解决方法:
- 使用字符实体来代替冲突符号
例如:小于号 <
注意这里要使用 > 或 < 时,分别用>
和<
来表示
主要是 < 必须要用<
来表示,否侧会报错:元素内容必须由格式正确的字符数据或标记组成。 - 使用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的联系
resultType
和 resultMap
都是用来设置返回值类型,将查询的结果映射为一个对象。
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框架实现查询功能。主要介绍了几种常用的查询语句,以及各个查询语句需要注意的地方。