Mybatis笔记 – Po映射类型
一、输入映射类型
parameterType定义输入到sql中的映射类型,可以是 简单类型 、po类对象(可自动生成 或 手动定义)、 pojo包装对象(用于综合查询,UserCustom用户自定义对象 、UserQueryvo视图层对象包)、hashMap对象、集合对象以及数组(使用foreach拼接动态sql)等,建议使用pojo包装对象或map对象,以保证Dao的通用性。
1、基本数据类型
//基本类型 <select id="findEmpByName" parameterType="int” >select * from emp where empno=#{empno} </select> //类型打包器 <select id="findEmpByName" parameterType="java.lang.Integer” >select * from emp where empno=#{empno} </select>
2、pojo类型
//pojo类对象 <select id="findEmpByName" parameterType="Po.Emp” >select * from emp where empno=#{empno} </select> //pojo包装类对象 <select id="findEmpByName" parameterType="Po.EmpVo” >select * from emp where otherMsg = #{Emp.otherMsg} </select>
3、hashMap对象
<select id="findUserByHashmap" parameterType="map" resultType="user">select * from user where id=#{id} and username like '%${username}%' </select>//构造查询条件Hashmap对象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理员");//传递Hashmap对象查询用户列表 List<User>list = userMapper.findUserByHashmap(map);
若传递的map中的key和sql中解析的key不一致。Eclipse不会报错,只是通过key获取值为空。
4、占位字符
(1)#{}占位符号
SQLl语句中【 #{} 】示一个占位符即【?】,通过#{}可以实现向preparedStatement中的预处理语句中设置占位符号,mybatis底层通过ognl从pojo中获取属性值,后再将输入变量id传到sql。
<select id="findEmpById" parameterType="int" resultType="Emp">select * from emp where empno = #{对象.属性值} </select>
使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型、pojo、HashMap。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称;如果${}接收pojo对象值,通过【属性.对象属性】获取对象属性值。特别的:String、Array、类型打包器都获取属性值用value。
(2)拼接字符
【${}】表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换。${}可以接收简单类型值、pojo、HashMap。如果parameterType传输单个简单类型值,如果接收简单类型,${}括号中只能是value;如果${}接收pojo对象值,通过【属性.对象属性】获取对象属性值。
① 用于使用通配符进行模糊查找(可能会引起sql注入)
<select id="selectEmpByName" parameterType="string" resultType="Emp">select * from emp where ename like '%${value}%' </select>//如果使用占位符号则必须人为在传参数中加%,较为麻烦 List<User> list = userMapper.selectUserByName("%管理员%");//如果使用${}拼接符号则不用人为在参数中加%,建议使用 List<User>list = userMapper.selectUserByName("管理员");
//如果输入的是 【OR 1=1 OR】,会返回表中的全部记录(SQL注入)
//SQL语句为:select * from emp where ename like '%’ OR 1=1 OR '%’'
② 用于在SQL语句中拼接【列名 或 表名】
如果将列名通过参数传入sql,根据传的列名进行排序,应该使用拼接字符,使用#{}将无法实现此功能。
//计算记录数,拼接表名 <select id="findTableCount" parameterType ="java.lang.String" resultType="int">select count(*) from ${value} </select> //可以根据传入的表名,返回不同表中的记录数 int i = sqlSession.selectOne("EmpDao.findTableCount", "dept");//order by排序,拼接列名 ORDER BY ${columnName}
二、ResultType
使用resultType可以将查询结果映射为pojo类型,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
1、基本数据类型
<select id="findEmpCount" resultType="int">select count(1) from emp </select> //原始Dao开发方式 int i = sqlSession.selectOne("EmpDao.findEmpCount", null); //Mapper代理的方式 int count = empMapper.findEmpCount(emp);
输出简单类型必须查询出来的结果集只有一条记录,最终将第一个字段的值转换为输出类型。
2、pojo类对象
//输出pojo对象 <select id="findUserById" parameterType="int" resultType="user">select * from user where id = #{id} </select>//输出pojo列表 <select id="findUserByUsername" parameterType="string" resultType="user">select * from user where username like '%${value}%' </select>
输出pojo对象和输出pojo列表在sql中定义的resultType是一样的,但在mapper.java指定的方法返回值类型不一样。生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 )。
返回单个pojo对象,要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
返回pojo列表,表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List<pojo>对象作为方法返回值。
3、hashMap
输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。
<select id="findEmpById" parameterType="int" resultType="map">select * from emp where empno = #{empno} </select>//查询记录 HashMap<String, Object> emp = sqlSession.selectOne("EmpDao.findEmpById", 7369); //获取键值对 System.out.println(""+emp.get("EMPNO")+ emp.get("ename"));
三、ResultMap结果集
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,但实质上还需要将查询结果映射到pojo对象中。
resultMap还可以实现将查询结果映射为复杂类型的pojo,完成高级输出结果映射。比如在查询结果映射对象中包括pojo和list实现关联查询。
//定义ResultMap
<resultMap type="po.Emp" id="empResultMap"><id column="empno" property="id"/><result column="ename" property="name"/> </resultMap>
//引用ResultMap
<select id="findEmpById" parameterType="int" resultType="empResultMap">select * from emp where empno = #{empno} </select
(1)定义resultMap的参数含义
type:resultMap最终映射的java对象类型的 全名 或 别名
id:对resultMap的唯一标识。
(2) 定义映射关系的参数含义
<id />:查询结果集的唯一标识。如果是多个字段为复合唯一约束则定义多个<id/>。
<result />:对普通名映射定义。
Column:表示sql查询出来的字段名 或 别名。
property:type指定的pojo类型中的属性名或 别名。
转载于:https://www.cnblogs.com/sh086/p/8380539.html
Mybatis笔记 – Po映射类型相关推荐
- python映射类型-python2.x学习笔记(8)-映射和集合类型
1. 字典是 Python 语言中唯一的映射类型.映射类型对象里哈希值(键) 和指向的对象(值)是一对一的关系. 2. 一个字典对象是可变的,它是一个容器类型,能存储任意个数的 Python 对象,其 ...
- python映射类型-python第二版7章笔记--映射和集合类型
7.1 映射 字典是 Python 语言中唯一的映射类型.映射类型对象里哈希值(键) 和指向的对象(值)是一对多的关系. 它们与 Perl 中的哈希类型(译者注:又称关联数组)相似,通常被认为是可变的 ...
- python序列类型唯一的映射类型_python2.x学习笔记(8)-映射和集合类型
1. 字典是 Python 语言中唯一的映射类型.映射类型对象里哈希值(键) 和指向的对象(值)是一对一的关系. 2. 一个字典对象是可变的,它是一个容器类型,能存储任意个数的 Python 对象,其 ...
- MyBatis Review——输入输出映射
一,输入映射 mybatis的输入映射通过parameterType指定,可以为简单类型,包装类型,hashmap类型. 1,简单类型 <select id="findUserByNa ...
- MyBatis笔记二:配置
MyBatis笔记二:配置 1.全局配置 1.properites 这个配置主要是引入我们的 properites 配置文件的: <properties resource="db.pr ...
- MyBatis学习--高级映射
简介 前面说过了简单的数据库查询和管理查询,在开发需求中有一些一对一.一对多和多对多的需求开发,如在开发购物车的时候,订单和用户是一对一,用户和订单是一对多,用户和商品是多对多.这些在Hibernat ...
- MyBatis的关联映射之 一对一(嵌套查询/嵌套结果)
关联映射概述 在实际的开发中,对数据库的操作常常会涉及多张表,这在面向对象中就涉及了对象与对象之间的关联关系 针对多表之间的操作, MyBatis 提供了关联映射,通过关联映射就可以很好地处理对象与对 ...
- MyBatis学习之映射器Mapper(接口映射器+xml映射文件)
Table of Contents 01 MyBatis映射器: 1.1 接口映射器+xml映射器 1.2 接口映射器+注解 02 接口映射器+xml映射器 方式 2.1 mybatis配置文件 引 ...
- Mybatis笔记一
课程安排: mybatis和springmvc通过订单商品 案例驱动第一天:基础知识(重点,内容量多)对原生态jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理 (掌握)mybatis ...
最新文章
- python怎么读文件内容-Python 文件内容读取
- C#——《C#语言程序设计》实验报告——数据库编程——基于ADO.NET技术的数据库操作DEMO
- [css] 用css实现一个等腰三角形的小图标
- win10连接VMWare下的Ubutun系统进行FPT文件传输
- 程序员求助:腾讯面试题,64匹马8个跑道,多少轮选出最快的四匹
- Soul 网关源码阅读(四)Dubbo请求概览
- IOS开发常用插件(二)
- python 中self
- 有东西,可以倚老卖老,可以倚少卖少
- html 字体设置草体,CSS 网页安全字体
- K3 设置为AP,用于软件路由的后级。
- PS亮度蒙版插件TKActions V5 Mac版
- android身高控件_Android 滑动选择身高体重控件——RulerView
- python实现excel单元格合并_python进行excel单元格合并逆操作
- JAVA实现 剑指offer第二版 2
- 小白学 Python 爬虫(26):为啥上海二手房你都买不起
- oracle在表中增加字段
- 解决cc2015到期后不能再次破解问题,及提供cutterman,Mark Man下载地址
- 雅俗共赏——广告词之很好很强大
- 为什么 FIQ 比 IRQ 的响应速度更快?
热门文章
- 打造IOS移动***测试平台
- 每天一个新标签/方法/属性/兼容性/问题
- (20120731)Android中的各种对话框总结(dialog)
- mac下修改mysql连接数_MySQL最大连接数设置
- Python中列表实现:输入年月日,输出本年的第?天
- 不懂电脑如何买电脑_买电脑交智商税?5分钟看懂笔记本电脑配置
- OKExChain主网支持EVM,OKB、OKT都将成为“铲子”
- SAP License:ERP项目经理需求调研的惨痛经历
- Javascript 汉字拼音排序
- SSZipArchive的使用详解和遇到的问题