MyBatis最佳实践:动态 SQL

server/2025/1/24 7:27:36/

 第一章:MyBatis 映射文件 SQL 深入

  1. 配置 log4j.properrties 配置文件
    1. 该配置文件可打印输出 SQL 查询的日志
      #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
      log4j.rootLogger=DEBUG,console,file#控制台输出的相关设置
      log4j.appender.console = org.apache.log4j.ConsoleAppender
      log4j.appender.console.Target = System.out
      log4j.appender.console.Threshold=DEBUG
      log4j.appender.console.layout = org.apache.log4j.PatternLayout
      log4j.appender.console.layout.ConversionPattern=[%c]-%m%n#文件输出的相关设置
      log4j.appender.file = org.apache.log4j.RollingFileAppender
      log4j.appender.file.File=./log/kuang.log
      log4j.appender.file.MaxFileSize=10mb
      log4j.appender.file.Threshold=DEBUG
      log4j.appender.file.layout=org.apache.log4j.PatternLayout
      log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n#日志输出级别
      log4j.logger.org.mybatis=DEBUG
      log4j.logger.java.sql=DEBUG
      log4j.logger.java.sql.Statement=DEBUG
      log4j.logger.java.sql.ResultSet=DEBUG
      log4j.logger.java.sql.PreparedStatement=DEBUG
  2. 动态 SQL 语句之 if 标签:
    1. 之前做过拼接 SQL 语句查询条件的查询,需要动态的拼接 SQL 语句
    2. UserMapper 接口的方法
      public interface UserMapper {//条件查询public List<User> findByWhere(User user);
      }a
    3. UserMapper.xml 配置文件
      sql"><!-- 动态 SQL 条件查询 -->
      <select id="findByWhere" resultType="com.qcby.model.User">select * from user where 1 = 1<if test="username != null and username != ''">and username like #{username}</if><if test="sex != null and sex != ''">and sex = #{sex}</if>
      </select>
    4. 测试方法:
      @Test
      public void test() throws IOException {//加载主配置文件InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//创建 SqlSessionFactory 对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);SqlSession session = factory.openSession();UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User();user.setSex("男");List<User> byWhere = userMapper.findByWhere(user);for (User u : byWhere){System.out.println(u);}session.close();in.close();
      }
  3. 动态 SQL 语句之 where 标签:
    1. where 标签的目的就是为了去掉 where 1 = 1 的拼接
    2. where 标签使用在 if 标签的外面
    3. 代码:
      sql"><!-- 动态 SQL 条件查询 where 标签 -->
      <select id="findByWhere" resultType="com.qcby.model.User">select * from user <where><if test="username != null and username != ''">and username like #{username}</if><if test="sex != null and sex != ''">and sex = #{sex}</if></where>
      </select>
  4.  动态 SQL 语句之  foreach 标签:
    1. 需求一:
      1. 需求的 SQL 语句:select * from user where id = 1 or id = 2 or id = 3
      2. 在 User类中添加属性:
        public class User implements Serializable {private static final long serialVersionUID = 525400707336671154L;private Integer id;private String username;private Date birthday;private String sex;private String address;private List<Integer> ids;public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +", ids=" + ids +'}';}
        }
      3. UserMapper 接口中添加方法:
        //动态 SQL  foreach 循环
        public List<User> findByIds(User user);
      4. 编写配置文件:
        <!-- 动态 SQL  foreach 循环 -->
        <select id="findByIds" resultType="com.qcby.model.User">select * from user<where><foreach collection="ids" open="id=" separator="or id =" item="i">#{i}</foreach></where>
        </select>
      5. 编写测试方法:
        @Test
        public void FindByIds() throws IOException {//加载配置文件InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");//创建工厂对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);//创建 SqlSession 对象SqlSession session = factory.openSession();User user = new User();List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(2);ids.add(44);user.setIds(ids);//查询UserMapper userMapper = session.getMapper(UserMapper.class);List<User> byIds = userMapper.findByIds(user);for(User u: byIds){System.out.println(u);}//关闭资源session.close();inputStream.close();
        }
    2. 需求二:
      1. 需求 SQL: selelct * from user where id in (1,2,3);
      2. 编写配置文件:
        <select id="findByIdsIn" parameterType="com.qcby.model.User" resultType="com.qcby.model.User">select * from user<where><foreach collection="ids" open="id in (" separator="," close=")" item="i">#{i}</foreach></where>
        </select>
  5. 提取公用的 SQL 语句:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.qcby.mapper.UserMapper"><!-- 提取公共的 SQL --><sql id="findAllSQL">select * from user</sql><!-- 编写 sql 语句 --><select id="findAll" parameterType="com.qcby.model.User">/* 引用公共 SQL */<include refid="findAllSQL"></include></select><!-- 使用 where 关键字 --><select id="findByWhere" parameterType="com.qcby.model.User" resultType="com.qcby.model.User"><include refid="findAllSQL"/><where><if test="username != null and username != ''">username = #{username}</if><if test="sex != null and sex != ''">and sex = #{sex}</if></where></select><!-- 使用 foreach 语句--><select id="findByIds" parameterType="com.qcby.model.User" resultType="com.qcby.model.User"><include refid="findAllSQL"></include><where><foreach collection="ids" open="id in (" separator="," close=")" item="i">#{i}</foreach></where></select></mapper>


http://www.ppmy.cn/server/160968.html

相关文章

爬虫基础之爬取某站视频

目标网址:为了1/4螺口买小米SU7&#xff0c;开了一个月&#xff0c;它值吗&#xff1f;_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…

Formality:时序变换(二)(不可读寄存器移除)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生&a…

0基础跟德姆(dom)一起学AI 自然语言处理21-fasttext模型架构

1 Fasttext模型架构 FastText 模型架构和 Word2Vec 中的 CBOW 模型很类似, 不同之处在于, FastText 预测标签, 而 CBOW 模型预测中间词. FastText的模型分为三层架构: 输入层: 是对文档embedding之后的向量, 包含N-gram特征隐藏层: 是对输入数据的求和平均输出层: 是文档对应…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

mysql 学习3 SQL语句--整体概述。SQL通用语法,SQL语句分类

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…

YOLOv9改进,YOLOv9检测头融合DSConv卷积,适合目标检测、分割任务

前言 精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知…

LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统

单纯仅靠LLM会产生误导性的 “幻觉”&#xff0c;训练数据会过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generati…

Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽

大家读完记得觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 此分享内容比较专业&#xff0c;很多与硬件和通讯规则及队列&#xff0c;比较底层需要有技术功底人员深入解读。 Linux 的带宽管理能力 足以媲美许多高端、专用的带宽管理系统。 1 队列&#xff0…