基础知识

mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType

1、 返回值是一个对象的集合,@resultType中只能写该对象的类型,而不是写List<T>

2、 输入参数可以用#{}和${}两种取值方法,两者区别与联系:

  1. 当传入类型为JDBC基本类型(8java基本类型+String)时,#{}里面可以写成任意值,${}里面必须写value
  2. 当传入类型为对象时,两种方式里面都应该写成类中属性名
  3. #{}方式传值会将传入的值当做一个字符串处理,会自动将其加入"",而${}方式则不会
  4. #{}方式能够有效防止SQL注入,而${}不会,因此能够用#{}就不要用${}
  5. ${}的适用场景是利用数据库中的字段动态排序等例如想要根据id排序
  6.   如果用#{}传入idSQL语句会变成order by "id"这样的SQL语句不能排序,
  7.   因此只能用${},对应的SQL语句是order by id符合要求

输入映射 - parameterType、parameterMap(已废弃)

parameterType

① 基本类型 - 当输入参数为JDBC基本类型,则可以直接用#{xxx}或者${value}取值

  1. <select id="selectUserById" parameterType="int" resultType="com.sikiedu.beans.User">
  2. SELECT * FROM user WHERE id = #{id}
  3. </select>

② 自定义对象 - 当输入参数为对象时,MyBatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo的属性名称

  1. <insert id="insertUser" parameterType="com.sikiedu.beans.User">
  2. INSERT INTO user VALUES(null,#{username},#{userpassword},#{balance},#{grgisterdate})
  3. </insert>
  4.  
  5. <update id="updateUser" parameterType="com.sikiedu.beans.User">
  6. UPDATE user SET username = #{username} WHERE id = #{id}
  7. </update>

③ 自定义包装类 - 开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件,这时可以使用包装对象传递输入参数。即一个pojo类的属性是另一个pojo类对象。

Vo包装类:

  1. package com.sikiedu.beans;
  2.  
  3. import java.util.List;
  4.  
  5. public class UserVo extends User {
  6. // 维护一个Role集合
  7. private List<Role> roleList;
  8.  
  9. public List<Role> getRole() {
  10. return roleList;
  11. }
  12.  
  13. public void setRole(List<Role> roleList) {
  14. this.roleList = roleList;
  15. }
  16.  
  17. @Override
  18. public String toString() {
  19. return "UserVo [ID=" + getId() + "\t username=" + getUsername() + "\t Grgisterdate=" + getGrgisterdate()
  20. + "\t role=" + roleList + "]";
  21. }
  22.  
  23. }

UserVo.java

UserMapper接口中定义方法:

  1. // 通过包装类UserVo查询用户
  2. public User selectUserByUserVoId(UserVo vo);

UserMapper.xml - sql语句

  1. <select id="selectUserByUserVoId" parameterType="com.sikiedu.beans.UserVo" resultType="user">
  2. SELECT * FROM user WHERE id = #{id}
  3. </select>

④ 键值对 / HashMap - 则#{key}即可取得该key对应的value

  1. <select id="queryStudentBystuageOrstuNameWithHashMap" parameterType="HashMap" resultType="student" >
  2. SELECT stuno,stuname,stuage FROM student
  3. WHERE stuage= #{stuAge} OR stuname LIKE '%${stuName}%'
  4. <select/>

输出映射 - resultType、resultMap

resultType

resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。

如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中

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

  1. <select id="selectUserCount" resultType="int">
  2. SELECT COUNT(*) FROM user
  3. </select>

② 自定义对象 - selectOne根据mapper接口的返回值类型选择

  1. <select id="selectUserById" parameterType="Integer" resultType="com.sikiedu.beans.User">
  2. SELECT * FROM user WHERE id = #{id}
  3. </select>

③ 集合 - selectList根据mapper接口的返回值类型选择

  1. <select id="selectAllUser" resultType="user">
  2. SELECT * FROM user
  3. </select> 

resultMap:

ResultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

  1. resultMap
      - id:设置ResultMapid
      - type:指resultMap要映射成的数据类型(返回结果映射的pojo,可以使用别名)。
  2. id:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个< id />(复合主键时多个)。
  3. result:普通列使用result标签映射。
  4.   - property:表示POJO类的属性。
  5.   - column:表示sql查询出来的字段名(列名)。
    association:实体类中将另一个类作为属性association,一对一关系
    collection:实体类中将另一个类的list作为属性,一对多关系
    columnproperty放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。

① bean对象字段与数据表字段不匹配

  1. 例如数据库role表中属性为 idrole int(11),name varchar(45)。
  2. 对应的实体类属性为 Integer id,String name,若直接查询select * from role会报错。
  3. 这时就可以使用resultMap属性
  1. <!-- 配置resultMap标签,映射不同的字段和属性名 -->
    <resultMap type="Role" id="roleRM">
  2. <id property="id" column="idrole" />
  3. </resultMap>
  4. <select id="selectAllRole" resultMap="roleRM">
  5. SELECT * FROM role
  6. </select>

② 自定义包装类:

RoleVo包装类:在RoleVo包装类中添加User属性。(一个角色每个用户只能拥有一个)

User是一个引用类型,用于存储关联查询的用户信息,因为关联关系是一对一,所以只需要添加单个属性即可

  1. package com.sikiedu.beans;
  2.  
  3. import java.util.List;
  4.  
  5. public class RoleVo extends Role {
  6.  
  7. private User user;
  8. private List<Integer> idList;
  9.  
  10. public User getUser() {
  11. return user;
  12. }
  13.  
  14. public void setUser(User user) {
  15. this.user = user;
  16. }
  17.  
  18. public List<Integer> getList() {
  19. return idList;
  20. }
  21.  
  22. public void setList(List<Integer> idList) {
  23. this.idList = idList;
  24. }
  25.  
  26. @Override
  27. public String toString() {
  28. return "RoleVo [ID=" + getId() + "\t name=" + getName() + "\t roletype=" + getRoletype() + "\t user=" + user
  29. + "]";
  30. }
  31.  
  32. }

RoleVo.java

配置Mapper.xml配置文件:先使用id和result属性,映射role类的结果集,然后在使用association映射关联对象User的结果集

  1. <resultMap type="RoleVo" id="roleVo">
  2. <id property="id" column="idrole" />
  3. <result property="name" column="name" />
  4. <result property="level" column="level" />
  5. <result property="roletype" column="roletype" />
  6. <!-- 一对一关系 -->
  7. <association property="user" javaType="User">
  8. <id property="id" column="id" />
  9. <result property="username" column="username" />
  10. </association>
  11. </resultMap>
  12. <!-- 一对一关联查询 -->
  13. <select id="selectAllRoleVo" resultMap="roleVo">
  14. SELECT
  15. r.idrole,
  16. r.name,
  17. r.level,
  18. r.roletype,
  19. u.id,
  20. u.username
  21. FROM role r
  22. LEFT JOIN user u
  23. ON r.idrole = u.id
  24. </select>

关联查询

UserVo包装类:在Vo类添加角色集合属性

  1. package com.sikiedu.beans;
  2.  
  3. import java.util.List;
  4.  
  5. public class UserVo extends User {
  6. // 维护一个Role集合
  7. private List<Role> roleList;
  8.  
  9. public List<Role> getRole() {
  10. return roleList;
  11. }
  12.  
  13. public void setRole(List<Role> roleList) {
  14. this.roleList = roleList;
  15. }
  16.  
  17. @Override
  18. public String toString() {
  19. return "UserVo [ID=" + getId() + "\t username=" + getUsername() + "\t Grgisterdate=" + getGrgisterdate()
  20. + "\t role=" + roleList + "]";
  21. }
  22.  
  23. }

UserVo.java

配置Mapper.xml配置文件:先使用id和result配置映射User类的结果,然后使用一对多关系的collection标签配置Role结果

  1. <resultMap type="UserVo" id="userVo">
  2. <id property="id" column="id" />
  3. <result property="username" column="username" />
  4. <result property="grgisterdate" column="grgisterdate" />
  5. <!-- 一对多关系 -->
  6. <collection property="roleList" ofType="Role">
  7. <id property="id" column="idrole" />
  8. <result property="name" column="name" />
  9. <result property="roletype" column="roletype" />
  10. </collection>
  11. </resultMap>
  12. <!-- 一对多关联查询 -->
  13. <select id="selectAllUserVo" resultMap="userVo">
  14. SELECT
  15. u.id,
  16. u.username,
  17. u.grgisterdate,
  18. r.idrole,
  19. r.name,
  20. r.roletype
  21. FROM user u
  22. LEFT JOIN role r
  23. ON u.id = r.userid
  24. </select>

MyBatis - 输入和输出参数的更多相关文章

  1. mybatis入门系列二之输入与输出参数

    mybatis入门系列二之详解输入与输出参数   基础知识   mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...

  2. JavaWeb_(Mybatis框架)输入和输出参数_五

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  3. BackgroundWorker 的输入、输出参数、进度条与文字刷新、取消机制、返回事件

    1. 定义全局变量 BackgroundWorker backgroundwoker; 2. 点击开始按钮或其它时机初始化 backgroundwoker = new BackgroundWorker ...

  4. mybatis 输入、输出映射

    一.输入映射 mapper.xml的参数只有一个.可以传参数,基本简单类型,hashmap和javabean (一).Javabean的方法. 需求:通过小说名和作者模糊找书. 1.定义Javabea ...

  5. Mybatis输入和输出映射(#{}和${}的区别)

    #{}占位符                                                                                              ...

  6. Mybatis输入和输出映射(parameterType和resultType的区别)

    parameterType                                                                             resultType ...

  7. asp.net 存储过程 输出参数 取不到值

    这是MSDN上的明确解释:当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure.当 CommandType 为 ...

  8. Mybatis框架四:输入参数、输出参数

    输入参数可以有三种:简单类型,POJO,包装类 关于前两种: http://www.cnblogs.com/xuyiqing/p/8600888.html 这里写一下传递包装类参数: 一个POJO:U ...

  9. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

随机推荐

  1. nodejs http ejs

    // ejs-demo.jsvar http = require('http'); var ejs = require('ejs'); var url = require('url'); // 搭建 ...

  2. vba增删改查数据库

    你在EXCEL中增加一个列名为ID,后在VBA中写以下代码,并引用Microsoft ActiveX Data Objects 2.8后执行Public Sub 写入SQL2008()Dim cnn ...

  3. Theorem、Proposition、Lemma和Corollary等的解释与区别

    Theorem:定理.是文章中重要的数学化的论述,一般有严格的数学证明. Proposition:可以翻译为命题,经过证明且interesting,但没有Theorem重要,比较常用. Lemma:一 ...

  4. split的用法

    split用法返回的是数组 使用split('')根据空格返回数组 使用split()返回一个完整的数组 使用split("",3)返回前三项,是单个的字母 不过要注意: 使用sp ...

  5. PHP算法之两数相加

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  6. wpf datagrid 如何自定义行的控件实例,(textbox 并选中则全选)

    主要是为了用户输入方便 按回车,选中下一列,text自动获取焦点,输入状态 获取控件实例  https://blog.csdn.net/m15188153014/article/details/486 ...

  7. PouchContainer 开源版本及内部版本一致性实践

    PouchContainer 开源版本及内部版本一致性实践 为什么要做内外版本一致 对外开源是提升影响力.共建生态的有力手段.在项目对外开源的过程中,首先是将可以开源的部分抽离出来,发布一个“开源版本 ...

  8. php抓取远程数据显示在下拉列表中

    前言:周五10月20日的时候,经理让做一个插件,使用的thinkphp做这个demo 使用CURL抓取远程数据时如果出现乱码问题可以加入 header("content-type:text/ ...

  9. luoguP1890 gcd区间 [st表][gcd]

    题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...

  10. bfs+dfs乱搞+类似拓扑排序——cf1182D

    代码不知道上了多少补丁..终于过了 用类似拓扑排序的办法收缩整棵树得到x,然后找到x直连的最远的和最近的点 只有这三个点可能是根,依次判一下即可 另外题解的第一种方法时找直径,然后判两端点+重心+所有 ...