zoukankan      html  css  js  c++  java
  • mybatis 动态sql

    MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

    虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。

    动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

    • if
    • choose (when, otherwise)
    • trim (where, set)
    • foreach

    HouseDAO.xml:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <mapper namespace="com.etc.dao.HouseDAO">
     4 
     5    <!--查询单个条件 相当于switch=choose  when=case otherwise=default-->
     6     <select id="searchSim" resultType="house">
     7         select * from t_house
     8         <where>
     9             <choose>
    10                 <when test="title!=null">
    11                     title like '%${title}%'
    12                 </when>
    13                 <when test="price!=null">
    14                     price=#{price}
    15                 </when>
    16                 <otherwise>
    17                     1=1
    18                 </otherwise>
    19             </choose>
    20         </where>
    21     </select>
    22     <!--查询多个条件 if 如果存在就拼接
    23     select * from t_house where title like '%?%' and price=?
    24     -->
    25     <select id="searchOdd" resultType="house">
    26         select * from t_house
    27         <where>
    28             <if test="title!=null">
    29                 title like '%${title}%'
    30             </if>
    31             <if test="price!=null">
    32                 and price=#{price}
    33             </if>
    34         </where>
    35     </select>
    36     <!--查询in collection集合名 item:参数名 open close=() separator用逗号拼接
    37                 select * from t_house where id in (1,2,3)
    38     -->
    39     <select id="searchByIds" resultType="house">
    40         select * from t_house where id in
    41         <foreach collection="ids" item="id" open="(" close=")" separator=",">
    42             #{id}
    43         </foreach>
    44     </select>
    45     <!--更新(只更新存在的值)-->
    46     <update id="update">
    47         update t_house
    48         <set>
    49             <if test="title!=null">
    50                 title=#{title},
    51             </if>
    52             <if test="price!=null">
    53                 price=#{price}
    54             </if>
    55         </set>
    56         where id =#{id}
    57     </update>
    58 
    59 </mapper>

    com.etc.dao.HouseDAO:
     1 package com.etc.dao;
     2 
     3 import com.etc.entity.House;
     4 import org.apache.ibatis.annotations.Param;
     5 
     6 import java.util.List;
     7 
     8 public interface HouseDAO {
     9 
    10     //查询单个条件 利用switch
    11     List<House> searchSim(House house);
    12     //查询多个条件 利用if
    13     List<House> searchOdd(House house);
    14     //查询in
    15     List<House> searchByIds(@Param("ids") List<Integer> ids);
    16     //更新(只更新存在的值)
    17     void update(House house);
    18 }

    mybatis-config.xml:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration PUBLIC
     3         "-//mybatis.org//DTD Config 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
     5 <configuration>
     6 
     7     <!-- 别名 -->
     8     <typeAliases>
     9         <package name="com.etc.entity"></package>
    10     </typeAliases>
    11 
    12     <!-- 配置环境变量 -->
    13     <!-- 开发 测试  预生产 生产 -->
    14     <environments default="development">
    15         <environment id="development">
    16             <transactionManager type="JDBC"/>
    17             <dataSource type="POOLED">
    18                 <property name="driver" value="com.mysql.jdbc.Driver"/>
    19                 <property name="url"
    20                           value="jdbc:mysql://127.0.0.1:3310/mybatis"/>
    21                 <property name="username" value="root"/>
    22                 <property name="password" value="123456"/>
    23             </dataSource>
    24         </environment>
    25     </environments>
    26 
    27 
    28     <!-- 配置mappers -->
    29     <mappers>
    30         <mapper resource="HouseDAO.xml"></mapper>
    31     </mappers>
    32 
    33 </configuration>
    View Code

     

    com.etc.dao.HouseTest:

     1 package com.etc.dao;
     2 
     3 import com.etc.entity.House;
     4 import org.apache.ibatis.io.Resources;
     5 import org.apache.ibatis.session.SqlSession;
     6 import org.apache.ibatis.session.SqlSessionFactory;
     7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     8 import org.junit.Test;
     9 
    10 import java.io.IOException;
    11 import java.io.InputStream;
    12 import java.util.List;
    13 
    14 public class HouseTest {
    15 
    16     @Test
    17     public void test() throws IOException {
    18         //加载配置文件 会话工厂
    19         InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
    20         SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    21 
    22         //会话   ==相当于数据库连接
    23         SqlSession session=sqlSessionFactory.openSession();
    24 
    25         HouseDAO houseDAO=session.getMapper(HouseDAO.class);
    26 
    27         House house=new House();
    28 //        house.setTitle("he");
    29 //        house.setPrice(1300.0);
    30 //        house.setId(1);
    31 
    32 //        List<House> search=houseDAO.searchSim(house);
    33         List<House> search=houseDAO.searchOdd(house);
    34 //        List<House> search=houseDAO.searchByIds(Arrays.asList(1,2,3));
    35 //        houseDAO.update(house);
    36         for (House h:search)
    37             System.out.println(h);
    38 
    39 
    40 
    41         session.commit();
    42         session.close();
    43     }
    44 }
    View Code
  • 相关阅读:
    重构:以Java POI 导出EXCEL为例
    从源码角度看LinkedList一些基本操作(jdk1.7)
    OpenCV学习笔记(1)
    尝试实现手势控制计算机(持续跟进)
    神经网络学习笔记三——梯度检验、高级优化
    神经网络学习笔记二——反向传导
    神经网络学习笔记一——Neural Network
    C++ 指针和引用 吐血整理 Pointer&Reference
    BST 解析 (二)height and deletion
    BST 解析 (一)
  • 原文地址:https://www.cnblogs.com/LiuOOP/p/11237216.html
Copyright © 2011-2022 走看看