动态Sql语句中标签的使用

(一)常用标签

1.<if>

if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值

2.<where>

where元素的作用是给SQL语句添加一个条件判断. 如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上

3.<foreach>

主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有item,index,collection,open,separator,close

collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合

    item : 表示在迭代过程中每一个元素的别名

    index :表示在迭代过程中每次迭代到的位置(下标)

    open :前缀

    close :后缀

    separator :分隔符,表示迭代时每个元素之间以什么分隔

(二)应用

1.pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.11</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>5.1.41</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.mybatis</groupId>
  14. <artifactId>mybatis</artifactId>
  15. <version>3.4.6</version>
  16. </dependency>
  17. </dependencies>

2.SqlMapperConfig.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <!DOCTYPEconfiguration
  4.  
  5. PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
  6.  
  7. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  8.  
  9. <!--mybatis的主配置文件-->
  10.  
  11. <configuration>
  12.  
  13. <!--配置环境-->
  14.  
  15. <environments default="mysql">
  16.  
  17. <!--配置mysql环境-->
  18.  
  19. <environment id="mysql">
  20.  
  21. <!--配置事务的类型-->
  22.  
  23. <transactionManager type="JDBC"></transactionManager>
  24.  
  25. <!--配置数据源(连接池)-->
  26.  
  27. <dataSource type="POOLED">
  28.  
  29. <!--配置连接数据库的4个基本信息-->
  30.  
  31. <property name="driver" value="com.mysql.jdbc.Driver"></property>
  32.  
  33. <property name="url" value="jdbc:mysql://localhost:3306/zml?useUnicode=true&amp;characterEncoding=utf-8"></property>
  34.  
  35. <property name="username" value="root"></property>
  36.  
  37. <property name="password" value="root"></property>
  38.  
  39. </dataSource>
  40.  
  41. </environment>
  42.  
  43. </environments>
  44.  
  45. <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
  46.  
  47. <mappers>
  48.  
  49. <mapper resource="dao/UserDao.xml"></mapper>
  50.  
  51. </mappers>
  52.  
  53. </configuration>

3.Users.java

  1. package entity;
  2.  
  3. public class Users {
  4.  
  5. private int id;
  6.  
  7. private String username;
  8.  
  9. private String password;
  10.  
  11. public int getId() {
  12.  
  13. return id;
  14.  
  15. }
  16.  
  17. public void setId(int id) {
  18.  
  19. this.id = id;
  20.  
  21. }
  22.  
  23. public String getUsername() {
  24.  
  25. return username;
  26.  
  27. }
  28.  
  29. public void setUsername(String username) {
  30.  
  31. this.username = username;
  32.  
  33. }
  34.  
  35. public String getPassword() {
  36.  
  37. return password;
  38.  
  39. }
  40.  
  41. public void setPassword(String password) {
  42.  
  43. this.password = password;
  44.  
  45. }
  46.  
  47. @Override
  48.  
  49. public String toString() {
  50.  
  51. return "Users{" +
  52.  
  53. "id=" + id +
  54.  
  55. ", username='" + username + '\'' +
  56.  
  57. ", password='" + password + '\'' +
  58.  
  59. '}';
  60.  
  61. }
  62.  
  63. }

4.UserVo.java

  1. package entity;
  2.  
  3. import java.util.List;
  4.  
  5. public class UserVo {
  6.  
  7. private Users users;
  8.  
  9. private List<Integer> ids;
  10.  
  11. public Users getUsers() {
  12.  
  13. return users;
  14.  
  15. }
  16.  
  17. public void setUsers(Users users) {
  18.  
  19. this.users = users;
  20.  
  21. }
  22.  
  23. public List<Integer> getIds() {
  24.  
  25. return ids;
  26.  
  27. }
  28.  
  29. public void setIds(List<Integer> ids) {
  30.  
  31. this.ids = ids;
  32.  
  33. }
  34.  
  35. }

5.UserDao.java

  1. package dao;
  2.  
  3. import entity.UserVo;
  4.  
  5. import entity.Users;
  6.  
  7. import org.apache.ibatis.annotations.Param;
  8.  
  9. import java.util.List;
  10.  
  11. public interface UserDao {
  12.  
  13. //查询所有用户信息
  14.  
  15. List<Users> findAll();
  16.  
  17. //根据ID进行查询
  18.  
  19. Users find(int id);
  20.  
  21. //模糊查询
  22.  
  23. List<Users> findVague(String name);
  24.  
  25. //查询用户总数
  26.  
  27. int count();
  28.  
  29. //将实体类封装到另一个实体类中的模糊查询
  30.  
  31. List<Users> findVo(UserVo vo);
  32.  
  33. //根据传入参数进行查询
  34.  
  35. Users findby(Users users);
  36.  
  37. //根据UserVo中的ids集合查询用户信息
  38.  
  39. List<Users> findids(UserVo vo);
  40.  
  41. }

6.UserDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <!DOCTYPEmapper
  4.  
  5. PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
  6.  
  7. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  8.  
  9. <mapper namespace="dao.UserDao">
  10.  
  11. <!--查询所有-->
  12.  
  13. <select id="findAll" resultType="entity.Users">
  14.  
  15. select * from users
  16.  
  17. </select>
  18.  
  19. <!--根据ID查询-->
  20.  
  21. <select id="find" resultType="entity.Users">
  22.  
  23. select * from users where id=#{id}
  24.  
  25. </select>
  26.  
  27. <!--模糊查询-->
  28.  
  29. <select id="findVague" resultType="entity.Users">
  30.  
  31. -- select * from users where username like '%${value}%'
  32.  
  33. select * from users where username like #{name}
  34.  
  35. </select>
  36.  
  37. <!--查询用户总数-->
  38.  
  39. <select id="count" resultType="int">
  40.  
  41. select count(id) from users
  42.  
  43. </select>
  44.  
  45. <!--将实体类封装到另一个实体类中的模糊查询-->
  46.  
  47. <select id="findVo" resultType="entity.Users">
  48.  
  49. select * from users where username like #{users.username}
  50.  
  51. </select>
  52. <!--根据传入参数进行查询-->
  53.  
  54. <select id="findby" resultType="entity.Users" >
  55.  
  56. select * from users
  57.  
  58. <where>
  59.  
  60. <if test="id != null">
  61.  
  62. and id=#{id}
  63.  
  64. </if>
  65.  
  66. <if test="username != null">
  67.  
  68. and username=#{username}
  69.  
  70. </if>
  71.  
  72. </where>
  73.  
  74. </select>
  75.  
  76. <!--根据UserVo中的ids集合实现查询用户列表-->
  77.  
  78. <select id="findids" resultType="entity.Users" parameterType="entity.UserVo">
  79.  
  80. select * from users
  81.  
  82. <where>
  83.  
  84. <if test="ids != null and ids.size()>0">
  85.  
  86. <foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
  87.  
  88. #{id}
  89.  
  90. </foreach>
  91.  
  92. </if>
  93.  
  94. </where>
  95.  
  96. </select>
  97.  
  98. </mapper>

7.UserTest.java

  1. package test;
  2.  
  3. import dao.UserDao;
  4.  
  5. import entity.UserVo;
  6.  
  7. import entity.Users;
  8.  
  9. import org.apache.ibatis.io.Resources;
  10.  
  11. import org.apache.ibatis.session.SqlSession;
  12.  
  13. import org.apache.ibatis.session.SqlSessionFactory;
  14.  
  15. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  16.  
  17. import org.junit.After;
  18.  
  19. import org.junit.Before;
  20.  
  21. import org.junit.Test;
  22.  
  23. import java.io.IOException;
  24.  
  25. import java.io.InputStream;
  26.  
  27. import java.util.ArrayList;
  28.  
  29. import java.util.List;
  30.  
  31. public class UserTest {
  32.  
  33. private InputStream in;
  34.  
  35. private SqlSession sqlSession;
  36.  
  37. private UserDao UserDaoImpl;
  38.  
  39. @Before
  40.  
  41. public void init() throws IOException {
  42.  
  43. //1.读取配置文件
  44.  
  45. in= Resources.getResourceAsStream("SqlMapperConfig.xml");
  46.  
  47. //2.创建SqlSessionFactory工厂
  48.  
  49. SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
  50.  
  51. SqlSessionFactory factory=builder.build(in);
  52.  
  53. //3.使用工厂生产SqlSession对象
  54.  
  55. sqlSession=factory.openSession();
  56.  
  57. //4.使用SqlSession创建dao接口的代理对象
  58.  
  59. UserDaoImpl=sqlSession.getMapper(UserDao.class);
  60.  
  61. }
  62.  
  63. @After
  64.  
  65. public void destroy() throws IOException {
  66.  
  67. //提交事务
  68.  
  69. sqlSession.commit();
  70.  
  71. //6.释放资源
  72.  
  73. sqlSession.close();
  74.  
  75. in.close();
  76.  
  77. }
  78.  
  79. /**
  80.  
  81. * 查询所有
  82.  
  83. * @throws IOException
  84.  
  85. */
  86.  
  87. @Test
  88.  
  89. public void findall() throws IOException {
  90.  
  91. //5.使用代理对象执行方法
  92.  
  93. List<Users> users=UserDaoImpl.findAll();
  94.  
  95. for(Users u:users){
  96.  
  97. System.out.println(u);
  98.  
  99. }
  100.  
  101. }
  102.  
  103. /**
  104.  
  105. * 根据ID进行查询
  106.  
  107. */
  108.  
  109. @Test
  110.  
  111. public void find(){
  112.  
  113. Users u=UserDaoImpl.find(15);
  114.  
  115. System.out.println(u);
  116.  
  117. }
  118.  
  119. /**
  120.  
  121. * 模糊查询,查询所有名字中有小的用户
  122.  
  123. * @throws IOException
  124.  
  125. */
  126.  
  127. @Test
  128.  
  129. public void findVague() throws IOException {
  130.  
  131. //5.使用代理对象执行方法
  132.  
  133. List<Users> users=UserDaoImpl.findVague("%小%");
  134.  
  135. for(Users u:users){
  136.  
  137. System.out.println(u);
  138.  
  139. }
  140.  
  141. }
  142.  
  143. /**
  144.  
  145. * 查询用户总数
  146.  
  147. */
  148.  
  149. @Test
  150.  
  151. public void count(){
  152.  
  153. int c=UserDaoImpl.count();
  154.  
  155. System.out.println(c);
  156.  
  157. }
  158.  
  159. /**
  160.  
  161. * 将实体类封装到另一个实体类中的模糊查询
  162.  
  163. */
  164.  
  165. @Test
  166.  
  167. public void findVo(){
  168.  
  169. UserVo vo=new UserVo();
  170.  
  171. Users users=new Users();
  172.  
  173. users.setUsername("%小%");
  174.  
  175. vo.setUsers(users);
  176.  
  177. List<Users> list=UserDaoImpl.findVo(vo);
  178.  
  179. for(Users u:list){
  180.  
  181. System.out.println(u);
  182.  
  183. }
  184.  
  185. }
  186.  
  187. /**
  188.  
  189. * if标签查询,查询用户名为小花,id为25的用户信息
  190.  
  191. */
  192.  
  193. @Test
  194.  
  195. public void findby(){
  196.  
  197. Users users=new Users();
  198.  
  199. users.setUsername("小花");
  200.  
  201. users.setId(25);
  202.  
  203. Users u=UserDaoImpl.findby(users);
  204.  
  205. System.out.println(u);
  206.  
  207. }
  208.  
  209. /**
  210.  
  211. * 根据UserVo中的ids集合查询用户信息
  212.  
  213. */
  214.  
  215. @Test
  216.  
  217. public void findids(){
  218.  
  219. UserVo vo=new UserVo();
  220.  
  221. List<Integer> list=new ArrayList<Integer>();
  222.  
  223. list.add(13);
  224.  
  225. list.add(14);
  226.  
  227. list.add(15);
  228.  
  229. vo.setIds(list);
  230.  
  231. List<Users> li=UserDaoImpl.findids(vo);
  232.  
  233. for(Users u:li){
  234.  
  235. System.out.println(u);
  236.  
  237. }
  238.  
  239. }
  240.  
  241. }

Mybatis学习笔记之---动态sql中标签的使用的更多相关文章

  1. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  2. Mybatis学习笔记(六) —— 动态sql

    通过mybatis提供的各种标签方法实现动态拼接sql. 需求:根据性别和名字查询用户 查询sql: SELECT id, username, birthday, sex, address FROM ...

  3. Mybatis学习笔记14 - 动态sql之foreach标签

    一.查询给定集合中员工id对应的所有员工信息 示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import ...

  4. Mybatis学习笔记11 - 动态sql之trim标签

    trim标签体中是整个字符串拼串后的结果.prefix="" 前缀: prefix给拼串后的整个字符串加一个前缀prefixOverrides="" 前缀覆盖: ...

  5. Mybatis学习笔记13 - 动态sql之set标签

    示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapp ...

  6. Mybatis学习笔记12 - 动态sql之choose(when otherwise)标签

    choose (when, otherwise):分支选择:带了break的swtich-case 示例代码: 接口定义: package com.mybatis.dao; import com.my ...

  7. 1.3(Mybatis学习笔记)动态SQL

    一.<if> 使用<if>可以根据具体情况来拼接SQL语句,使其更加灵活更加适应我们的需求. <if>的标签体中是需要拼接的语句,满足条件才会将其进行拼接. < ...

  8. Mybatis学习笔记10 - 动态sql之if判断

    示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import java.util.List; public ...

  9. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL 如果使用JDBC或者其他框架,很多时候需要你根据需求手动拼装SQL语句,这是一件非常麻烦的事情.MyBatis提供了对SQL语句动态的组装能力,而且他只有 ...

随机推荐

  1. 实战Spring4+ActiveMQ整合实现消息队列(生产者+消费者)

    引言: 最近公司做了一个以信息安全为主的项目,其中有一个业务需求就是,项目定时监控操作用户的行为,对于一些违规操作严重的行为,以发送邮件(ForMail)的形式进行邮件告警,可能是多人,也可能是一个人 ...

  2. 【深入浅出-JVM】(6):栈帧.

    代码 package com.mousycoder.mycode.happy_jvm; /** * @version 1.0 * @author: mousycoder * @date: 2019-0 ...

  3. Docker笔记(四):Docker镜像管理

    原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...

  4. requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))【已解决】

     问题: 跑python自动化时出现报错如下图 解决: requests请求时,后面加上参数:stream=True. 参考外国小哥:https://stackoverflow.com/questio ...

  5. 利用openpyxl模块处理excel表格

    一.选取表格中的内容创建图表 1.openpyxl支持利用工作表中单元格的数据,创建条形图.折线图.散点图等.步骤如下: 1).从一个矩形区域选择的单元格,创建一个Reference对象. 2).通过 ...

  6. panic: time: missing Location in call to Time.In

    docker容器发布go项目出现以下问题: panic: time: missing Location in call to Time.In COPY --from=build /usr/share/ ...

  7. Python登录豆瓣并爬取影评

    上一篇我们讲过Cookie相关的知识,了解到Cookie是为了交互式web而诞生的,它主要用于以下三个方面: 会话状态管理(如用户登录状态.购物车.游戏分数或其它需要记录的信息) 个性化设置(如用户自 ...

  8. TinycoreLinux的安装使用

    下载 http://www.tinycorelinux.net/7.x/x86_64/release/ distribution_files/ 05-Apr-2016 07:29 - src/ 24- ...

  9. [剑指offer] 34. 第一个只出现一次的字符

    题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 一次遍历存储到哈希表 一次 ...

  10. 蓝牙Beacon广播数据包格式以及解析

    目录 1. 获取原始蓝牙广播包 2. 安装WireShark软件 3. 分析Beacon广播包数据 3.1 第一个数据包格式 3.2 第二个数据包格式 3.3 Android程序开发中的蓝牙广播包 4 ...