MyBatis - 输入和输出参数

基础知识

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

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

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

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

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

parameterType

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

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

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

<insert id="insertUser" parameterType="com.sikiedu.beans.User">
    INSERT INTO user VALUES(null,#{username},#{userpassword},#{balance},#{grgisterdate})
</insert>

<update id="updateUser" parameterType="com.sikiedu.beans.User">
    UPDATE user SET username = #{username} WHERE id = #{id}
</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接口中定义方法:

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

UserMapper.xml - sql语句

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

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

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

输出映射 - resultType、resultMap

resultType

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

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

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

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

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

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

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

<select id="selectAllUser" resultType="user">
    SELECT  * FROM user
</select> 

resultMap:

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

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

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

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

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

<resultMap type="RoleVo" id="roleVo">
    <id property="id" column="idrole" />
    <result property="name" column="name" />
    <result property="level" column="level" />
    <result property="roletype" column="roletype" />
    <!-- 一对一关系 -->
    <association property="user" javaType="User">
        <id property="id" column="id" />
        <result property="username" column="username" />
    </association>
</resultMap>
<!-- 一对一关联查询 -->
<select id="selectAllRoleVo" resultMap="roleVo">
    SELECT
    r.idrole,
    r.name,
    r.level,
    r.roletype,
    u.id,
    u.username
    FROM role r
    LEFT JOIN user u
    ON r.idrole = u.id
</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结果

<resultMap type="UserVo" id="userVo">
    <id property="id" column="id" />
    <result property="username" column="username" />
    <result property="grgisterdate" column="grgisterdate" />
    <!-- 一对多关系 -->
    <collection property="roleList" ofType="Role">
        <id property="id" column="idrole" />
        <result property="name" column="name" />
        <result property="roletype" column="roletype" />
    </collection>
</resultMap>
<!-- 一对多关联查询 -->
<select id="selectAllUserVo" resultMap="userVo">
    SELECT
    u.id,
    u.username,
    u.grgisterdate,
    r.idrole,
    r.name,
    r.roletype
    FROM user u
    LEFT JOIN role r
    ON u.id = r.userid
</select>

原文地址:https://www.cnblogs.com/Dm920/p/12049482.html

时间: 2024-08-11 10:31:07

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

mybatis 输入、输出映射

一.输入映射 mapper.xml的参数只有一个.可以传参数,基本简单类型,hashmap和javabean (一).Javabean的方法. 需求:通过小说名和作者模糊找书. 1.定义Javabean class  NovelCustom  extends Novel 继承了Novel.一个可以通过什么属性来查询.二.可以在里面加属性.如加上章节名来查询.(表tb_chacter和类Chacter,表中tb_novel_id外键), 或者,将Novel注入到NovelCustom.//priv

asp.net调用带有输入和输出参数的存储过程

存储过程检测用户名是否重户 create proc checklogin@username nchar(20),@pwd nchar(20),@hasrow int outputasselect @hasrow=count(*) from users where and GO存储过程写入数据create proc adduser@username nchar(20),@pwd nchar(20)asbegininsert into users (username,pwd)values(@user

Hibernate调用带有输入参数,输出参数为cursor的存储过程

一.Oracle创建表及存储过程 1.创建表T_MONITOR_DEVICE 创建后的表结构 2.创建存储过程 create or replace procedure ProcTestNew(v_monitordeviceid in number,curdata out sys_refcursor ) As begin open curdata for select ID, IP,PORT from T_MONITOR_DEVICE where id=v_monitordeviceid;--带参

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

CString中Format函数与格式输入与输出

CString中Format函数与格式输入与输出 Format是一个很常用,却又似乎很烦的方法,以下是它的完整概貌,以供大家查询之用: 格式化字符串forma("%d",12)意思是将一个整形的格式化的字符(我认为是保持其形状不变) 1).格式说明总是以%字符开始,以下是不同类型数据的格式方式%号后的说明: d输出带符号十进制数 o输出无符号八进制数 x输出无符号十六进制数 u输出无符号数 c输出单个字符 s输出一串字符 f输出实数(6位小数) e以指数形式输出实数 g选用f与e格式中

C++ Primer Plus 第17章 输入,输出和文件

第17章 输入.输出和文件 1.当到达输入语句时,他将刷新输出缓冲区中当前所有的输出 2.streambuf类 提供了对缓冲区的各种操作 ios_base类表示流的一般特征 ios类基于ios_base,包含了一个指向streambuf对象的指针 ostream类从ios派生,提供可输出方法 istream类从ios派生,提供可输入方法 iostream类基于ostream和istream,继承了输入和输出方法 3.包含iostream则自动创建了8个流对象 cin 标准输入 wcin 宽字符流

Java代码之输出参数和(强制类型转换)

说明(因为Java中java Application的参数都是默认的字符型的数据,所以需要强制类型转换这一步骤) 设计思想: 向系统里输入若干个参数,计算出参数个数,利用for语句计算出参数的和.(程序中需要进行强制类型转换,因为java Application中的数据是字符型的,不能进行运算),最后输出参数的和 流程图: 程序源代码: package demo; public class CommandParameter { /** * @param args */ public static

C++:文件的输入和输出

1.共同的打开文件方式: fin.open("test.txt",ios::binary) fout.open("test.txt",ios::binary) fboth.open("test.txt",ios::in|ios::out|ios::binary) 或者 fistream fin("test.txt",ios::binary) fostream fout("test.txt",ios::bin

文件的输入和输出

文件的输入和输出 1.程序写入文件 ,应遵循以下规则(1)创建一个ofstream对象来管理输出流(2)将对象和输出流关联起来(3)以使用cout的方式来使用该对象.例如: ofstream fout ; //创建对象 fout.open(“jar.txt”) ; //关联文件 注意: Ofstream fout (“jar.txt”) ;//跟上面的两条语句是等效的那么关于第三点:使用cout的方式来使用该对象,比如: fout << “ I love you !”; 原因:fout对象的类