一、resultMap

  1.1 为什么要用resultMap

  • resultType:指定输出结果的类型(pojo、简单类型、hashmap),将SQL查询结果映射为Java对象。

    使用resultType注意:sql查询的列名要和resultType指定pojo的属性相同,指定相同,属性方可映射成功。如果sql查询的列名要和resultType指定pojo的属性全部不相同,list中是无法创建pojo对象的。有几个属性对应相同,则能给对应相同的属性赋值。
    resultMap:将SQL查询结果映射为Java对象。如果SQL查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个映射关系(列名和属性名映射配置)。
  • 举例来讲,我们要查询学生记录,学生的pojo对象中的学生名为name,而数据库中的学生名字段为UserName,那么使用resultType则无法将查询到的学生记录映射到学生pojo对象中,因为属性名和字段名必须一致。
  • 解决方法如下:
    1. <resultMap type="com.shyroke.entity.User" id="userMap">
    2. <id column="id" property="id" />
    3. <result column="userName" property="userName" />
    4. <result column="passWord" property="passWord" />
    5. </resultMap>
    1.  
    1. column的值对应着property的值,即数据库字段(column)对应着pojo对象的属性(property)。
    1.  

二、SQL片段

2.1 案例一

  1. UserMapper.java
  1. package com.shyroke.mapper;
  2.  
  3. import java.util.List;
  4.  
  5. import com.shyroke.entity.User;
  6.  
  7. public interface UserMapper {
  8. public List<User> findUserByName(String userName);
  9. }

UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.shyroke.mapper.UserMapper">
  6.  
  7. <resultMap type="com.shyroke.entity.User" id="userMap">
  8. <id column="id" property="id" />
  9. <result column="userName" property="userName" />
  10. <result column="passWord" property="passWord" />
  11. </resultMap>
  12.  
  13. <sql id="user_where">
  14. <if test="_parameter !=null and _parameter.length()>0">
  15. and userName like '%${_parameter}%'
  16. </if>
  17. </sql>
  18.  
  19. <select id="findUserByName" parameterType="string" resultMap="userMap">
  20. select * from user
  21. <where>
  22. <include refid="user_where"></include>
  23. </where>
  24. </select>
  25.  
  26. </mapper>
  • where标签相当于where关键字,可以自动除去第一个and。
  • 引用sql片段,如果sql片段和引用处不在同一个mapper 必须在前边加namespace.

App.java:

  1. package com.shyrolk.firstMybatis;
  2.  
  3. import java.awt.image.ImageProducer;
  4. import java.io.InputStream;
  5. import java.util.List;
  6.  
  7. import javax.swing.plaf.synth.SynthSeparatorUI;
  8.  
  9. import org.apache.ibatis.session.SqlSession;
  10. import org.apache.ibatis.session.SqlSessionFactory;
  11. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  12.  
  13. import com.shyroke.entity.User;
  14. import com.shyroke.entity.User2;
  15. import com.shyroke.mapper.UserMapper;
  16.  
  17. /**
  18. * Hello world!
  19. *
  20. */
  21. public class App
  22. {
  23. public static void main( String[] args )
  24. {
  25.  
  26. InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml");
  27. SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
  28. SqlSession sqlSession=sqlSessionFactory.openSession();
  29.  
  30. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  31.  
  32. List<User> userList=userMapper.findUserByName("min");
  33. System.out.println(userList);
  34. sqlSession.close();
  35. }
  36. }

结果:

2.2 foreach

  • 在statement中通过foreach遍历parameterType中的集合类型
  • 需求:根据多个用户id查询用户信息
  • 案例:UserMapper.java
  1. package com.shyroke.mapper;
  2.  
  3. import java.util.List;
  4.  
  5. import com.shyroke.entity.User;
  6.  
  7. public interface UserMapper {
  8.  
  9. public List<User> findUserListById(List<Integer> idList);
  10. }

UserMapper.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.shyroke.mapper.UserMapper">
  6.  
  7. <resultMap type="com.shyroke.entity.User" id="userMap">
  8. <id column="id" property="id" />
  9. <result column="userName" property="userName" />
  10. <result column="passWord" property="passWord" />
  11. </resultMap>
  12.  
  13. <select id="findUserListById" resultMap="userMap" >
  14. select * from user
  15.  
  16. <where>
  17. <foreach collection="list" open="id in(" close=")" item="id"
  18. separator=",">
  19. #{id}
  20. </foreach>
  21.  
  22. </where>
  23. </select>
  24.  
  25. </mapper>
    1. collection: pojo中的表示集合的属性
    2. open: 开始循环拼接的串
    3. close: 结束循环拼接的串
    4. item: 每次循环从集合中取到的对象
    5. separator: 没两次循环中间拼接的串
    6. index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置

App.java:

  1. package com.shyrolk.firstMybatis;
  2.  
  3. import java.awt.image.ImageProducer;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import javax.swing.plaf.synth.SynthSeparatorUI;
  9.  
  10. import org.apache.ibatis.session.SqlSession;
  11. import org.apache.ibatis.session.SqlSessionFactory;
  12. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  13.  
  14. import com.shyroke.entity.User;
  15. import com.shyroke.entity.User2;
  16. import com.shyroke.mapper.UserMapper;
  17.  
  18. /**
  19. * Hello world!
  20. *
  21. */
  22. public class App
  23. {
  24. public static void main( String[] args )
  25. {
  26.  
  27. InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml");
  28. SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
  29. SqlSession sqlSession=sqlSessionFactory.openSession();
  30.  
  31. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  32.  
  33. List<Integer> idList=new ArrayList<Integer>();
  34. idList.add(2);
  35. idList.add(4);
  36. List<User> userList=userMapper.findUserListById(idList);
  37. System.out.println(userList);
  38. sqlSession.close();
  39. }
  40. }

结果:

(四)resultMap、sql片段与动态SQL的更多相关文章

  1. MyBatis框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

  2. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

  3. PL/SQL开发中动态SQL的使用方法

    一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使 ...

  4. 数据库系统学习(十)-嵌入式SQL语言之动态SQL

    第十讲 嵌入式SQL语言之动态SQL 静态SQL 区别变量和属性:高级语言向嵌入式SQL传递变量的方法 动态SQL 动态构造SQL语句是应用程序员必须掌握的重要手段 SQL语句的动态构造示例 根据界面 ...

  5. SQL SERVER 执行动态SQL EXEC

    :普通SQL语句可以用Exec执行 eg: Select * from tableName Exec('select * from tableName') Exec sp_executesql N's ...

  6. 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql

    一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...

  7. SQL Server 2012 - 动态SQL查询

    动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...

  8. sql server2008 获取动态sql的变量值

    --通过SQL 字符串 查询 获取查出的值sp_executesql declare @QuerySql nvarchar(500),@uid int,@Ucode varchar(100);set ...

  9. sql server 获取动态sql输出结果

    不带输出结果 我们一般会这样写 例子:一个输出6位递增号码结果 ALTER proc GetCode ), ) as declare @sqlstring nvarchar(max) set @sql ...

随机推荐

  1. Python网络爬虫学习手记(1)——爬虫基础

    1.爬虫基本概念 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.--------百度百科 简单的说,爬 ...

  2. OpenJudge计算概论-整数的个数

    /*========================================================== 整数的个数 总时间限制: 1000ms 内存限制: 65536kB 描述 给定 ...

  3. python 适合的才是最好的

    群里老有人问最新的破解码最新的包,最新的就是最好的吗? 今天说一下这些新手的坑: numpy 最好使用的版本是1.13.3  而非新的1.17.0 pandas最好使用的版本是0.18.0 而非新的0 ...

  4. 012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue

    一.SynchronousQueue概述 SynchronousQueue是一个不存储元素的队列.每一个put操作必须等待一个take操作,否则不能继续添加元素. 它支持公平访问队列.默认情况下线程采 ...

  5. 最简易的python web框架的后端实现

    1.源代码 #!/usr/bin/python #encoding=utf-8 from flask import json, Flask, request app = Flask(__name__) ...

  6. LeetCode_108. Convert Sorted Array to Binary Search Tree

    108. Convert Sorted Array to Binary Search Tree Easy Given an array where elements are sorted in asc ...

  7. Permission denied: user=dr.who, access=READ_EXECUTE, inode="/tmp":student:supergroup:drwx------权限问题

    在查看browse directory时,点击tmp,无法进入,报错:“Permission denied: user=dr.who, access=READ_EXECUTE, inode=" ...

  8. 执行spark-shell报错:

    执行spark-shell报错: [ERROR] Terminal initialization failed; falling back to unsupportedjava.lang.NoClas ...

  9. spark实现wordcount

    spark-shell --master yarnsc:val lineRDD=sc.textFile("/test/input/test")lineRDD.collect().f ...

  10. vmware安装centos7.5、配置网卡、环境配置

    1.vmware安装centos7.5虚拟机    参考连接: https://blog.csdn.net/guo_ridgepole/article/details/78973763 可能遇到的问题 ...