(四)resultMap、sql片段与动态SQL
一、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对象中,因为属性名和字段名必须一致。
- 解决方法如下:
- <resultMap type="com.shyroke.entity.User" id="userMap">
- <id column="id" property="id" />
- <result column="userName" property="userName" />
- <result column="passWord" property="passWord" />
- </resultMap>
- column的值对应着property的值,即数据库字段(column)对应着pojo对象的属性(property)。
- <resultMap type="com.shyroke.entity.User" id="userMap">
二、SQL片段
2.1 案例一
- UserMapper.java
- package com.shyroke.mapper;
- import java.util.List;
- import com.shyroke.entity.User;
- public interface UserMapper {
- public List<User> findUserByName(String userName);
- }
UserMapper.xml
- <?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.shyroke.mapper.UserMapper">
- <resultMap type="com.shyroke.entity.User" id="userMap">
- <id column="id" property="id" />
- <result column="userName" property="userName" />
- <result column="passWord" property="passWord" />
- </resultMap>
- <sql id="user_where">
- <if test="_parameter !=null and _parameter.length()>0">
- and userName like '%${_parameter}%'
- </if>
- </sql>
- <select id="findUserByName" parameterType="string" resultMap="userMap">
- select * from user
- <where>
- <include refid="user_where"></include>
- </where>
- </select>
- </mapper>
- where标签相当于where关键字,可以自动除去第一个and。
- 引用sql片段,如果sql片段和引用处不在同一个mapper 必须在前边加namespace.
App.java:
- package com.shyrolk.firstMybatis;
- import java.awt.image.ImageProducer;
- import java.io.InputStream;
- import java.util.List;
- import javax.swing.plaf.synth.SynthSeparatorUI;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import com.shyroke.entity.User;
- import com.shyroke.entity.User2;
- import com.shyroke.mapper.UserMapper;
- /**
- * Hello world!
- *
- */
- public class App
- {
- public static void main( String[] args )
- {
- InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml");
- SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
- SqlSession sqlSession=sqlSessionFactory.openSession();
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- List<User> userList=userMapper.findUserByName("min");
- System.out.println(userList);
- sqlSession.close();
- }
- }
结果:
2.2 foreach
- 在statement中通过foreach遍历parameterType中的集合类型
- 需求:根据多个用户id查询用户信息
- 案例:UserMapper.java
- package com.shyroke.mapper;
- import java.util.List;
- import com.shyroke.entity.User;
- public interface UserMapper {
- public List<User> findUserListById(List<Integer> idList);
- }
UserMapper.xml:
- <?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.shyroke.mapper.UserMapper">
- <resultMap type="com.shyroke.entity.User" id="userMap">
- <id column="id" property="id" />
- <result column="userName" property="userName" />
- <result column="passWord" property="passWord" />
- </resultMap>
- <select id="findUserListById" resultMap="userMap" >
- select * from user
- <where>
- <foreach collection="list" open="id in(" close=")" item="id"
- separator=",">
- #{id}
- </foreach>
- </where>
- </select>
- </mapper>
- collection: pojo中的表示集合的属性
- open: 开始循环拼接的串
- close: 结束循环拼接的串
- item: 每次循环从集合中取到的对象
- separator: 没两次循环中间拼接的串
- index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置
App.java:
- package com.shyrolk.firstMybatis;
- import java.awt.image.ImageProducer;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.swing.plaf.synth.SynthSeparatorUI;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import com.shyroke.entity.User;
- import com.shyroke.entity.User2;
- import com.shyroke.mapper.UserMapper;
- /**
- * Hello world!
- *
- */
- public class App
- {
- public static void main( String[] args )
- {
- InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml");
- SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
- SqlSession sqlSession=sqlSessionFactory.openSession();
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- List<Integer> idList=new ArrayList<Integer>();
- idList.add(2);
- idList.add(4);
- List<User> userList=userMapper.findUserListById(idList);
- System.out.println(userList);
- sqlSession.close();
- }
- }
结果:
(四)resultMap、sql片段与动态SQL的更多相关文章
- MyBatis框架之SQL映射和动态SQL
使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...
- .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. ...
- PL/SQL开发中动态SQL的使用方法
一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使 ...
- 数据库系统学习(十)-嵌入式SQL语言之动态SQL
第十讲 嵌入式SQL语言之动态SQL 静态SQL 区别变量和属性:高级语言向嵌入式SQL传递变量的方法 动态SQL 动态构造SQL语句是应用程序员必须掌握的重要手段 SQL语句的动态构造示例 根据界面 ...
- SQL SERVER 执行动态SQL EXEC
:普通SQL语句可以用Exec执行 eg: Select * from tableName Exec('select * from tableName') Exec sp_executesql N's ...
- 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...
- SQL Server 2012 - 动态SQL查询
动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...
- sql server2008 获取动态sql的变量值
--通过SQL 字符串 查询 获取查出的值sp_executesql declare @QuerySql nvarchar(500),@uid int,@Ucode varchar(100);set ...
- sql server 获取动态sql输出结果
不带输出结果 我们一般会这样写 例子:一个输出6位递增号码结果 ALTER proc GetCode ), ) as declare @sqlstring nvarchar(max) set @sql ...
随机推荐
- Python网络爬虫学习手记(1)——爬虫基础
1.爬虫基本概念 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.--------百度百科 简单的说,爬 ...
- OpenJudge计算概论-整数的个数
/*========================================================== 整数的个数 总时间限制: 1000ms 内存限制: 65536kB 描述 给定 ...
- python 适合的才是最好的
群里老有人问最新的破解码最新的包,最新的就是最好的吗? 今天说一下这些新手的坑: numpy 最好使用的版本是1.13.3 而非新的1.17.0 pandas最好使用的版本是0.18.0 而非新的0 ...
- 012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue
一.SynchronousQueue概述 SynchronousQueue是一个不存储元素的队列.每一个put操作必须等待一个take操作,否则不能继续添加元素. 它支持公平访问队列.默认情况下线程采 ...
- 最简易的python web框架的后端实现
1.源代码 #!/usr/bin/python #encoding=utf-8 from flask import json, Flask, request app = Flask(__name__) ...
- 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 ...
- 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=" ...
- 执行spark-shell报错:
执行spark-shell报错: [ERROR] Terminal initialization failed; falling back to unsupportedjava.lang.NoClas ...
- spark实现wordcount
spark-shell --master yarnsc:val lineRDD=sc.textFile("/test/input/test")lineRDD.collect().f ...
- vmware安装centos7.5、配置网卡、环境配置
1.vmware安装centos7.5虚拟机 参考连接: https://blog.csdn.net/guo_ridgepole/article/details/78973763 可能遇到的问题 ...