java实训笔记_MyBatis查询

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指传入的参数类型,因为AdminidInteger型的,所以填intresultType是返回值类型,查询的结果是一个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接收结果,使用associationcollection来完成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实现一对一,一对多,多对多的查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值