Mybatis05-多条件查询

本文详细介绍了如何使用MyBatis进行多条件查询,包括环境配置、POJO类及映射文件创建、DAO层设计及JUnit测试。通过具体实例展示了参数类型为Map和User对象的查询方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 多条件查询

步骤一:先配置mybatis环境,然后再配置好JUnit和log4j。

步骤二:在com.shxt.model下创建POJO类,以及相应的映射文件。

package com.shxt.model;

public class User {
	//注意:数据库里面的字段名,类里面的属性名,input标签name值要一致
	private Integer userId;
	private String userName;
	private String pwd;
	private String account;
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName + ", pwd=" + pwd + ", account=" + account + "]";
	}
	
	
}

 

<?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.shxt.model.User">
  	<sql id="shxt">
  		user_id userId,user_name userName,account,password pwd
  	</sql>
  	<!-- 通过id返回数据 -->
	<select id="load" resultType="com.shxt.model.User" parameterType="integer">
		select <include refid="shxt"></include>
			from user where user_id=#{user_id}	
	</select> 
	<select id="login" parameterType="map" resultType="com.shxt.model.User">
		select <include refid="shxt"></include>
			from user where account=#{account} and password=#{password}
	</select>  
	<select id="loginByUser" parameterType="com.shxt.model.User" resultType="com.shxt.model.User">
		select <include refid="shxt"></include>
			from user where account=#{account} and password=#{pwd}
	</select>  
  </mapper>

注 :(1)这是select * from user查出来的视图

 

这是select user_id as userId,account,user_id as userId,user_name as userName,password as pwd  from user 查询出来的视图,视图中的字段名发生了变化(如:user_id -> userId)。这是"as"关键词起别名的作用,而且as 可以省略。

当数据库中的字段与类中的属性不一致的时候,要用"as"关键词对sql语句改写。

(2)因为每次都要写sql中重复的内容,可以通过<sql>标签对其进行封装

<sql id="shxt">
  		user_id userId,user_name userName,account,password pwd
  	</sql>

然后再用<include>标签引用,如:

select <include refid="shxt"></include>
			from user where user_id=#{user_id}	

(3)当sql语句传递的参数为两个时,parameterType="map",而且参数名要与map中的key名一致。但是也可以直接传递过来一个对象,此时parameterType="com.shxt.model.User"(类名全路径),参数的名称此时是类中的属性名。

步骤三: 创建dao层,为达到行业规范的目的,dao层方法先在接口中创建抽象方法,然后创建实现类实现抽象方法。

package com.shxt.dao;

import java.util.Map;

import com.shxt.model.User;

public interface UserDao {
	User load(Integer user_id);
	User login(Map<String,Object> map); 
	User loginByUser(User user);
}
package com.shxt.dao.impl;

import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import com.shxt.dao.UserDao;
import com.shxt.model.User;
import com.shxt.utils.MybatisUtil;

public class UserDaoImpl implements UserDao {
	SqlSession sqlSession = null;
	@Override
	public User load(Integer user_id) {
		try {
			sqlSession = MybatisUtil.getSqlSession();
			User user = sqlSession.selectOne(User.class.getName()+".load", user_id);
			return user;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("查询失败"+e.getMessage());
		}finally {
			MybatisUtil.closeSqlSession(sqlSession);
		}
	}
	@Override
	public User login(Map<String, Object> map) {
		try {
			sqlSession = MybatisUtil.getSqlSession();
			User user = sqlSession.selectOne(User.class.getName()+".login", map);
			return user;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("登录失败"+e.getMessage());
		}finally {
			MybatisUtil.closeSqlSession(sqlSession);
		}
	}
	@Override
	public User loginByUser(User user) {
		try {
			sqlSession = MybatisUtil.getSqlSession();
			User u = sqlSession.selectOne(User.class.getName()+".loginByUser", user);
			return u;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("登录失败"+e.getMessage());
		}finally {
			MybatisUtil.closeSqlSession(sqlSession);
		}
	}

}

 注:(1)它们的结构应如下图所示

(2) 实现类实现接口时,有如下创建方式。

 步骤三:书写基于JUnit的测试类。

package com.shxt.test;

import java.util.HashMap;

import org.junit.Before;
import org.junit.Test;

import com.shxt.dao.UserDao;
import com.shxt.dao.impl.UserDaoImpl;
import com.shxt.model.User;

public class MybatisTest {
	UserDao userDao = null;
	@Before
	public void init() {
		userDao = new UserDaoImpl();
	}
	@Test
	public void load() {
		User user = userDao.load(1);
		System.out.println(user);
	}
	@Test
	public void login() {
		HashMap<String, Object> map = new HashMap<String,Object>();
		map.put("account", "admin");
		map.put("password", "admin");
		User user = userDao.login(map);
		System.out.println(user);
	}
	@Test
	public void loginByUser() {
		User user = new User();
		user.setAccount("admin");
		user.setPwd("admin");
		User u = userDao.loginByUser(user);
		System.out.println(u);
	}
}

注:个人感觉JUnit版本中,JUnit4较为稳定,JUnit5中的@BeforEach老是报错,没找到错的原因,改回4就好了。

以下是部分执行结果:

<think>首先,用户的问题是关于MyBatis Plus的performance-analyzer功能的使用方法。系统指令要求我使用中文回答,结构清晰,帮助用户逐步解决问题。同时,我需要引用站内引用来支持回答,并在引用的段落末尾添加引用标识。 回顾提供的引用: - 引用[1]:提到了在application.yml中配置性能分析插件,包括启用performance-analyzer、设置最大执行时间等。 - 引用[2]:关于MyBatis Plus的条件构造器,但这不是直接相关的。 - 引用[3]:关于高性能计算工具,不直接相关。 - 引用[4]:关于构建工具,不相关。 - 引用[5]:关于数据同步服务,不直接相关。 最相关的引用是引用[1],因为它直接描述了配置performance-analyzer。 系统指令还要求: - 行内数学表达式用$...$格式。 - 独立公式用$$...$$格式。 - LaTeX语法正确。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识。 用户的问题是:“请问MyBatis Plus performance-analyzer 使用方法”,意思是“请问MyBatis Plus performance-analyzer的使用方法”。 我需要构建一个清晰的、逐步的回答: 1. 解释什么是performance-analyzer:它是MyBatis Plus的一个插件,用于监控SQL执行性能。 2. 描述如何启用和配置它:基于引用[1],在application.yml中配置。 3. 提供示例配置。 4. 解释输出日志的含义。 5. 可能添加一些注意事项或最佳实践。 最后,生成相关问题。 回答结构: - 开头简要介绍。 - 逐步说明配置方法。 - 提供代码示例。 - 结尾解释输出。 - 添加引用标识。 - 生成相关问题。 由于用户的问题是关于使用方法,我应该专注于配置和启用。 从引用[1]: - 在application.yml中配置: - mybatis-plus.configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - mybatis-plus.global-config.db-config.id-type: auto - plugins.performance-analyzer.enabled: true - plugins.performance-analyzer.max-execution-time: 5000 (单位毫秒) 在回答中,我需要自然地引用这个。 系统指令说“引用中引用的段落末尾自然地添加引用标识”,所以在提到配置时,在末尾加[^1]。 现在,构建回答: 1. 介绍performance-analyzer。 2. 步骤1:配置application.yml。 3. 步骤2:启用插件。 4. 步骤3:设置最大执行时间。 5. 解释输出日志。 6. 注意事项。 生成相关问题: - 例如:如何优化SQL性能?如何处理超时?其他性能分析工具? 使用中文。</think>### MyBatis Plus Performance-Analyzer 使用方法 MyBatis Plus 的 `performance-analyzer` 插件是一个性能监控工具,用于分析和优化 SQL 执行效率。它可以帮助开发者识别慢查询、设置最大执行时间阈值,并在日志中输出详细的性能报告。下面我将一步步解释如何配置和使用该功能。整个过程基于 Spring Boot 项目,通过修改 `application.yml` 文件实现。 #### 步骤 1: 在 `application.yml` 中启用性能分析插件 首先,您需要在项目的配置文件 `application.yml` 中添加相关配置。这包括: - 设置日志实现为 `StdOutImpl`,以便在控制台输出 SQL 日志。 - 启用 `performance-analyzer` 插件。 - 可选地配置最大执行时间(单位:毫秒),超过此时间的 SQL 会被标记为慢查询。 示例配置如下: ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 启用标准输出日志 global-config: db-config: id-type: auto # 设置主键生成策略 plugins: performance-analyzer: enabled: true # 启用性能分析插件 max-execution-time: 5000 # 设置最大执行时间为 5000 毫秒(即 5 秒),超过此时间的 SQL 会触发警告 ``` 在这个配置中: - `log-impl` 确保 SQL 语句和执行时间被打印到控制台。 - `performance-analyzer.enabled: true` 激活插件。 - `max-execution-time` 是可选的,默认不设置;如果设置,系统会监控 SQL 执行是否超时,并在日志中警告[^1]。 #### 步骤 2: 启动应用并查看日志 配置完成后,启动您的 Spring Boot 应用。当执行数据库操作时,`performance-analyzer` 会自动监控 SQL 性能。日志输出包括: - SQL 语句。 - 执行时间(单位:毫秒)。 - 如果执行时间超过 `max-execution-time`,会输出警告信息(例如:`Slow SQL detected ...`)。 示例日志输出: ``` 2023-10-01 12:00:00 INFO [main] SQL: SELECT * FROM user WHERE id = ? 2023-10-01 12:00:00 INFO [main] Execution Time: 120 ms 2023-10-01 12:00:05 WARN [main] Slow SQL detected: Execution time 5200 ms exceeds max time 5000 ms ``` 这有助于您快速定位慢查询,并优化相关 SQL 或索引。 #### 步骤 3: 注意事项和最佳实践 - **依赖检查**:确保您的项目中已包含 MyBatis Plus 依赖(例如 Maven 中的 `mybatis-plus-boot-starter`)。 - **性能影响**:启用该插件会轻微增加系统开销,建议仅在开发或测试环境使用,生产环境可禁用。 - **优化建议**:如果频繁出现慢查询,考虑添加数据库索引或优化查询逻辑。MyBatis Plus 的条件构造器(如 `QueryWrapper`)可以帮助简化动态 SQL 编写[^2]。 - **自定义配置**:您可以通过 Java 代码进一步自定义插件行为,例如实现 `PerformanceInterceptor` 接口来扩展监控逻辑。 通过以上步骤,您可以轻松启用和使用 `performance-analyzer` 功能。如果遇到问题,检查日志确保配置正确,或参考 MyBatis Plus 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值