Mybatis 动态SQL – 使用if,where标签动态生成条件语句

news2024/11/17 17:37:47

前面几篇我们介绍了使用Mybatis进行数据的增删改查,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis提供的if,where标签动态生成条件语句。

如果您对数据的增删改查和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅读本篇,可以参考:

Mybatis查询数据icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/132469672Mybatis 日志(JDK Log)icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/132565362Mybatis 插入、修改、删除icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/132601345

一、数据准备

这里我们直接使用脚本初始化数据库中的数据

-- 如果数据库不存在则创建数据库
CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
-- 切换数据库
USE demo;
-- 创建用户表
CREATE TABLE IF NOT EXISTS T_TEACHER(
  ID INT PRIMARY KEY COMMENT '教师编号',
  TEACHER_NAME VARCHAR(64) NOT NULL COMMENT '教师名称',
  DEPARTMENT VARCHAR(16) NOT NULL COMMENT '所属部门',
  BIRTH DATE NOT NULL COMMENT '出生年月',
  DEGREE VARCHAR(16) NOT NULL COMMENT '学历(ZK:专科, BK:本科, YJS:研究生, BS:博士)'
);
-- 插入用户数据
INSERT INTO T_TEACHER(ID, TEACHER_NAME, DEPARTMENT, BIRTH, DEGREE)
VALUES(1, '张三1', '001', '1990-06-12', 'BK'),
      (2, '李四1', '002', '1992-05-10', 'BK'),
      (3, '张三2', '003', '1988-01-15', 'YJS'),
      (4, '李四2', '001', '1979-03-10', 'BK'),
      (5, '李四3', '003', '1995-08-16', 'YJS');

创建了一个名称为demo的数据库;并在库里创建了名称为T_TEACHER的教师表并向表中插入了数据

二、环境搭建

1、创建实体类

在cn.horse.demo下创建TeacherInfo实体类:

TeacherInfo类:

package cn.horse.demo;

import java.time.LocalDate;

public class TeacherInfo {
    private Integer id;
    private String name;
    private String department;
    private LocalDate birth;
    private String degree;

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("{ ");
        stringBuilder.append("id: ");
        stringBuilder.append(this.id);
        stringBuilder.append(", ");
        stringBuilder.append("name: ");
        stringBuilder.append(this.name);
        stringBuilder.append(", ");
        stringBuilder.append("department: ");
        stringBuilder.append(this.department);
        stringBuilder.append(", ");
        stringBuilder.append("birth: ");
        stringBuilder.append(this.birth);
        stringBuilder.append(", ");
        stringBuilder.append("degree: ");
        stringBuilder.append(this.degree);
        stringBuilder.append(" }");
        return stringBuilder.toString();
    }
}

2、Mapper配置文件

在resources的目录下新建TeacherInfoMapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.horse.demo.TeacherInfoMapper">

    <select id="findAll" resultType="cn.horse.demo.TeacherInfo">
        SELECT
            ID,
            TEACHER_NAME name,
            DEPARTMENT,
            BIRTH,
            DEGREE
        FROM T_TEACHER
    </select>
</mapper>

3、引入配置文件

在resources下新建mybatis-config.xml配置文件,并引入TeacherInfoMapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="JDK_LOGGING"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.gjt.mm.mysql.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="horse"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="demo/TeacherInfoMapper.xml" />
    </mappers>
</configuration>

4、会话工具类

在cn.horse.demo包下新建SqlSessionUtils工具类

package cn.horse.demo;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.Objects;

public class SqlSessionUtils {

    private static final SqlSessionFactory sqlSessionFactory;
    static {
        // 读取mybatis配置文件
        InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
        // 根据配置创建SqlSession工厂
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }

    /**
     * 开启会话
     * @return
     */
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * 关闭会话
     * @param sqlSession
     */
    public static void closeSession(SqlSession sqlSession) {
        if(Objects.nonNull(sqlSession)) {
            sqlSession.close();
        }
    }
}

5、JDK 日志系统配置

在resources的目录下新建logging.properties配置文件

handlers=java.util.logging.ConsoleHandler
.level=INFO

cn.horse.demo.TeacherInfoMapper.level=FINER
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n

在cn.horse.demo下新建JdkLogConfig类:

JdkLogConfig类:

package cn.horse.demo;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;

public class JdkLogConfig {

    public JdkLogConfig() {
        try {
            InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties");
            LogManager.getLogManager().readConfiguration(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

6、启动程序

package cn.horse.demo;

import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 引入JDK日志配置
        System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

        // 查询所有教师
        findAll("cn.horse.demo.TeacherInfoMapper.findAll", null);
    }

    private static void findAll(String statement, TeacherInfoQuery query) {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionUtils.openSession();
            List<TeacherInfo> teacherInfoList = sqlSession.selectList(statement, query);
            for (TeacherInfo teacherInfo: teacherInfoList) {
                System.out.println(teacherInfo);
            }
        } finally {
            SqlSessionUtils.closeSession(sqlSession);
        }
    }
}

执行后的结果如下:

三、例子:查询学历为本科,部门为001的教师

在TeacherInfoMapper.xml配置文件中新增findByQuery查询语句:

<select id="findByQuery" parameterType="cn.horse.demo.TeacherInfoQuery" resultType="cn.horse.demo.TeacherInfo">
    SELECT
        ID,
        TEACHER_NAME name,
        DEPARTMENT,
        BIRTH,
        DEGREE
    FROM T_TEACHER
    WHERE DEGREE = #{degree}
        AND DEPARTMENT = #{department}
</select>

测试:

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

TeacherInfoQuery query = new TeacherInfoQuery();
query.setDegree("BK");
query.setDepartment("001");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

执行后的结果如下:

四、使用 if 标签避免SQL冗余

这里如果我们需要只查询学历为本科的教师,又该如何来做呢?

如果新增加一个查询标签则会造成大量的SQL语句重复,这里使用if标签就能解决这类问题,可以根据条件动态的拼接SQL语句;

if标签是主要用于进行条件判断,常用于动态生成条件语句、更新语句;当条件满足时,会将if标签中的SQL语句片段拼接到SQL语句中;当条件不满足时,则跳过if标签中的SQL语句片段;

<select id="findByQuery" parameterType="cn.horse.demo.TeacherInfoQuery" resultType="cn.horse.demo.TeacherInfo">
    SELECT
        ID,
        TEACHER_NAME name,
        DEPARTMENT,
        BIRTH,
        DEGREE
    FROM T_TEACHER
    WHERE
    <if test="null != degree and '' != degree">
        AND DEGREE = #{degree}
    </if>
    <if test="null != department and '' != department">
        AND DEPARTMENT = #{department}
    </if>
</select>

if标签:test的属性值是条件,degree、department是参数,参数可以在标签的属性中直接使用;

第一个条件:degree不为null并且不为空字符串条件才成立

第二个条件:department不为null并且不为空字符串条件才成立

测试:

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询学历为本科的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDegree("BK");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

结果分析:

degree值为BK, 第一个条件满足,DEGREE = #{degree}会拼接到SQL语句中;department值为null,第二个条件不满足,直接跳过;

最终只有DEGREE = #{degree}拼接到SQL语句中,同样SQL执行日志也与我们分析的结果一致。

五、使用 if 标签可能会导致的AND,WHERE问题

1、查询所有的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

TeacherInfoQuery query = new TeacherInfoQuery();
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

2023-08-31 10:48:39.221 详细 cn.horse.demo.TeacherInfoMapper.findByQuery - ==>  Preparing: SELECT ID, TEACHER_NAME name, DEPARTMENT, BIRTH, DEGREE FROM T_TEACHER WHERE 
2023-08-31 10:48:39.266 详细 cn.horse.demo.TeacherInfoMapper.findByQuery - ==> Parameters: 
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8
### The error may exist in demo/TeacherInfoMapper.xml
### The error may involve cn.horse.demo.TeacherInfoMapper.findByQuery-Inline
### The error occurred while setting parameters
### SQL: SELECT             ID,             TEACHER_NAME name,             DEPARTMENT,             BIRTH,             DEGREE         FROM T_TEACHER         WHERE
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at cn.horse.demo.Main.findAll(Main.java:45)
	at cn.horse.demo.Main.main(Main.java:32)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1915)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1254)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
	at jdk.proxy3/jdk.proxy3.$Proxy3.execute(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	... 3 more

结果分析:

degree值为null, 第一个条件不满足,直接跳过;

department值为null,第一个条件不满足,直接跳过;

最终拼装好的SQL语句会变成

SELECT ID, TEACHER_NAME name, DEPARTMENT, BIRTH, DEGREE FROM T_TEACHER WHERE

多了一个WHERE,与报错的信息一致。

2、查询部门为001的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询部门为001的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDepartment("001");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

2023-08-30 22:27:12.164 详细 cn.horse.demo.TeacherInfoMapper.findByQuery - ==>  Preparing: SELECT ID, TEACHER_NAME name, DEPARTMENT, BIRTH, DEGREE FROM T_TEACHER WHERE AND DEPARTMENT = ? 
2023-08-30 22:27:12.220 详细 cn.horse.demo.TeacherInfoMapper.findByQuery - ==> Parameters: 001(String)
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND DEPARTMENT = '001'' at line 11
### The error may exist in demo/TeacherInfoMapper.xml
### The error may involve cn.horse.demo.TeacherInfoMapper.findByQuery-Inline
### The error occurred while setting parameters
### SQL: SELECT             ID,             TEACHER_NAME name,             DEPARTMENT,             BIRTH,             DEGREE         FROM T_TEACHER         WHERE                                 AND DEPARTMENT = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND DEPARTMENT = '001'' at line 11
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at cn.horse.demo.Main.findAll(Main.java:39)
	at cn.horse.demo.Main.main(Main.java:32)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND DEPARTMENT = '001'' at line 11
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1915)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1254)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
	at jdk.proxy3/jdk.proxy3.$Proxy3.execute(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	... 3 more

结果分析:

degree值为null, 第一个条件不满足,直接跳过;

department值为001,第二个条件满足,AND DEPARTMENT = #{department}会拼接到SQL语句中;

最终只有AND DEPARTMENT = #{department}拼接到SQL语句中,最终拼装好的SQL语句会变成

SELECT ID, TEACHER_NAME name, DEPARTMENT, BIRTH, DEGREE FROM T_TEACHER WHERE AND DEPARTMENT = #{department}

多了一个AND,与报错的信息一致。

六、使用恒等式解决AND,WHERE问题

在WHERE后面增加恒等式1=1

<select id="findByQuery" parameterType="cn.horse.demo.TeacherInfoQuery" resultType="cn.horse.demo.TeacherInfo">
    SELECT
        ID,
        TEACHER_NAME name,
        DEPARTMENT,
        BIRTH,
        DEGREE
    FROM T_TEACHER
    WHERE 1 = 1
    <if test="null != degree and '' != degree">
        AND DEGREE = #{degree}
    </if>
    <if test="null != department and '' != department">
        AND DEPARTMENT = #{department}
    </if>
</select>

1、查询所有的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

TeacherInfoQuery query = new TeacherInfoQuery();
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

2、查询部门为001的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询部门为001的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDepartment("001");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

3、查询学历为本科的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询学历为本科的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDegree("BK");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

七、使用where标签解决AND,WHERE问题

where标签有两个作用:

(1)判断是否存在条件,如果条件不存在,则不再拼接where;如果条件存在,则拼接where

(2)剔除where后面多余的AND标签

<select id="findByQuery" parameterType="cn.horse.demo.TeacherInfoQuery" resultType="cn.horse.demo.TeacherInfo">
    SELECT
        ID,
        TEACHER_NAME name,
        DEPARTMENT,
        BIRTH,
        DEGREE
    FROM T_TEACHER
    <where>
        <if test="null != degree and '' != degree">
            AND DEGREE = #{degree}
        </if>
        <if test="null != department and '' != department">
            AND DEPARTMENT = #{department}
        </if>
    </where>
</select>

1、查询所有的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

TeacherInfoQuery query = new TeacherInfoQuery();
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

2、查询部门为001的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询部门为001的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDepartment("001");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

3、查询学历为本科的教师

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询学历为本科的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDegree("BK");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

查询的结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql锁及行锁机制探索

先讲一下mysql存储方式(innodb) 分为&#xff0c;聚簇索引和非聚簇索引。 聚簇索引&#xff0c;就是b树的所有真实数据。 聚簇索引不是一种索引类型&#xff0c;而是一种数据存储方式。innoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时&…

PlumeLog查不到日志

一 问题&#xff1a; PlumeLog查不到日志&#xff0c;记录遇到的情况 二 场景 1. 输入不全

5款轻量级小软件,突出一个简洁轻便

​ 今天的主题是简洁&#xff0c;轻便&#xff0c;都是轻量级的小软件&#xff0c;界面都是非常简洁&#xff0c;而且无广告的。 1.图形设计——Affinity Designer ​ Affinity Designer是一款获奖的矢量图形软件&#xff0c;它设定了设计界的新标准。它适用于Windows, macOS…

FANUC机器人电气控制柜内部硬件电路和模块详细介绍

FANUC机器人电气控制柜内部硬件电路和模块详细介绍 PSU电源单元 通过背板传输了如下电源 +5 +2.0V +3.3 +24v +24E +15V -15V 主板--接口描述: 主板内部结构: 面板电路板: 引申一下 KM21 与 KM22 的作用它们分别接至操作面板上上的急停按

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…

详解mysql事务,事务并发安全问题的复现以及大事务的优化

好文推荐&#xff1a; 2.5万字详解23种设计模式 springboot 实现延时队列&#xff08;超级实用&#xff09; 2.5万字讲解DDD领域驱动设计 文章目录 1. 事务定义2. 事务特性&#xff08;ACID&#xff09;3. 事务并发问题4. 事务隔离级别5. 基础命令6. 脏读复现7. 不可重复读复现…

滑动窗口实例5(水果成篮)

题目&#xff1a; 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按…

qt相关的demo集合

自己写过的qt/c相关程序的demo集合 &#xff08;许多学习自网络中&#xff0c;很感谢大家的分享&#xff09; 源码地址&#xff1a;Qt与学习通页面: 记录与Qt相关的代码 - Gitee.com 源码目录: echart简单应用 opencv图像处理 QSetting简单使用 QtAv播放视频 ui页面 表情 超星…

Vue框架--Vue中的数据代理

下面,我们一起来说以下Vue中的数据代理。 1.Object.defineProperty()方法回顾 * Object.defineProperty()方法基本配置项 * value:指定设置对象内容的属性值 * enumerable:true, //控制属性是否可以枚举(也就是是否可以被遍历),默认值是false * writable:true, //控制属性是…

苹果将在iPhone16系列中引入微透镜阵列技术,亮度更高、功耗更低

根据韩国媒体The Elec的报道&#xff0c;苹果公司正与其主要供应商三星和LG展开合作&#xff0c;以评估并衡量是否有必要在明年的iPhone 16系列中引入微透镜&#xff08;micro-lens&#xff09;技术来升级屏幕。 这项方案集中在OLED屏幕架构上&#xff0c;计划采用微透镜阵列&…

20用于深度学习训练和研究的数据集

数据集在计算机科学和数据科学中发挥着至关重要的作用。它们用于训练和评估机器学习模型&#xff0c;研究和开发新算法&#xff0c;改进数据质量&#xff0c;解决实际问题&#xff0c;推动科学研究&#xff0c;支持数据可视化&#xff0c;以及决策制定。数据集提供了丰富的信息…

13 mysql date/time/datetime/year 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 datetime/date/time/year 类类型…

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器

一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中&#xff0c;我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说&#xff0c;RNN方法已经过时了&#xff0c;研究它们是没有意义的。的…

如何增强客户支持?用全渠道聊天机器人

您的用户在哪里&#xff1f;您是否想拥有源源不断的客户&#xff1f;全渠道聊天机器人可确保您在他们需要的地方为他们提供一致的客户支持&#xff01; 自技术出现以来&#xff0c;消费者行为已经完全改变。这意味着企业与用户互动和提供客户支持的方式也发生了变化。现在&…

Spring 系统架构

Spring总共大约有 20个模块&#xff0c;由1300多个不同的文件构成。而这些组件被分别整合在核心容器&#xff08;CoreContainer&#xff09;、AOP&#xff08;Aspect Oriented Programming&#xff09;和设备支持&#xff08;Instrmentation&#xff09;、数据访问及集成&#…

文心一言放出的“时代礼物”,藏着中国科技的黄金机会

8月31日&#xff0c;第一批国产大模型通过了“生成式人工智能备案”&#xff0c;可以开放公众服务。 一石激起千层浪&#xff0c;对AIGC强烈好奇&#xff0c;为国产应用疯狂打call&#xff0c;文心一言对话刷屏朋友圈&#xff0c;普通人和科技圈都嗨翻了。 不到24小时&#xff…

硬件SPI口扩展

在工控板设计中&#xff0c;经常会遇到扩展IO。具有相同的功能电路板接口相同&#xff0c;所以很容易采用排线方式连接到CPU主控板上&#xff0c;这种排线连接&#xff0c;我称之为总线。 现在的CPU引脚多&#xff0c;不扩展IO&#xff0c;使用模拟SPI&#xff0c;也可以实现&…

【力扣每日一题】2023.9.2 最多可以摧毁的敌人城堡数量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题难在阅读理解&#xff0c;题目看得我匪夷所思&#xff0c;错了好多个测试用例才明白题目说的是什么。 我简单翻译一下就是寻找1和…

15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized

Synchronized 本篇文章将围绕synchronized关键字&#xff0c;使用大量图片、案例深入浅出的描述CAS、synchronized Java层面和C层面的实现、锁升级的原理、源码等 大概观看时间17分钟 可以带着几个问题去查看本文&#xff0c;如果认真看完&#xff0c;问题都会迎刃而解&…

03_nodjs_npm的使用

03 【npm的使用】 1.包和npm 1.1 什么是包 由于 Node 是一套轻内核的平台&#xff0c;虽然提供了一系列的内置模块&#xff0c;但是不足以满足开发者的需求&#xff0c;于是乎出现了包&#xff08;package&#xff09;的概念&#xff1a; 与核心模块类似&#xff0c;就是将一…