一、输入映射类型

parameterType定义输入到sql中的映射类型,可以是  简单类型  、po类对象(可自动生成 或 手动定义)、 pojo包装对象(用于综合查询,UserCustom用户自定义对象 、UserQueryvo视图层对象包)、hashMap对象、集合对象以及数组(使用foreach拼接动态sql)等,建议使用pojo包装对象或map对象,以保证Dao的通用性。

1、基本数据类型

  1. //基本类型
  2. <select id="findEmpByName" parameterType="int” >
  3. select * from emp where empno=#{empno}
  4. </select>
  5. //类型打包器
  6. <select id="findEmpByName" parameterType="java.lang.Integer >
  7. select * from emp where empno=#{empno}
  8. </select>

2、pojo类型

  1. //pojo类对象
  2. <select id="findEmpByName" parameterType="Po.Emp” >
  3. select * from emp where empno=#{empno}
  4. </select>
  5. //pojo包装类对象
  6. <select id="findEmpByName" parameterType="Po.EmpVo >
  7. select * from emp where otherMsg = #{Emp.otherMsg}
  8. </select>

3、hashMap对象

  1. <select id="findUserByHashmap" parameterType="map" resultType="user">
  2. select * from user where id=#{id} and username like '%${username}%'
  3. </select>
  4.  
  5. //构造查询条件Hashmap对象
  6. HashMap<String, Object> map = new HashMap<String, Object>();
  7. map.put("id", 1);
  8. map.put("username", "管理员");
  9.  
  10. //传递Hashmap对象查询用户列表
  11. List<User>list = userMapper.findUserByHashmap(map);

若传递的map中的key和sql中解析的key不一致。Eclipse不会报错,只是通过key获取值为空。

4、占位字符

(1)#{}占位符号

SQLl语句中【 #{} 】示一个占位符即【?】,通过#{}可以实现向preparedStatement中的预处理语句中设置占位符号,mybatis底层通过ognl从pojo中获取属性值,后再将输入变量id传到sql。

  1. <select id="findEmpById" parameterType="int" resultType="Emp">
  2. select * from emp where empno = #{对象.属性值}
  3. </select>

使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型、pojo、HashMap。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称;如果${}接收pojo对象值,通过【属性.对象属性】获取对象属性值。特别的:String、Array、类型打包器都获取属性值用value。

(2)拼接字符

【${}】表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换。${}可以接收简单类型值、pojo、HashMap。如果parameterType传输单个简单类型值,如果接收简单类型,${}括号中只能是value;如果${}接收pojo对象值,通过【属性.对象属性】获取对象属性值。

① 用于使用通配符进行模糊查找(可能会引起sql注入)

  1. <select id="selectEmpByName" parameterType="string" resultType="Emp">
  2. select * from emp where ename like '%${value}%'
  3. </select>
  4.  
  5. //如果使用占位符号则必须人为在传参数中加%,较为麻烦
  6. List<User> list = userMapper.selectUserByName("%管理员%");
  7.  
  8. //如果使用${}拼接符号则不用人为在参数中加%,建议使用
  9. List<User>list = userMapper.selectUserByName("管理员");
  1.  
  1. //如果输入的是 【OR 1=1 OR】,会返回表中的全部记录(SQL注入)
  1. //SQL语句为:select * from emp where ename like '%’ OR 1=1 OR '%’'

② 用于在SQL语句中拼接【列名 或 表名】

如果将列名通过参数传入sql,根据传的列名进行排序,应该使用拼接字符,使用#{}将无法实现此功能。

  1. //计算记录数,拼接表名
  2. <select id="findTableCount" parameterType ="java.lang.String" resultType="int">
  3. select count(*) from ${value}
  4. </select>
  5. //可以根据传入的表名,返回不同表中的记录数
  6. int i = sqlSession.selectOne("EmpDao.findTableCount", "dept");
  7.  
  8. //order by排序,拼接列名
  9. ORDER BY ${columnName}

二、ResultType

       使用resultType可以将查询结果映射为pojo类型,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

1、基本数据类型

  1. <select id="findEmpCount" resultType="int">
  2. select count(1) from emp
  3. </select>
  4. //原始Dao开发方式
  5. int i = sqlSession.selectOne("EmpDao.findEmpCount", null);
  6. //Mapper代理的方式
  7. int count = empMapper.findEmpCount(emp);

输出简单类型必须查询出来的结果集只有一条记录,最终将第一个字段的值转换为输出类型。

2、pojo类对象

  1. //输出pojo对象
  2. <select id="findUserById" parameterType="int" resultType="user">
  3. select * from user where id = #{id}
  4. </select>
  5.  
  6. //输出pojo列表
  7. <select id="findUserByUsername" parameterType="string" resultType="user">
  8. select * from user where username like '%${value}%'
  9. </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为字段值。

  1. <select id="findEmpById" parameterType="int" resultType="map">
  2. select * from emp where empno = #{empno}
  3. </select>
  4.  
  5. //查询记录
  6. HashMap<String, Object> emp = sqlSession.selectOne("EmpDao.findEmpById", 7369);
  7. //获取键值对
  8. System.out.println(""+emp.get("EMPNO")+ emp.get("ename"));

三、ResultMap结果集

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,但实质上还需要将查询结果映射到pojo对象中。

resultMap还可以实现将查询结果映射为复杂类型的pojo,完成高级输出结果映射。比如在查询结果映射对象中包括pojo和list实现关联查询。

  1. //定义ResultMap
  1. <resultMap type="po.Emp" id="empResultMap">
  2. <id column="empno" property="id"/>
  3. <result column="ename" property="name"/>
  4. </resultMap>
  1.  
  1. //引用ResultMap
  1. <select id="findEmpById" parameterType="int" resultType="empResultMap">
  2. select * from emp where empno = #{empno}
  3. </select

(1)定义resultMap的参数含义

type:resultMap最终映射的java对象类型的 全名 或 别名

id:对resultMap的唯一标识。

(2) 定义映射关系的参数含义

<id />:查询结果集的唯一标识。如果是多个字段为复合唯一约束则定义多个<id/>。

<result />:对普通名映射定义。

Column:表示sql查询出来的字段名 或 别名。

property:type指定的pojo类型中的属性名或 别名。

Mybatis笔记 – Po映射类型的更多相关文章

  1. mybatis中的映射类型

  2. MyBatis学习--高级映射

    简介 前面说过了简单的数据库查询和管理查询,在开发需求中有一些一对一.一对多和多对多的需求开发,如在开发购物车的时候,订单和用户是一对一,用户和订单是一对多,用户和商品是多对多.这些在Hibernat ...

  3. Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'orderdetails' of 'class com.luchao.mybatis.first.po.Orders' with value 'Orderdetail [id=null, ordersId=3, itemsId=1, it

    从上面异常的解释来看是因为反射不能将Orders设置到orderdetails属性上,仔细检查了MyBatis的配置文件,发现: <collection property="order ...

  4. mybatis笔记01

    目录 1. Mybatis的介绍 2. 使用JDBC编码的分析 2.1 准备 2.3 程序代码 2.4 JDBC问题 3. Mybatis架构 4. Mybatis入门程序 4.1 mybatis下载 ...

  5. Mybatis学习--XML映射配置文件

    学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/configuration.html MyBatis 的配置文件包含了影响 MyBat ...

  6. 第9章 MyBatis的关系映射

    在实际开发中,对数据库的操作通常涉及多张表,涉及了对象和对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系 9.1 关联关系概述 ...

  7. Mybatis笔记总结

    第一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...

  8. MyBatis笔记二:配置

    MyBatis笔记二:配置 1.全局配置 1.properites 这个配置主要是引入我们的 properites 配置文件的: <properties resource="db.pr ...

  9. MyBatis笔记一:GettingStart

    MyBatis笔记一:GettingStart 1.MyBatis优点 我们的工具和各种框架的作用就是为了我们操作数据库简洁,对于一些数据库的工具能帮我们少写一些处理异常等等的代码,但是他们并不是自动 ...

随机推荐

  1. Delphi ResourceString的用法

    在Delphi编程的那段“古老”的日子里(就是在版本4之前),在程序中使用字符串有两个基本的方法.你可以使用字符串将它们嵌入到源程序中,例如: MessageDlg( 'Leave your stin ...

  2. 分布式项目web.xml配置文件的表头

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  3. Python内置模块-time && datatime

    Python提供两种时间表示方式,一种是时间戳,从1970年1月1日 0时开始.一种是struct_time数组格式,共有9个元素. import time print(time.time()) #返 ...

  4. (转)微信,QQ这类IM app怎么做——谈谈Websocket

    转:http://www.cocoachina.com/ios/20160527/16482.html 前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕 ...

  5. QtConcurrent::run() 的使用

    QFuture<T>run(constClass *object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constA ...

  6. openSSL实现AES加密

    Openssl是很常见的C接口的库,个人觉得易用.以下是AES加密的使用备忘.如果你有一定的密码学基础,那么就很好理解.代码是从网上弄下来的(原始地址已经忘记了),然后在尝试的过程中改了一点东西.其它 ...

  7. C++——指针与数组

    1.数组名不是指针,神似指针(可以将数组名直接赋值给指针) (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组:(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针 ...

  8. 1. USB协议

    1.1 Packets USB总线上数据传输以包为基本单位,一个包含不同的域,但都要从同步域开始,然后跟踪一个包标识符PID(Packet Identifier),最终以包结束符EOP(End of ...

  9. 【Java多线程系列五】列表类

    一些列表类及其特性  类 线程安全 Iterator 特性 说明 Vector 是 fail-fast 内部方法用synchronized修饰,因此执行效率较低 1. 线程安全的列表类并不意味着调用它 ...

  10. JUC源码分析-集合篇(一)ConcurrentHashMap

    JUC源码分析-集合篇(一)ConcurrentHashMap 1. 概述 <HashMap 源码详细分析(JDK1.8)>:https://segmentfault.com/a/1190 ...