1 前言
上一篇写了使用MyBatis进行简单查询
这一篇继续介绍MyBatis的查询
2 本篇内容
介绍MyBatis配合xml文件的查询
3 基础知识
介绍 #{}与${} 、mapper.xml中的标签以及标签属性
3.1 #{}与${}
#{}表示占位符,填入pojo类的属性名称,如果发现目标是一个字符串,会自动包裹引号。
${}表示拼接符,不会自动包裹引号。
通常情况下使用#{},如果需要引用的是列名则使用${}。
3.2 标签种类
在空白处调用代码提示会发现当前有九种可选标签
- cache:给定命名空间的缓存配置
- cache-ref:其它命名空间的缓存配置的引用
- resultMap:描述如何从数据库结果集中来加载对象
- parameterMap:参数集(参考资料2说已废弃,但是ide中仍可以打出来,应该是不推荐使用)
- sql:可重用语句块
- select、delete、update、insert:增删查改语句块
3.3 基本标签属性含义
- id:语句的id
- parameterType:参数类型
- resultType:结果类型(接收简单查询结果)
- resultMap:结果集(接收复杂查询结果)
4 准备工作
MyBatis 的全局配置文件、两个pojo类、User的xml和接口后面会建、数据库也要有对应的表,具体可以看上一篇。
Admin类,还要有对应的getter和setter
User类,还要有对应的getter和setter
5 查询
5.1 单表查询——根据输入的id查询Admin
5.1.1 AdminMapper.xml
<!-- 根据输入的id查询Admin -->
<select id="findAdminById" parameterType="int" resultType="Admin">
select * from admin where id= #{id}
</select>
注意id要唯一,parameterType
指传入的参数类型,因为Admin
的id
是Integer
型的,所以填int
,resultType
是返回值类型,查询的结果是一个Admin
对象,所以填Admin
,如果没有在主配置文件中注册,就要写全类名。
#{}和${}本文3.1处说过了。
5.1.2 AdminMapper接口
//根据 输入的id查询 Admin
public Admin findAdminById(int id);
方法名和xml中的id
相同,参数名和pojo
类中的属性名相同。
5.1.3 Test.java
//根据id查询Admin
//配置文件名称
String resource="SqlMapConfig.xml";
try {
//读取配置文件
InputStream inputStream=Resources.getResourceAsStream(resource);
//实例化会话工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//打开会话
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行查询
AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.class);
Admin admin=adminMapper.findAdminById(1);
System.out.println(admin.getId());
System.out.println(admin.getName());
//关闭会话
sqlSession.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
步骤和之前的简单查询类似,但是现在使用的是AdminMapper,调用他的方法进行查询
5.1.4 查询结果
单表查询在后面都是用MyBatis逆向工程生成的去查询,还是挺简单的,将会在以后的逆向生成中介绍,多表查询才需要自己写这些mapper。
5.2 多表查询
多表查询需要修改pojo类,使用resultMap
接收结果,使用association
、collection
来完成resultMap
,这一块的一对一、一对多、多对多啥意思我也不太懂,这里只写一个一对一的查询,详细的可以看参考链接第三篇。
5.2.1 修改User类
要有getter和setter
5.2.2 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mapper.UserMapper">
<!-- 结果集 -->
<!-- type是绑定的pojo类 -->
<resultMap type="User" id="UserAndAdminRst">
<!-- id 主键列 column 列名 property对应Pojo类的属性 result 普通列 -->
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="age" property="age"/>
<!-- 一对一用 association property对应属性名 javaType对应类名-->
<association property="admin" javaType="Admin">
<id column="id" property="id"/>
<result column="name" property="name"/>
</association>
</resultMap>
<select id="findUserAndAdminRst" resultMap="UserAndAdminRst">
select * from user,admin where user.id=admin.id
</select>
</mapper>
5.2.3 UserMapper.java
import java.util.List;
import com.test.pojo.User;
public interface UserMapper {
List<User> findUserAndAdminRst();
}
5.2.4 Test.java
//配置文件名称
String resource="SqlMapConfig.xml";
try {
//读取配置文件
InputStream inputStream=Resources.getResourceAsStream(resource);
//实例化会话工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//打开会话
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行查询 -- 一对一查询
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> users=userMapper.findUserAndAdminRst();
if(users.size()!=0) {
System.out.println(users.get(0).getUsername());
System.out.println(users.get(0).getAdmin().getName());
}
//关闭会话
sqlSession.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
5.2.5 查询结果
6 动态sql where标签与if标签
where
标签可以配合if
标签动态添加where条件。
where
标签默认会将后面语句中的第一个and去掉,如果后面没有语句了,就会将自己去掉
if
标签的写法如下
<if test="">
<!-- 在此写sql语句 -->
</if>
在test
中写条件,为真则添加sql语句,假则不添加。为了防止报错,建议if
中的sql语句以and
开头
tips:可以使用<sql>
标签包裹where块,需要使用的时候用<include refid=""></include>
标签来引用就可以了
7 结语
这篇文章是在实训结束一周后写的了,内容上我尽可能让其衔接自然,但可能还有没检查出来的东西,欢迎在评论区留言,接下来打算将实训时未完成的博客补完然后迎接秋招了。
8 参考链接
1.#{} 和 ${}区别
2.【Mybatis】Mapper 标签学习总结
3.resultMap实现一对一,一对多,多对多的查询