当前位置: 首页 > article >正文

MyBatis最佳实践:动态 SQL

 第一章: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 条件查询 -->
      <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 条件查询 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;
            }
        
            @Override
            public 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 mapper
      PUBLIC "-//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.kler.cn/a/517581.html

相关文章:

  • 【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)
  • 谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计
  • 关于使用微服务的注意要点总结
  • 2025牛客寒假算法基础集训营2
  • Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置
  • 单链表算法实战:解锁数据结构核心谜题——链表的回文结构
  • ANSYS SimAI
  • leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先
  • 为AI聊天工具添加一个知识系统 之68 详细设计 之9 三种中台和时间度量
  • web前端三大主流框架对比,Angular和React和Vue的区别
  • 【Elasticsearch】如何重新启动_reindex任务?
  • Flutter 与 React 前端框架对比:深入分析与实战示例
  • electron打包客户端在rk3588上支持h265硬解
  • AcWing 3585:三角形的边 ← sort() 函数
  • 矩阵的秩在机器学习中具有广泛的应用
  • 解锁C# EF/EF Core:从入门到进阶的技术飞跃
  • AJAX笔记入门篇
  • 免费高效截图软件(snipaste)附下载链接
  • 亚洲加密市场交易量激增,Safe RWA协议助力 Cobo 与 HQ.xyz 处理超 14.9 亿美元交易
  • 人工智能检测中查全率与查准率的权衡分析
  • Fullcalendar @fullcalendar/react 样式错乱丢失问题和导致页面卡顿崩溃问题
  • Android中Service在新进程中的启动流程3
  • Vue 3 的 setup 函数
  • Gaea项目的挑战与机遇:去中心化AI平台的未来发展
  • 洛谷 B2031:计算三角形面积 ← 叉积
  • 飞行器半实物联合仿真:技术解析与应用实践